Loading... <p><span style="text-decoration:line-through">Edit</span></p> <p style="margin-top: 0px;margin-bottom: 1.1em"></p> <h1 style="font-size: 2.6em;margin: 21px 0px 10.5px;font-family: inherit;color: inherit">Ansible Playbook Roles 和 Include 声明</h1> <ul class=" list-paddingleft-2"> <li> <p>Ansible Playbook Roles 和 Include 声明</p> </li> <li> <p></p> </li> <ul class=" list-paddingleft-2"> <li> <p>1. Introduction</p> </li> <li> <p>2. Task Include Files And Encouraging Reuse</p> </li> <li> <p>3. Roles</p> </li> <li> <p>4. Role Default Variables</p> </li> <li> <p>5. Role Dependencies</p> </li> <li> <p>6. Embedding Modules In Roles</p> </li> <li> <p>7. Ansible Galaxy</p> </li> </ul> </ul> <h2 style="font-family: inherit;color: inherit;font-size: 2.15em;margin: 1.2em 0px 0.6em">1. Introduction</h2> <p style="margin-top: 0px;margin-bottom: 1.1em">工作中我们有可能会写一个很长的playbook,最后发现playbook中很多功能是可以复用。</p> <p style="margin-top: 0px;margin-bottom: 1.1em">客观来讲,<code>include</code>允许我们把playbook写成很多小文件,然后通过一定的策略include组织在一起,提高利用性。<code>task</code>可以使用<code>include</code>, <code>handlers</code>同样也属于<code>task</code>,所以<code>handlers</code>也可以使用<code>include</code></p> <p style="margin-top: 0px;margin-bottom: 1.1em">playbook同样也可以被<code>include</code>.当你有这方面的考虑时,你已经不再止步于普通应用者,如何更好的使和组织架构是你更高的追求。这期间我们要有<code>封装</code>的思想,所谓的<code>封装</code>,你可以简单的理解为”我们会开汽车但必需要发动机如何工作“</p> <p style="margin-top: 0px;margin-bottom: 1.1em"><code>roles</code>的概念在Ansible中比较抽象,不太形象有比喻可以理解为 <code>class</code> 类。<code>roles</code>具备<code>include</code>的功能,将比较长的playbook功能分拆通过include的将增加代码复用性。<code>roles</code>站在更高一层看问题,其基于 <code>include</code>, <code>playbook</code>之上把整合的更为干净,复用性更高。</p> <p style="margin-top: 0px;margin-bottom: 1.1em">我们首先要理解 roles, 因为 roles 功能是如此强大,以至于我们在用到playbook功能后,一定会使用到roles功能。</p> <h2 style="font-family: inherit;color: inherit;font-size: 2.15em;margin: 1.2em 0px 0.6em">2. Task Include Files And Encouraging Reuse</h2> <p style="margin-top: 0px;margin-bottom: 1.1em"><code>include</code>可以上我们有效提高代码复用性,请参考如下案例。</p> <p style="margin-top: 0px;margin-bottom: 1.1em">tasks/foo.yml</p> <pre><code>---<br /># possibly saved as tasks/foo.yml<br /><br />- <span style="color: #f92672">name:</span> placeholder foo<br /> command: /bin/foo<br /><br />- <span style="color: #f92672">name:</span> placeholder bar<br /> command: /bin/bar<br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em">如果我们希望在task中引用,如下方式可实现:</p> <pre><code><span style="color: #e6db74">tasks:</span><br /><br /> - <span style="color: #e6db74">include:</span> tasks/foo.yml<br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em"><strong>Include支持变量引用,我们称之为<code>parameterized include</code></strong>。举个例子,如果分发多个 wordpress 实例,我可以将 wordpress 任务排版到一个 wordprss.yml 文件,通过变量传参实现。</p> <pre><code>tasks:<br /> - include: wordpress.yml wp_user=timmy<br /> - include: wordpress.yml wp_user=alice<br /> - include: wordpress.yml wp_user=bob<br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em">从1.0版本开始,ansible 同样也支持如下格式的传参:</p> <pre><code>tasks:<br /><br /> - <span style="color: #f92672">include:</span> wordpress.yml<br /> vars:<br /> wp_user: timmy<br /> ssh_keys:<br /> - keys/one.txt<br /> - keys/two.txt<br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em">变量的引用方式如下:</p> <pre><code>{{ wp_user }}<br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em">如前面所介绍<code>includes</code>同时适用于 <code>handlers</code>。比如,我们定义了如何重启 apache, 但希望所有 playbook 执行前只执行一次,那么我们可以使用如下的方式进行,定义 handlers.yml:</p> <pre><code>---<br /><span style="color: #75715e"># this might be in a file like handlers/handlers.yml</span><br />- name: restart apache<br /> service: name=apache <span style="color: #f92672">state</span>=restarted<br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em">然后在playbook中引用</p> <pre><code><span style="color: #e6db74">handlers:</span><br /> - <span style="color: #e6db74">include:</span> handlers/handlers.yml<br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em">include 也支持从一个playbook 导入到另外一个 playbook,同时支持层级定义。如下例:</p> <pre><code>- name: this is a play <span style="color: #f92672">at</span> the top level of a <span style="color: #e6db74">file</span><br /> hosts: all<br /> remote_user: root<br /><br /> tasks:<br /><br /> - name: say hi<br /> tags: foo<br /> <span style="color: #e6db74">shell</span>: echo <span style="color: #e6db74">"hi..."</span><br /><br />- <span style="color: #e6db74">include</span>: load_balancers.yml<br />- <span style="color: #e6db74">include</span>: webservers.yml<br />- <span style="color: #e6db74">include</span>: dbservers.yml<br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em">这里需要留意的是,include时变量不随之生效</p> <h2 style="font-family: inherit;color: inherit;font-size: 2.15em;margin: 1.2em 0px 0.6em">3. Roles</h2> <p style="margin-top: 0px;margin-bottom: 1.1em">组织playbook的最好办法是什么? 使用 roles!。 roles 可以有效的把 vars_files, tasks, handlers组织起来,按角色分组可以非常容易的和其它用户分享。rles 只是自动化 <code>include</code> 如上的这些指令,其本身并没有魔法效果,不管如此,这是一项大工程。因为我们要合理的规划其目录结构。</p> <pre><code>site.yml<br />webservers.yml<br />fooservers.yml<br />roles/<br /> common/<br /> files/<br /> templates/<br /> tasks/<br /> handlers/<br /> vars/<br /> defaults/<br /> meta/<br /> webservers/<br /> files/<br /> templates/<br /> tasks/<br /> handlers/<br /> vars/<br /> defaults/<br /> meta/<br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em">写到playbook中,它长成这个样子:</p> <pre><code>---<br />- <span style="color: #f92672">hosts:</span> webservers<br /> roles:<br /> - common<br /> - webservers<br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em">其中每项均有其功能介绍:</p> <ul style="margin-bottom: 1.1em" class=" list-paddingleft-2"> <li> <p>roles/x/tasks/main.yml<br />主函数,包括在其中的所有任务将被执行</p> </li> <li> <p>roles/x/handlers/main.yml<br />所有包括中其中的 handlers 将被执行</p> </li> <li> <p>roles/x/vars/main.yml<br />所有包括在其中的变量将在roles中生效</p> </li> <li> <p>roles/x/meta/main.yml<br />roles所有依赖将被正常登入</p> </li> <li> <p>roles/x/{files,templates,tasks}/ (dir depends on task)<br />所有文件,模板都将可存放在这里,放在这里最大的好处是不用指定绝对路径</p> </li> </ul> <pre><code>---<br /><br />- <span style="color: #f92672">hosts:</span> webservers<br /> roles:<br /> - common<br /> - { <span style="color: #f92672">role:</span> foo_app_instance, <span style="color: #f92672">dir:</span> <span style="color: #e6db74">'/opt/a'</span>, <span style="color: #f92672">app_port:</span> <span style="color: #ae81ff">5000</span> }<br /> - { <span style="color: #f92672">role:</span> foo_app_instance, <span style="color: #f92672">dir:</span> <span style="color: #e6db74">'/opt/b'</span>, <span style="color: #f92672">app_port:</span> <span style="color: #ae81ff">5001</span> }<br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em">也可以加入一定的条件:</p> <pre><code>---<br /><br />- <span style="color: #f92672">hosts:</span> webservers<br /> roles:<br /> - { <span style="color: #f92672">role:</span> some_role, <span style="color: #f92672">when:</span> <span style="color: #e6db74">"ansible_os_family == 'RedHat'"</span> }<br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em">同时,我们有可能希望为我们的角色分配 tags, tags的功能是我使用 ansible 下来体验最为深刻的功能,没有之一,实在是太灵活方便了。在考虑组织严密的同时,又不忘其灵活性。</p> <pre><code>---<br /><br />- <span style="color: #f92672">hosts:</span> webservers<br /> roles:<br /> - { <span style="color: #f92672">role:</span> foo, <span style="color: #f92672">tags:</span> [<span style="color: #e6db74">"bar"</span>, <span style="color: #e6db74">"baz"</span>] }<br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em">虽说tags 是好东西,但如果你发现你制订的<code>roles</code>中具有很多tags而且经常性的会被使用,则要考虑下再次切分roles为多个roles.</p> <p style="margin-top: 0px;margin-bottom: 1.1em">同时,在一个playbook中我们可以定义多层级的任务。如下案例:</p> <pre><code>---<br /><br />- <span style="color: #f92672">hosts:</span> webservers<br /><br /> pre_tasks:<br /> - <span style="color: #f92672">shell:</span> echo <span style="color: #e6db74">'hello'</span><br /><br /> roles:<br /> - { <span style="color: #f92672">role:</span> some_role }<br /><br /> tasks:<br /> - <span style="color: #f92672">shell:</span> echo <span style="color: #e6db74">'still busy'</span><br /><br /> post_tasks:<br /> - <span style="color: #f92672">shell:</span> echo <span style="color: #e6db74">'goodbye'</span><br /></code></pre> <h2 style="font-family: inherit;color: inherit;font-size: 2.15em;margin: 1.2em 0px 0.6em">4. Role Default Variables</h2> <p style="margin-top: 0px;margin-bottom: 1.1em"><code>defaults/main.yml</code> 定义最低优化级的 roles 变量,我们可以通过很多其它方式定义的变量,均会覆盖这里的变量值</p> <h2 style="font-family: inherit;color: inherit;font-size: 2.15em;margin: 1.2em 0px 0.6em">5. Role Dependencies</h2> <p style="margin-top: 0px;margin-bottom: 1.1em"><code>meta/mainl.yml</code>默认定义role的依赖,</p> <pre><code><span style="color: #f92672">---</span><br /><span style="color: #f92672">dependencies</span>:<br /> <span style="color: #f92672">-</span> { <span style="color: #66d9ef">role</span>: common, some_parameter: <span style="color: #ae81ff">3</span> }<br /> <span style="color: #f92672">-</span> { <span style="color: #66d9ef">role</span>: apache, appache_port: <span style="color: #ae81ff">80</span> }<br /> <span style="color: #f92672">-</span> { <span style="color: #66d9ef">role</span>: postgres, dbname: blarg, other_parameter: <span style="color: #ae81ff">12</span> }<br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em">Role 依赖也可以是全路径,如:</p> <pre><code><span style="color: #f92672">---</span><br /><span style="color: #f92672">dependencies</span>:<br /> <span style="color: #f92672">-</span> { <span style="color: #66d9ef">role</span>: <span style="color: #e6db74">'/path/to/common/roles/foo'</span>, x: <span style="color: #ae81ff">1</span> }<br /></code></pre> <p style="margin-top: 0px;margin-bottom: 1.1em">Roles dependencies 总是在roles最开始的时候执行,而且默认只执行一次,即使其它其它roles重复引用。<br />通过设置 meta/main.yml 中 allow_duplicates: yes 可以多次执行。如下例:</p> <pre><code><span style="color: #f92672">---</span><br /><span style="color: #f92672">dependencies</span>:<br /><span style="color: #f92672">-</span> { <span style="color: #66d9ef">role</span>: wheel, n: <span style="color: #ae81ff">1</span> }<br /><span style="color: #f92672">-</span> { <span style="color: #66d9ef">role</span>: wheel, n: <span style="color: #ae81ff">2</span> }<br /><span style="color: #f92672">-</span> { <span style="color: #66d9ef">role</span>: wheel, n: <span style="color: #ae81ff">3</span> }<br /><span style="color: #f92672">-</span> { <span style="color: #66d9ef">role</span>: wheel, n: <span style="color: #ae81ff">4</span> }<br /></code></pre> <pre><code><span style="color: #f92672">---</span><br /><span style="color: #f92672">allow_duplicates</span>: <span style="color: #f92672">yes</span><br /><span style="color: #f92672">dependencies</span>:<br /><span style="color: #f92672">-</span> { <span style="color: #66d9ef">role</span>: tire }<br /><span style="color: #f92672">-</span> { <span style="color: #66d9ef">role</span>: brake }<br /></code></pre> <h2 style="font-family: inherit;color: inherit;font-size: 2.15em;margin: 1.2em 0px 0.6em">6. Embedding Modules In Roles</h2> <p style="margin-top: 0px;margin-bottom: 1.1em">这个高级话题和大部分用户无关,这里暂不做介绍</p> <h2 style="font-family: inherit;color: inherit;font-size: 2.15em;margin: 1.2em 0px 0.6em">7. Ansible Galaxy</h2> <p>@%28%u6280%u672F%u6587%u6863%u5B66%u4E60%29%5B%u6280%u672F%7Cansible%5D%0A%0A%0AAnsible%20Playbook%20Roles%20%u548C%20Include%20%u58F0%u660E%0A%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0A%5BTOC%5D%0A%0A%0A%23%23%201.%20Introduction%0A%u5DE5%u4F5C%u4E2D%u6211%u4EEC%u6709%u53EF%u80FD%u4F1A%u5199%u4E00%u4E2A%u5F88%u957F%u7684playbook%uFF0C%u6700%u540E%u53D1%u73B0playbook%u4E2D%u5F88%u591A%u529F%u80FD%u662F%u53EF%u4EE5%u590D%u7528%u3002%0A%0A%u5BA2%u89C2%u6765%u8BB2%uFF0C%60include%60%u5141%u8BB8%u6211%u4EEC%u628Aplaybook%u5199%u6210%u5F88%u591A%u5C0F%u6587%u4EF6%uFF0C%u7136%u540E%u901A%u8FC7%u4E00%u5B9A%u7684%u7B56%u7565include%u7EC4%u7EC7%u5728%u4E00%u8D77%uFF0C%u63D0%u9AD8%u5229%u7528%u6027%u3002%60task%60%u53EF%u4EE5%u4F7F%u7528%60include%60%2C%20%60handlers%60%u540C%u6837%u4E5F%u5C5E%u4E8E%60task%60%uFF0C%u6240%u4EE5%60handlers%60%u4E5F%u53EF%u4EE5%u4F7F%u7528%60include%60%0A%0Aplaybook%u540C%u6837%u4E5F%u53EF%u4EE5%u88AB%60include%60.%u5F53%u4F60%u6709%u8FD9%u65B9%u9762%u7684%u8003%u8651%u65F6%uFF0C%u4F60%u5DF2%u7ECF%u4E0D%u518D%u6B62%u6B65%u4E8E%u666E%u901A%u5E94%u7528%u8005%uFF0C%u5982%u4F55%u66F4%u597D%u7684%u4F7F%u548C%u7EC4%u7EC7%u67B6%u6784%u662F%u4F60%u66F4%u9AD8%u7684%u8FFD%u6C42%u3002%u8FD9%u671F%u95F4%u6211%u4EEC%u8981%u6709%60%u5C01%u88C5%60%u7684%u601D%u60F3%uFF0C%u6240%u8C13%u7684%60%u5C01%u88C5%60%uFF0C%u4F60%u53EF%u4EE5%u7B80%u5355%u7684%u7406%u89E3%u4E3A%u201D%u6211%u4EEC%u4F1A%u5F00%u6C7D%u8F66%u4F46%u5FC5%u9700%u8981%u53D1%u52A8%u673A%u5982%u4F55%u5DE5%u4F5C%u201C%0A%0A%60roles%60%u7684%u6982%u5FF5%u5728Ansible%u4E2D%u6BD4%u8F83%u62BD%u8C61%uFF0C%u4E0D%u592A%u5F62%u8C61%u6709%u6BD4%u55BB%u53EF%u4EE5%u7406%u89E3%u4E3A%20%60class%60%20%u7C7B%u3002%60roles%60%u5177%u5907%60include%60%u7684%u529F%u80FD%uFF0C%u5C06%u6BD4%u8F83%u957F%u7684playbook%u529F%u80FD%u5206%u62C6%u901A%u8FC7include%u7684%u5C06%u589E%u52A0%u4EE3%u7801%u590D%u7528%u6027%u3002%60roles%60%u7AD9%u5728%u66F4%u9AD8%u4E00%u5C42%u770B%u95EE%u9898%uFF0C%u5176%u57FA%u4E8E%20%60include%60%2C%20%60playbook%60%u4E4B%u4E0A%u628A%u6574%u5408%u7684%u66F4%u4E3A%u5E72%u51C0%uFF0C%u590D%u7528%u6027%u66F4%u9AD8%u3002%0A%0A%u6211%u4EEC%u9996%u5148%u8981%u7406%u89E3%20roles%2C%20%u56E0%u4E3A%20roles%20%u529F%u80FD%u662F%u5982%u6B64%u5F3A%u5927%uFF0C%u4EE5%u81F3%u4E8E%u6211%u4EEC%u5728%u7528%u5230playbook%u529F%u80FD%u540E%uFF0C%u4E00%u5B9A%u4F1A%u4F7F%u7528%u5230roles%u529F%u80FD%u3002%0A%0A%23%23%202.%20Task%20Include%20Files%20And%20Encouraging%20Reuse%0A%0A%60include%60%u53EF%u4EE5%u4E0A%u6211%u4EEC%u6709%u6548%u63D0%u9AD8%u4EE3%u7801%u590D%u7528%u6027%uFF0C%u8BF7%u53C2%u8003%u5982%u4E0B%u6848%u4F8B%u3002%0A%0Atasks/foo.yml%0A%0A%60%60%60%0A—%0A%23%20possibly%20saved%20as%20tasks/foo.yml%0A%0A-%20name%3A%20placeholder%20foo%0A%20%20command%3A%20/bin/foo%0A%0A-%20name%3A%20placeholder%20bar%0A%20%20command%3A%20/bin/bar%0A%60%60%60%0A%0A%u5982%u679C%u6211%u4EEC%u5E0C%u671B%u5728task%u4E2D%u5F15%u7528%uFF0C%u5982%u4E0B%u65B9%u5F0F%u53EF%u5B9E%u73B0%uFF1A%0A%0A%60%60%60%0Atasks%3A%0A%0A%20%20-%20include%3A%20tasks/foo.yml%0A%60%60%60%0A%0A**Include%u652F%u6301%u53D8%u91CF%u5F15%u7528%uFF0C%u6211%u4EEC%u79F0%u4E4B%u4E3A%60parameterized%20include%60**%u3002%u4E3E%u4E2A%u4F8B%u5B50%uFF0C%u5982%u679C%u5206%u53D1%u591A%u4E2A%20wordpress%20%u5B9E%u4F8B%uFF0C%u6211%u53EF%u4EE5%u5C06%20wordpress%20%u4EFB%u52A1%u6392%u7248%u5230%u4E00%u4E2A%20wordprss.yml%20%u6587%u4EF6%uFF0C%u901A%u8FC7%u53D8%u91CF%u4F20%u53C2%u5B9E%u73B0%u3002%0A%0A%60%60%60%0Atasks%3A%0A%20%20-%20include%3A%20wordpress.yml%20wp_user%3Dtimmy%0A%20%20-%20include%3A%20wordpress.yml%20wp_user%3Dalice%0A%20%20-%20include%3A%20wordpress.yml%20wp_user%3Dbob%0A%60%60%60%0A%0A%u4ECE1.0%u7248%u672C%u5F00%u59CB%uFF0Cansible%20%u540C%u6837%u4E5F%u652F%u6301%u5982%u4E0B%u683C%u5F0F%u7684%u4F20%u53C2%uFF1A%0A%0A%60%60%60%0Atasks%3A%0A%0A%20%20-%20include%3A%20wordpress.yml%0A%20%20%20%20vars%3A%0A%20%20%20%20%20%20%20%20wp_user%3A%20timmy%0A%20%20%20%20%20%20%20%20ssh_keys%3A%0A%20%20%20%20%20%20%20%20%20%20-%20keys/one.txt%0A%20%20%20%20%20%20%20%20%20%20-%20keys/two.txt%0A%60%60%60%0A%0A%u53D8%u91CF%u7684%u5F15%u7528%u65B9%u5F0F%u5982%u4E0B%uFF1A%0A%0A%20%20%20%20%7B%7B%20wp_user%20%7D%7D%0A%0A%0A%u5982%u524D%u9762%u6240%u4ECB%u7ECD%60includes%60%u540C%u65F6%u9002%u7528%u4E8E%20%60handlers%60%u3002%u6BD4%u5982%uFF0C%u6211%u4EEC%u5B9A%u4E49%u4E86%u5982%u4F55%u91CD%u542F%20apache%2C%20%u4F46%u5E0C%u671B%u6240%u6709%20playbook%20%u6267%u884C%u524D%u53EA%u6267%u884C%u4E00%u6B21%uFF0C%u90A3%u4E48%u6211%u4EEC%u53EF%u4EE5%u4F7F%u7528%u5982%u4E0B%u7684%u65B9%u5F0F%u8FDB%u884C%uFF0C%u5B9A%u4E49%20handlers.yml%3A%0A%0A%60%60%60%0A—%0A%23%20this%20might%20be%20in%20a%20file%20like%20handlers/handlers.yml%0A-%20name%3A%20restart%20apache%0A%20%20service%3A%20name%3Dapache%20state%3Drestarted%0A%60%60%60%0A%0A%u7136%u540E%u5728playbook%u4E2D%u5F15%u7528%20%0A%0A%60%60%60%0Ahandlers%3A%0A%20%20-%20include%3A%20handlers/handlers.yml%0A%60%60%60%0A%0Ainclude%20%u4E5F%u652F%u6301%u4ECE%u4E00%u4E2Aplaybook%20%u5BFC%u5165%u5230%u53E6%u5916%u4E00%u4E2A%20playbook%2C%u540C%u65F6%u652F%u6301%u5C42%u7EA7%u5B9A%u4E49%u3002%u5982%u4E0B%u4F8B%uFF1A%0A%0A%60%60%60%0A-%20name%3A%20this%20is%20a%20play%20at%20the%20top%20level%20of%20a%20file%0A%20%20hosts%3A%20all%0A%20%20remote_user%3A%20root%0A%0A%20%20tasks%3A%0A%0A%20%20-%20name%3A%20say%20hi%0A%20%20%20%20tags%3A%20foo%0A%20%20%20%20shell%3A%20echo%20%22hi…%22%0A%0A-%20include%3A%20load_balancers.yml%0A-%20include%3A%20webservers.yml%0A-%20include%3A%20dbservers.yml%0A%60%60%60%0A%0A%u8FD9%u91CC%u9700%u8981%u7559%u610F%u7684%u662F%uFF0Cinclude%u65F6%u53D8%u91CF%u4E0D%u968F%u4E4B%u751F%u6548%0A%0A%23%23%203.%20Roles%0A%0A%u7EC4%u7EC7playbook%u7684%u6700%u597D%u529E%u6CD5%u662F%u4EC0%u4E48%uFF1F%20%u4F7F%u7528%20roles%21%u3002%20roles%20%u53EF%u4EE5%u6709%u6548%u7684%u628A%20vars_files%2C%20tasks%2C%20handlers%u7EC4%u7EC7%u8D77%u6765%uFF0C%u6309%u89D2%u8272%u5206%u7EC4%u53EF%u4EE5%u975E%u5E38%u5BB9%u6613%u7684%u548C%u5176%u5B83%u7528%u6237%u5206%u4EAB%u3002rles%20%u53EA%u662F%u81EA%u52A8%u5316%20%60include%60%20%u5982%u4E0A%u7684%u8FD9%u4E9B%u6307%u4EE4%uFF0C%u5176%u672C%u8EAB%u5E76%u6CA1%u6709%u9B54%u6CD5%u6548%u679C%uFF0C%u4E0D%u7BA1%u5982%u6B64%uFF0C%u8FD9%u662F%u4E00%u9879%u5927%u5DE5%u7A0B%u3002%u56E0%u4E3A%u6211%u4EEC%u8981%u5408%u7406%u7684%u89C4%u5212%u5176%u76EE%u5F55%u7ED3%u6784%u3002%0A%0A%60%60%60%0Asite.yml%0Awebservers.yml%0Afooservers.yml%0Aroles/%0A%20%20%20common/%0A%20%20%20%20%20files/%0A%20%20%20%20%20templates/%0A%20%20%20%20%20tasks/%0A%20%20%20%20%20handlers/%0A%20%20%20%20%20vars/%0A%20%20%20%20%20defaults/%0A%20%20%20%20%20meta/%0A%20%20%20webservers/%0A%20%20%20%20%20files/%0A%20%20%20%20%20templates/%0A%20%20%20%20%20tasks/%0A%20%20%20%20%20handlers/%0A%20%20%20%20%20vars/%0A%20%20%20%20%20defaults/%0A%20%20%20%20%20meta/%0A%60%60%60%0A%0A%u5199%u5230playbook%u4E2D%uFF0C%u5B83%u957F%u6210%u8FD9%u4E2A%u6837%u5B50%uFF1A%0A%0A%60%60%60%0A—%0A-%20hosts%3A%20webservers%0A%20%20roles%3A%0A%20%20%20%20%20-%20common%0A%20%20%20%20%20-%20webservers%0A%60%60%60%0A%0A%u5176%u4E2D%u6BCF%u9879%u5747%u6709%u5176%u529F%u80FD%u4ECB%u7ECD%uFF1A%0A%0A*%20roles/x/tasks/main.yml%0A%u4E3B%u51FD%u6570%uFF0C%u5305%u62EC%u5728%u5176%u4E2D%u7684%u6240%u6709%u4EFB%u52A1%u5C06%u88AB%u6267%u884C%0A*%20roles/x/handlers/main.yml%0A%u6240%u6709%u5305%u62EC%u4E2D%u5176%u4E2D%u7684%20handlers%20%u5C06%u88AB%u6267%u884C%0A*%20roles/x/vars/main.yml%20%0A%u6240%u6709%u5305%u62EC%u5728%u5176%u4E2D%u7684%u53D8%u91CF%u5C06%u5728roles%u4E2D%u751F%u6548%0A*%20roles/x/meta/main.yml%20%0Aroles%u6240%u6709%u4F9D%u8D56%u5C06%u88AB%u6B63%u5E38%u767B%u5165%0A*%20roles/x/%7Bfiles%2Ctemplates%2Ctasks%7D/%20%28dir%20depends%20on%20task%29%20%0A%u6240%u6709%u6587%u4EF6%uFF0C%u6A21%u677F%u90FD%u5C06%u53EF%u5B58%u653E%u5728%u8FD9%u91CC%uFF0C%u653E%u5728%u8FD9%u91CC%u6700%u5927%u7684%u597D%u5904%u662F%u4E0D%u7528%u6307%u5B9A%u7EDD%u5BF9%u8DEF%u5F84%0A%0A%60%60%60%0A—%0A%0A-%20hosts%3A%20webservers%0A%20%20roles%3A%0A%20%20%20%20-%20common%0A%20%20%20%20-%20%7B%20role%3A%20foo_app_instance%2C%20dir%3A%20%27/opt/a%27%2C%20%20app_port%3A%205000%20%7D%0A%20%20%20%20-%20%7B%20role%3A%20foo_app_instance%2C%20dir%3A%20%27/opt/b%27%2C%20%20app_port%3A%205001%20%7D%0A%60%60%60%0A%0A%u4E5F%u53EF%u4EE5%u52A0%u5165%u4E00%u5B9A%u7684%u6761%u4EF6%uFF1A%0A%0A%60%60%60%0A—%0A%0A-%20hosts%3A%20webservers%0A%20%20roles%3A%0A%20%20%20%20-%20%7B%20role%3A%20some_role%2C%20when%3A%20%22ansible_os_family%20%3D%3D%20%27RedHat%27%22%20%7D%0A%60%60%60%0A%0A%u540C%u65F6%uFF0C%u6211%u4EEC%u6709%u53EF%u80FD%u5E0C%u671B%u4E3A%u6211%u4EEC%u7684%u89D2%u8272%u5206%u914D%20%20tags%2C%20tags%u7684%u529F%u80FD%u662F%u6211%u4F7F%u7528%20ansible%20%u4E0B%u6765%u4F53%u9A8C%u6700%u4E3A%u6DF1%u523B%u7684%u529F%u80FD%uFF0C%u6CA1%u6709%u4E4B%u4E00%uFF0C%u5B9E%u5728%u662F%u592A%u7075%u6D3B%u65B9%u4FBF%u4E86%u3002%u5728%u8003%u8651%u7EC4%u7EC7%u4E25%u5BC6%u7684%u540C%u65F6%uFF0C%u53C8%u4E0D%u5FD8%u5176%u7075%u6D3B%u6027%u3002%0A%0A%60%60%60%0A—%0A%0A-%20hosts%3A%20webservers%0A%20%20roles%3A%0A%20%20%20%20-%20%7B%20role%3A%20foo%2C%20tags%3A%20%5B%22bar%22%2C%20%22baz%22%5D%20%7D%0A%60%60%60%0A%0A%u867D%u8BF4tags%20%u662F%u597D%u4E1C%u897F%uFF0C%u4F46%u5982%u679C%u4F60%u53D1%u73B0%u4F60%u5236%u8BA2%u7684%60roles%60%u4E2D%u5177%u6709%u5F88%u591Atags%u800C%u4E14%u7ECF%u5E38%u6027%u7684%u4F1A%u88AB%u4F7F%u7528%uFF0C%u5219%u8981%u8003%u8651%u4E0B%u518D%u6B21%u5207%u5206roles%u4E3A%u591A%u4E2Aroles.%0A%0A%u540C%u65F6%uFF0C%u5728%u4E00%u4E2Aplaybook%u4E2D%u6211%u4EEC%u53EF%u4EE5%u5B9A%u4E49%u591A%u5C42%u7EA7%u7684%u4EFB%u52A1%u3002%u5982%u4E0B%u6848%u4F8B%uFF1A%0A%0A%60%60%60%0A—%0A%0A-%20hosts%3A%20webservers%0A%0A%20%20pre_tasks%3A%0A%20%20%20%20-%20shell%3A%20echo%20%27hello%27%0A%0A%20%20roles%3A%0A%20%20%20%20-%20%7B%20role%3A%20some_role%20%7D%0A%0A%20%20tasks%3A%0A%20%20%20%20-%20shell%3A%20echo%20%27still%20busy%27%0A%0A%20%20post_tasks%3A%0A%20%20%20%20-%20shell%3A%20echo%20%27goodbye%27%0A%60%60%60%0A%0A%23%23%204.%20Role%20Default%20Variables%0A%0A%60defaults/main.yml%60%20%u5B9A%u4E49%u6700%u4F4E%u4F18%u5316%u7EA7%u7684%20roles%20%u53D8%u91CF%uFF0C%u6211%u4EEC%u53EF%u4EE5%u901A%u8FC7%u5F88%u591A%u5176%u5B83%u65B9%u5F0F%u5B9A%u4E49%u7684%u53D8%u91CF%uFF0C%u5747%u4F1A%u8986%u76D6%u8FD9%u91CC%u7684%u53D8%u91CF%u503C%0A%0A%23%23%205.%20Role%20Dependencies%0A%0A%60meta/mainl.yml%60%u9ED8%u8BA4%u5B9A%u4E49role%u7684%u4F9D%u8D56%uFF0C%0A%0A%60%60%60%0A—%0Adependencies%3A%0A%20%20-%20%7B%20role%3A%20common%2C%20some_parameter%3A%203%20%7D%0A%20%20-%20%7B%20role%3A%20apache%2C%20appache_port%3A%2080%20%7D%0A%20%20-%20%7B%20role%3A%20postgres%2C%20dbname%3A%20blarg%2C%20other_parameter%3A%2012%20%7D%0A%60%60%60%0A%0ARole%20%u4F9D%u8D56%u4E5F%u53EF%u4EE5%u662F%u5168%u8DEF%u5F84%uFF0C%u5982%uFF1A%0A%0A%60%60%60%0A—%0Adependencies%3A%0A%20%20%20-%20%7B%20role%3A%20%27/path/to/common/roles/foo%27%2C%20x%3A%201%20%7D%0A%60%60%60%0A%0ARoles%20dependencies%20%u603B%u662F%u5728roles%u6700%u5F00%u59CB%u7684%u65F6%u5019%u6267%u884C%uFF0C%u800C%u4E14%u9ED8%u8BA4%u53EA%u6267%u884C%u4E00%u6B21%uFF0C%u5373%u4F7F%u5176%u5B83%u5176%u5B83roles%u91CD%u590D%u5F15%u7528%u3002%0A%u901A%u8FC7%u8BBE%u7F6E%20meta/main.yml%20%u4E2D%20allow_duplicates%3A%20yes%20%u53EF%u4EE5%u591A%u6B21%u6267%u884C%u3002%u5982%u4E0B%u4F8B%uFF1A%0A%0A%60%60%60%0A—%0Adependencies%3A%0A-%20%7B%20role%3A%20wheel%2C%20n%3A%201%20%7D%0A-%20%7B%20role%3A%20wheel%2C%20n%3A%202%20%7D%0A-%20%7B%20role%3A%20wheel%2C%20n%3A%203%20%7D%0A-%20%7B%20role%3A%20wheel%2C%20n%3A%204%20%7D%0A%60%60%60%0A%0A%60%60%60%0A—%0Aallow_duplicates%3A%20yes%0Adependencies%3A%0A-%20%7B%20role%3A%20tire%20%7D%0A-%20%7B%20role%3A%20brake%20%7D%0A%60%60%60%0A%0A%23%23%206.%20Embedding%20Modules%20In%20Roles%0A%0A%u8FD9%u4E2A%u9AD8%u7EA7%u8BDD%u9898%u548C%u5927%u90E8%u5206%u7528%u6237%u65E0%u5173%uFF0C%u8FD9%u91CC%u6682%u4E0D%u505A%u4ECB%u7ECD%0A%23%23%207.%20Ansible%20Galaxy%0A%0A <p></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信