Loading... <blockquote>在本博客中,ansible是一个系列文章,我们会尽量以通俗易懂的方式总结ansible的相关知识点。 ansible系列博文直达链接:<a href="https://www.zsythink.net/archives/tag/ansible/" target="_blank" rel="noopener">ansible轻松入门系列</a> “ansible系列”中的每篇文章都建立在前文的基础之上,所以,请按照顺序阅读这些文章,否则有可能在阅读中遇到障碍。 </blockquote> 之前的文章中总结了各种变量的用法,这篇文章我们继续。 我们知道,ansible默认的主机清单文件为”/etc/ansible/hosts”,我们可以在默认的清单文件中为各个主机定义主机变量、为各个组定义组变量,比如如下示例: <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-g1">[</span><span class="enlighter-text">test</span><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-text">test71 ansible_host=</span><span class="enlighter-n0">10.1</span><span class="enlighter-text">.</span><span class="enlighter-n0">1.71</span><span class="enlighter-text"> test71var=t71v</span></div> </div> <div class=""> <div><span class="enlighter-text">test70 ansible_host=</span><span class="enlighter-n0">10.1</span><span class="enlighter-text">.</span><span class="enlighter-n0">1.70</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-g1">[</span><span class="enlighter-text">test:vars</span><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-text">testvar=testGroupVar</span></div> </div> </div> </div> 如上例所示,我们在清单中配置了两个主机,test71和test70,我们为test71配置了一个主机变量,这个变量就是”test71var”,同时,我们还为test组定义了一个组变量”testvar”。 其实,除了像上例中那样直接在hosts文件中定义主机变量和组变量,还有另外一种方法也可以定义主机变量和组变量,我们可以在清单文件的同级目录中创建两个目录,这两个目录的名字分别为”group_vars”和”host_vars”,我们可以将组变量文件放在”group_vars”目录中,将主机变量文件放在”host_vars”目录中,这样ansible就能获取到对应组变量和主机变量了。 我们先来看看怎样使用”group_vars”目录引入组变量,示例如下: 首先,我在hosts文件的同级目录中创建了一个group_vars目录,并且在group_vars目录中创建了一个名为test的文件,test文件的内容如下 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0"># cat /etc/ansible/group_vars/test</span></div> </div> <div class=""> <div><span class="enlighter-text">testvar1: testGroupVar1</span></div> </div> </div> </div> 如你所见,我在test文件中创建了一个名为”testvar1″的变量。 “group_vars”目录中的文件之所以命名为”test”,是因为在上例的hosts文件中,有一个名为”test”的组,这个”变量文件的文件名”与”hosts文件中的组名”其实是对应的,定义在group_vars/test文件中的变量就相当于定义在test组中的”组变量”,同理,如果hosts文件中的其他组需要定义”组变量”,也可以在”group_vars”目录中创建一个与其组名同名的变量文件,我已经写好了一个测试用的playbook,测试一下刚才设置的组变量是否生效,测试playbook如下: <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0"># cat t.yml</span></div> </div> <div class=""> <div><span class="enlighter-text">- hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{test71var}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{testvar}}"</span></div> </div> <div class=""> <div><span class="enlighter-text"> - debug:</span></div> </div> <div class=""> <div><span class="enlighter-text"> msg: </span><span class="enlighter-s0">"{{testvar1}}"</span></div> </div> </div> </div> 执行上述测试playbook,输出如下: <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0"># ansible-playbook t.yml</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">PLAY </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">******************************************</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">Gathering Facts</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">***********************************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">******************************************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"t71v"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">******************************************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"testGroupVar"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">******************************************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"testGroupVar1"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">PLAY RECAP </span><span class="enlighter-g0">******************************************</span></div> </div> <div class=""> <div><span class="enlighter-text">test71 </span><span class="enlighter-g0">:</span><span class="enlighter-text"> ok=</span><span class="enlighter-n1">4</span><span class="enlighter-text"> changed=</span><span class="enlighter-n1">0</span><span class="enlighter-text"> unreachable=</span><span class="enlighter-n1">0</span><span class="enlighter-text"> failed=</span><span class="enlighter-n1">0</span></div> </div> </div> </div> 从上述输出信息可以看出,定义在”group_vars/test”文件中的组变量已经被调用到了。 其实,我们也可以为test文件加上后缀名,文件的后缀名可以为”.yml”或”.yaml”或者”.json”中的任意一种,也就是说,我们将”group_vars/test”重命名为”group_vars/test.yml”,其中的变量也是能够完全正常的被调用的。 我们来思考一个问题,当group_vars/test文件中的定义的组变量与hosts文件中的组变量重复时,会以哪个为准呢? 我们来测试一下,由于当前hosts文件中已经有一个名为testvar的组变量,我们只需要在group_vars/test文件中再定义一个同名的变量,即可进行测试,group_vars/test文件中的内容如下: <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0"># cat test.yml</span></div> </div> <div class=""> <div><span class="enlighter-text">testvar: testvar </span><span class="enlighter-k1">in</span><span class="enlighter-text"> group_vars/test.</span><span class="enlighter-m3">yml</span></div> </div> <div class=""> <div><span class="enlighter-text">testvar1: testGroupVar1</span></div> </div> </div> </div> 变量设置完毕后,再次执行刚才的测试playbook,输出如下: <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0"># ansible-playbook t.yml</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">PLAY </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">******************************************</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">Gathering Facts</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">************************************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">******************************************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"t71v"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">******************************************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"testvar in group_vars/test.yml"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">******************************************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"testGroupVar1"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">PLAY RECAP </span><span class="enlighter-g0">******************************************</span></div> </div> <div class=""> <div><span class="enlighter-text">test71 </span><span class="enlighter-g0">:</span><span class="enlighter-text"> ok=</span><span class="enlighter-n1">4</span><span class="enlighter-text"> changed=</span><span class="enlighter-n1">0</span><span class="enlighter-text"> unreachable=</span><span class="enlighter-n1">0</span><span class="enlighter-text"> failed=</span><span class="enlighter-n1">0</span></div> </div> </div> </div> 从输出结果可以看出,当”group_vars/test”文件中的组变量和hosts文件中的组变量冲突时,”group_vars/test”文件中的组变量的优先级更高。 在group_vars目录中,不仅能够使用”test文件”表示test组,也可以使用”test目录”表示test组,在”test目录”中又可以定义多个变量文件,这些文件中的变量都会被当做test组的组变量,示例如下: 我已经删除了刚才用于测试的”group_vars/test”文件,同时,我创建了一个”group_vars/test”目录,目录中有两个变量文件,”a.yml”和”b.yml” <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0"># ls /etc/ansible/group_vars/test</span></div> </div> <div class=""> <div><span class="enlighter-text">a.</span><span class="enlighter-m3">yml</span><span class="enlighter-text"> b.</span><span class="enlighter-m3">yml</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-c0"># cat /etc/ansible/group_vars/test/a.yml</span></div> </div> <div class=""> <div><span class="enlighter-text">testvar: testvar </span><span class="enlighter-k1">in</span><span class="enlighter-text"> group_vars/test/a.</span><span class="enlighter-m3">yml</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-c0"># cat /etc/ansible/group_vars/test/b.yml</span></div> </div> <div class=""> <div><span class="enlighter-text">testvar1: testvar1 </span><span class="enlighter-k1">in</span><span class="enlighter-text"> group_vars/test/b.</span><span class="enlighter-m3">yml</span></div> </div> </div> </div> 如上例所示,test目录中有两个变量文件,”a.yml”和”b.yml”,这两个文件中分别定义了两个变量,test目录的目录名与hosts文件中的test组其实是对应的,同理,如果hosts文件中的其他组需要定义组变量,也可以在”group_vars”目录中创建一个与其组名同名的目录,然后在这个目录中创建一些变量文件,在这些变量文件中定义变量相当于在hosts文件中的组中定义的组变量。 我们已经通过目录的方式定义了test组的组变量,那么我们再次调用刚才的测试playbook试试,输出如下: <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0"># ansible-playbook t.yml</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">PLAY </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">******************************************</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">Gathering Facts</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">***********************************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">******************************************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"t71v"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">******************************************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"testvar in group_vars/test/a.yml"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">TASK </span><span class="enlighter-g1">[</span><span class="enlighter-text">debug</span><span class="enlighter-g1">]</span> <span class="enlighter-g0">******************************************</span></div> </div> <div class=""> <div><span class="enlighter-text">ok: </span><span class="enlighter-g1">[</span><span class="enlighter-text">test71</span><span class="enlighter-g1">]</span><span class="enlighter-text"> =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"testvar1 in group_vars/test/b.yml"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">PLAY RECAP </span><span class="enlighter-g0">******************************************</span></div> </div> <div class=""> <div><span class="enlighter-text">test71 </span><span class="enlighter-g0">:</span><span class="enlighter-text"> ok=</span><span class="enlighter-n1">4</span><span class="enlighter-text"> changed=</span><span class="enlighter-n1">0</span><span class="enlighter-text"> unreachable=</span><span class="enlighter-n1">0</span><span class="enlighter-text"> failed=</span><span class="enlighter-n1">0</span></div> </div> </div> </div> 综上所述,在group_vars目录中,有两种方式可以定义组变量。 方式一:直接使用变量文件,变量文件的文件名需要与组名相同(可以添加”.yml”、”.yaml”、”.json”作为后缀)。 方式二:使用目录,目录名需要与组名相同,然后再在目录中定义变量文件。 之前的示例中,”group_vars目录”一直定义在hosts文件的同级目录中,其实,”group_vars目录”也可以放在你所执行的playbook的同级目录中,比如,上例中,测试时使用的playbook为”t.yml”,我也可以在”t.yml”的同级目录中创建”group_vars目录”,然后再选择使用方式一或者方式二去定义组变量,而且,playbook的同级目录中的”group_vars目录”的优先级更高,也就是说,当hosts文件的同级目录和playbook的同级目录中同时存在”group_vars目录”时,并且存在同名的组变量时,会优先使用playbook同级目录中的”group_vars目录”中定义的组变量,通常情况下,我更习惯在playbook的同级目录中使用group_vars目录。 了解了”group_vars”目录的作用和用法以后,再来理解”host_vars”目录简直不要太简单,因为它们的使用方法完全相同,只不过,”host_vars”目录中定义的变量不是组变量,而是主机变量,在”host_vars”目录中定义主机变量也有两种方式 方式一:直接使用变量文件,变量文件的文件名需要与主机名相同(可以添加”.yml”、”.yaml”、”.json”作为后缀)。 方式二:使用目录,目录名需要与主机名相同,然后再在目录中定义变量文件。 “host_vars”目录能够定义在主机清单的同级目录下,也能定义在playbook的同级目录下,定义在playbook同级目录中的优先级更高。 聪明如你肯定会举一反三的,我就不再对”host_vars”目录的用法进行示例了,这篇文章先总结到这里,希望能够对你有所帮助~ 转载自朱双印日志https://www.zsythink.net/archives/3270 Last modification:May 29, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏