Loading... <blockquote>在本博客中,ansible是一个系列文章,我们会尽量以通俗易懂的方式总结ansible的相关知识点。 ansible系列博文直达链接:<a href="https://www.zsythink.net/archives/tag/ansible/" target="_blank" rel="noopener">ansible轻松入门系列</a> “ansible系列”中的每篇文章都建立在前文的基础之上,所以,请按照顺序阅读这些文章,否则有可能在阅读中遇到障碍。</blockquote> ansible中还有一些内置变量可供我们使用,当然,这些内置变量的变量名是被ansible保留的,我们定义变量时不能使用这些变量名。 <h2 id="wznav_0">内置变量ansible_version</h2> 先从一个简单的内置变量说起,比如,我们可以通过内置变量ansible_version获取到ansible的版本号,示例命令如下 <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-text">ansible test70 -m debug -a </span><span class="enlighter-s0">"msg={{ansible_version}}"</span></div> </div> </div> </div> <h2 id="wznav_1">内置变量hostvars</h2> 除了ansible_version,还有一些非常有用的内置变量。比如内置变量hostvars hostvars可以帮助我们在操作当前主机时获取到其他主机中的信息。 假设,我想要在操作test70主机时获取到test71主机中的facts信息,我该怎么办呢?示例如下 <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-text">---</span></div> </div> <div class=""> <div><span class="enlighter-text">- name: </span><span class="enlighter-s0">"play 1: Gather facts of test71"</span></div> </div> <div class=""> <div><span class="enlighter-text"> hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">- name: </span><span class="enlighter-s0">"play 2: Get facts of test71 when operating on test70"</span></div> </div> <div class=""> <div><span class="enlighter-text"> hosts: test70</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</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">"{{hostvars['test71'].ansible_ens35.ipv4}}"</span></div> </div> </div> </div> 上例中有两个play,第一个play针对test71主机执行,但是第一个play中没有显式指定任何task(后文会解释原因),第二个play针对test70主机执行,在第二个play中只有一个task,即使用debug模块,输出了test71主机中的ens35网卡的IP信息,如你所见,我们可以借助hostvars在操作当前主机时输出其他主机中的facts信息,上例中使用hostvars加上清单中的主机名称再加上facts的key,即可获取到对应的facts信息,有了前文的总结作为基础,你一定想到了,上例中的msg的值改为如下写法也是可以的。 <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-s0">"{{hostvars.test71.ansible_ens35.ipv4}}"</span></div> </div> </div> </div> 上例中的第一个play中并没有任何的task,为什么还需要第一个play呢?如果你将上例的第一个play删除,只保留第二个play,运行时则会报错,这是因为,虽然第一个play中没有任何task,但是当第一个play执行时,默认会调用”[Gathering Facts]”任务,也就是说,默认会收集test71主机的facts信息,只有被收集过的facts信息才能被后面的play引用到,如果压根没有收集对应主机的facts信息,即使使用hostvars内置变量,也无法获取到对应主机的facts信息,我们来做个试验,我们可以直接把上例的第一个play从playbook中删除,也可以指明让第一个play不收集对应的facts信息,使用”gather_facts”关键字可以控制当前play是否收集对应主机的facts信息,示例如下: <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-text">---</span></div> </div> <div class=""> <div><span class="enlighter-text">- name: </span><span class="enlighter-s0">"play 1: Gather facts of test71"</span></div> </div> <div class=""> <div><span class="enlighter-text"> hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">- name: </span><span class="enlighter-s0">"play 2: Get facts of test71 when operating on test70"</span></div> </div> <div class=""> <div><span class="enlighter-text"> hosts: test70</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</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">"{{hostvars['test71'].ansible_ens35.ipv4}}"</span></div> </div> </div> </div> 如上例所示,第一个play中的”gather_facts: no”表示设置当前play不收集对应主机的信息,运行上例playbook会报错,因为第二个play在操作test70时,无法获取到test71主机中的facts信息,原因是test71的facts信息并未被收集过,所以,调用其他主机的facts信息的前提是对应主机的facts信息已经被收集过。 其实,除了facts信息,我们还能够利用hostvars内置变量从别的主机中获取到其他类型的一些变量信息,比如,其他主机的注册变量、主机变量、组变量等信息,我们先来看一个获取其他主机的注册变量的小示例,如下: <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-text">---</span></div> </div> <div class=""> <div><span class="enlighter-text">- hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - shell: </span><span class="enlighter-s0">"echo register_var_in_play1"</span></div> </div> <div class=""> <div><span class="enlighter-text"> register: shellreturn</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">- hosts: test70</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</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">"{{hostvars.test71.shellreturn.stdout}}"</span></div> </div> </div> </div> 如上例所示,通过hostvars内置变量可以直接获取到其他主机中的注册变量,你一定发现了,注册变量并不用像facts信息那样需要事先收集,即可直接通过hostvars跨主机被引用到,同理,如果你在清单中为test71主机配置了主机变量,或者为test71主机所在的组配置了组变量,也是可以通过hostvars直接跨主机引用的,这里就不进行示例了,动手试试吧。 你可能会问,如果我直接在play中为当前主机定义一个变量,可以在之后的play中操作其他主机时被引用到吗?那么我们来做个实验,示例如下 <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-text">---</span></div> </div> <div class=""> <div><span class="enlighter-text">- hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> vars:</span></div> </div> <div class=""> <div><span class="enlighter-text"> testvar: testvar_in_71</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">"{{testvar}}"</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-text">- hosts: test70</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</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">"{{hostvars.test71.testvar}}"</span></div> </div> </div> </div> 在上例的第一个play中我们为test71主机定义了一个变量,变量名称为testvar,在第二个play中操作test70主机时,使用hostvars尝试引用test71主机中的变量,如果执行上述playbook则会报错,看来通过vars关键字定义的变量使用上例中的方法是无法被跨主机引用的,聪明如你,一定想到了解决方案,前一篇文章中,我们总结了怎样使用”set_fact”关键字定义变量,通过”set_fact”关键字定义的变量拥有类似”facts”信息的特性(如果不明白可以参考前文),所以,我们可以把”vars”关键字中定义的变量通过”set_fact”关键字去定义,这样这些变量就好像facts信息被收集过一样,能被之后的play引用到了,示例如下 <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-text">---</span></div> </div> <div class=""> <div><span class="enlighter-text">- hosts: test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</span></div> </div> <div class=""> <div><span class="enlighter-text"> tasks:</span></div> </div> <div class=""> <div><span class="enlighter-text"> - set_fact:</span></div> </div> <div class=""> <div><span class="enlighter-text"> testvar: </span><span class="enlighter-s0">"testvar_in_71"</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></div> </div> <div class=""> <div><span class="enlighter-text">- hosts: test70</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</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">"{{hostvars.test71.testvar}}"</span></div> </div> </div> </div> 上例通过”set_fact”结合”hostvars”的方式,实现了跨play获取其他主机中的变量信息的功能,还是很方便的。 <h2 id="wznav_2">内置变量inventory_hostname</h2> 通过inventory_hostname变量可以获取到被操作的当前主机的主机名称,这里所说的主机名称并不是linux系统的主机名,而是对应主机在清单中配置的名称,假设我的清单配置如下 <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_group</span><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-n0">10.1</span><span class="enlighter-text">.</span><span class="enlighter-n0">1.60</span></div> </div> <div class=""> <div><span class="enlighter-text">test70.</span><span class="enlighter-m3">zsythink</span><span class="enlighter-text">.</span><span class="enlighter-m3">net</span><span class="enlighter-text"> 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><span class="enlighter-text">test71 anisble_host=</span><span class="enlighter-n0">10.1</span><span class="enlighter-text">.</span><span class="enlighter-n0">1.71</span></div> </div> </div> </div> 清单中配置了三个主机,第一个主机以IP的形式配置,第二个主机和第三个主机都以别名的方式配置,他们同属于test_group组。 那么我们使用内置变量inventory_hostname获取一下各个主机的对应的主机名,看看会返回什么,示例如下 <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 test_group -m debug -a "msg={{inventory_hostname}}"</span></div> </div> <div class=""> <div><span class="enlighter-text">test70.</span><span class="enlighter-m3">zsythink</span><span class="enlighter-text">.</span><span class="enlighter-m3">net</span> <span class="enlighter-g0">|</span><span class="enlighter-text"> SUCCESS =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"changed"</span><span class="enlighter-text">: </span><span class="enlighter-k1">false</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"test70.zsythink.net"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div><span class="enlighter-n0">10.1</span><span class="enlighter-text">.</span><span class="enlighter-n0">1.60</span> <span class="enlighter-g0">|</span><span class="enlighter-text"> SUCCESS =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"changed"</span><span class="enlighter-text">: </span><span class="enlighter-k1">false</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"10.1.1.60"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div><span class="enlighter-text">test71 </span><span class="enlighter-g0">|</span><span class="enlighter-text"> SUCCESS =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"changed"</span><span class="enlighter-text">: </span><span class="enlighter-k1">false</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"test71"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> 从返回信息可以看出,如果使用IP配置主机,inventory_hostname的值就是IP,如果使用别名,inventory_hostname的值就是别名。 <h2 id="wznav_3">内置变量inventory_hostname_short</h2> 与内置变量inventory_hostname类似,通过inventory_hostname_short也可以获取当前play操作的主机在清单中对应的名称,但是这个名称更加简短,假设我的清单配置如下 <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_group</span><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-n0">10.1</span><span class="enlighter-text">.</span><span class="enlighter-n0">1.60</span></div> </div> <div class=""> <div><span class="enlighter-text">test70.</span><span class="enlighter-m3">zsythink</span><span class="enlighter-text">.</span><span class="enlighter-m3">net</span><span class="enlighter-text"> 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><span class="enlighter-text">test71 anisble_host=</span><span class="enlighter-n0">10.1</span><span class="enlighter-text">.</span><span class="enlighter-n0">1.71</span></div> </div> </div> </div> 那么通过内置变量inventory_hostname_short获取到的主机的简短名称如下: <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 test_group -m debug -a "msg={{inventory_hostname_short}}"</span></div> </div> <div class=""> <div><span class="enlighter-text">test70.</span><span class="enlighter-m3">zsythink</span><span class="enlighter-text">.</span><span class="enlighter-m3">net</span> <span class="enlighter-g0">|</span><span class="enlighter-text"> SUCCESS =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"changed"</span><span class="enlighter-text">: </span><span class="enlighter-k1">false</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"test70"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div><span class="enlighter-n0">10.1</span><span class="enlighter-text">.</span><span class="enlighter-n0">1.60</span> <span class="enlighter-g0">|</span><span class="enlighter-text"> SUCCESS =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"changed"</span><span class="enlighter-text">: </span><span class="enlighter-k1">false</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"10"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div><span class="enlighter-text">test71 </span><span class="enlighter-g0">|</span><span class="enlighter-text"> SUCCESS =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"changed"</span><span class="enlighter-text">: </span><span class="enlighter-k1">false</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"test71"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> 可以看到,无论是IP还是别名,如果清单的主机名称中包含”.”,inventory_hostname_short都会取得主机名中第一个”.”之前的字符作为主机的简短名称。 <h2 id="wznav_4">内置变量play_hosts</h2> 通过内置变量play_hosts可以获取到当前play所操作的所有主机的主机名列表,示例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-text">---</span></div> </div> <div class=""> <div><span class="enlighter-text">- hosts: test70,test71</span></div> </div> <div class=""> <div><span class="enlighter-text"> remote_user: root</span></div> </div> <div class=""> <div><span class="enlighter-text"> gather_facts: no</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">"{{play_hosts}}"</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-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">test70</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-g1">[</span></div> </div> <div class=""> <div><span class="enlighter-s0">"test71"</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"test70"</span></div> </div> <div class=""> <div><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</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-g1">[</span></div> </div> <div class=""> <div><span class="enlighter-s0">"test71"</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"test70"</span></div> </div> <div class=""> <div><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> 可以看到,此play每操作一个主机,都会将当前play操作的所有主机的主机名列表返回。 没错,inventory_hostname和play_hosts都是返回主机名,只不过,inventory_hostname只返回当前被操作的主机的主机名,而play_hosts则返回当前play中所有被操作主机的主机名列表。 <h2 id="wznav_5">内置变量groups</h2> 通过groups内置变量可以获取到清单中”所有分组”的”分组信息”,什么意思呢?我们先来看一个清单配置,假设我的清单配置如下: <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-text">10.</span><span class="enlighter-m3">1</span><span class="enlighter-text">.</span><span class="enlighter-n0">1.60</span></div> </div> <div class=""> <div><span class="enlighter-text">test70.</span><span class="enlighter-m3">zsythink</span><span class="enlighter-text">.</span><span class="enlighter-m3">net</span><span class="enlighter-text"> 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><span class="enlighter-text">test71 anisble_host=</span><span class="enlighter-n0">10.1</span><span class="enlighter-text">.</span><span class="enlighter-n0">1.71</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-g1">[</span><span class="enlighter-text">testA</span><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-text">test60 ansible_host=</span><span class="enlighter-n0">10.1</span><span class="enlighter-text">.</span><span class="enlighter-n0">1.60</span></div> </div> <div class=""> <div><span class="enlighter-text">test61 ansible_host=</span><span class="enlighter-n0">10.1</span><span class="enlighter-text">.</span><span class="enlighter-n0">1.61</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-g1">[</span><span class="enlighter-text">testB</span><span class="enlighter-g1">]</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:children</span><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-text">testA</span></div> </div> <div class=""> <div><span class="enlighter-text">testB</span></div> </div> </div> </div> 上述清单中,显式的指定了三个组,testA组、testB组、test组,其中,testA组与testB组是test组的子组,除了组中的主机,还有三台主机没有任何分组,直接写在了清单中。 现在,我们获取一下groups变量的值,看看会返回哪些信息,随便操作清单中的任意一台主机即可,示例如下 <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 test70 -m debug -a "msg={{groups}}"</span></div> </div> <div class=""> <div><span class="enlighter-text">test70 </span><span class="enlighter-g0">|</span><span class="enlighter-text"> SUCCESS =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"changed"</span><span class="enlighter-text">: </span><span class="enlighter-k1">false</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"all"</span><span class="enlighter-text">: </span><span class="enlighter-g1">[</span></div> </div> <div class=""> <div><span class="enlighter-s0">"10.1.1.60"</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"test70.zsythink.net"</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"test71"</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"test60"</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"test61"</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"test70"</span></div> </div> <div class=""> <div><span class="enlighter-g1">]</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"test"</span><span class="enlighter-text">: </span><span class="enlighter-g1">[</span></div> </div> <div class=""> <div><span class="enlighter-s0">"test60"</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"test61"</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"test70"</span></div> </div> <div class=""> <div><span class="enlighter-g1">]</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"testA"</span><span class="enlighter-text">: </span><span class="enlighter-g1">[</span></div> </div> <div class=""> <div><span class="enlighter-s0">"test60"</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"test61"</span></div> </div> <div class=""> <div><span class="enlighter-g1">]</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"testB"</span><span class="enlighter-text">: </span><span class="enlighter-g1">[</span></div> </div> <div class=""> <div><span class="enlighter-s0">"test70"</span></div> </div> <div class=""> <div><span class="enlighter-g1">]</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"ungrouped"</span><span class="enlighter-text">: </span><span class="enlighter-g1">[</span></div> </div> <div class=""> <div><span class="enlighter-s0">"10.1.1.60"</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"test70.zsythink.net"</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"test71"</span></div> </div> <div class=""> <div><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> 从上述返回信息可以看出,所有主机默认被分成了组名为”all”的组,testA组中有两台主机,testB组中有一台主机,由于testA组和testB组都属于test组的子组,所以testA组与testB组中的主机都属于test组,由于有三台主机在清单中并未分组,所以,ansible自动将没有分组的主机分到了名为”ungrouped”的组中,即组名为”未分组”的组。 我们还能够通过组名,获取到指定组的分组信息,假设,我想要获取到上例中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"># ansible test70 -m debug -a "msg={{groups.test}}"</span></div> </div> </div> </div> 当然,语法也可以改为如下 <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 test70 -m debug -a "msg={{groups['test']}}"</span></div> </div> </div> </div> 聪明如你一定已经会举一反三了,所以,如果我们想要获取到所有未分组主机的主机名,则可以使用如下方法 <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 test70 -m debug -a "msg={{groups.ungrouped}}"</span></div> </div> </div> </div> <h2 id="wznav_6">内置变量group_names</h2> 见名知义,我们可以通过内置变量group_names获取到当前主机所在分组的组名,比如,我的清单配置如下 <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-text">10.</span><span class="enlighter-m3">1</span><span class="enlighter-text">.</span><span class="enlighter-n0">1.60</span></div> </div> <div class=""> <div><span class="enlighter-text">test70.</span><span class="enlighter-m3">zsythink</span><span class="enlighter-text">.</span><span class="enlighter-m3">net</span><span class="enlighter-text"> 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><span class="enlighter-text">test71 anisble_host=</span><span class="enlighter-n0">10.1</span><span class="enlighter-text">.</span><span class="enlighter-n0">1.71</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-g1">[</span><span class="enlighter-text">testA</span><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-text">test60 ansible_host=</span><span class="enlighter-n0">10.1</span><span class="enlighter-text">.</span><span class="enlighter-n0">1.60</span></div> </div> <div class=""> <div><span class="enlighter-text">test61 ansible_host=</span><span class="enlighter-n0">10.1</span><span class="enlighter-text">.</span><span class="enlighter-n0">1.61</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-g1">[</span><span class="enlighter-text">testB</span><span class="enlighter-g1">]</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:children</span><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-text">testA</span></div> </div> <div class=""> <div><span class="enlighter-text">testB</span></div> </div> </div> </div> 那么,当我操作test70主机时,group_names变量值如下 <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 test70 -m debug -a "msg={{group_names}}"</span></div> </div> <div class=""> <div><span class="enlighter-text">test70 </span><span class="enlighter-g0">|</span><span class="enlighter-text"> SUCCESS =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"changed"</span><span class="enlighter-text">: </span><span class="enlighter-k1">false</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-g1">[</span></div> </div> <div class=""> <div><span class="enlighter-s0">"test"</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"testB"</span></div> </div> <div class=""> <div><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> 如上例返回值所示,test70主机属于testB组,而testB组又是test组的子组,所以test70主机同时属于testB组和test组,所以,最终返回的信息中包括test与testB 当我们操作未分组的主机时,group_names的值为”ungrouped”,示例如下 <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 10.1.1.60 -m debug -a "msg={{group_names}}"</span></div> </div> <div class=""> <div><span class="enlighter-n0">10.1</span><span class="enlighter-text">.</span><span class="enlighter-n0">1.60</span> <span class="enlighter-g0">|</span><span class="enlighter-text"> SUCCESS =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"changed"</span><span class="enlighter-text">: </span><span class="enlighter-k1">false</span><span class="enlighter-text">,</span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-g1">[</span></div> </div> <div class=""> <div><span class="enlighter-s0">"ungrouped"</span></div> </div> <div class=""> <div><span class="enlighter-g1">]</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> <h2 id="wznav_7">内置变量inventory_dir</h2> 我们可以通过inventory_dir变量获取到ansible主机中清单文件的存放路径,我使用的是默认的清单文件/etc/ansible/hosts,所以,inventory_dir变量对应的值为/etc/ansible,如下例所示 <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 test71 -m debug -a "msg={{inventory_dir}}"</span></div> </div> <div class=""> <div><span class="enlighter-text">test71 </span><span class="enlighter-g0">|</span><span class="enlighter-text"> SUCCESS =</span><span class="enlighter-g1">></span> <span class="enlighter-g1">{</span></div> </div> <div class=""> <div><span class="enlighter-s0">"changed"</span><span class="enlighter-text">: </span><span class="enlighter-k1">false</span><span class="enlighter-text">, </span></div> </div> <div class=""> <div><span class="enlighter-s0">"msg"</span><span class="enlighter-text">: </span><span class="enlighter-s0">"/etc/ansible"</span></div> </div> <div class=""> <div><span class="enlighter-g1">}</span></div> </div> </div> </div> ansible中还有其他的一些变量的使用方法,但是需要结合其他的一些知识点,所以之后遇到了实际的使用场景,我们再进行介绍吧。 这篇文章就先总结到这里,希望能够对你有所帮助。 转载自朱双印日志https://www.zsythink.net/archives/2715 Last modification:May 29, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏