Ansible:使用hostvars生成主机文件

时间:2020-03-21 11:42:10  来源:igfitidea点击:

在某些情况下,您需要访问其他主机的变量,包括有关该主机的事实。

问题

我的测试环境中有5台Ansible托管主机,用于测试。
我想使用模板为每个受管节点生成/etc/hosts文件。
我要结束的文件内容如下:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1

localhost localhost.localdomain localhost6 localhost6.localdomain6
10.11.1.62 ansible2.hl.local ansible2
10.11.1.63 ansible3.hl.local ansible3
10.11.1.64 ansible4.hl.local ansible4
10.11.1.65 ansible5.hl.local ansible5
10.11.1.66 ansible6.hl.local ansible6

虽然我可以轻松检索有关运行该剧本的主机的事实,但我还需要一种方法来访问有关其他主机的事实。

解决方案:魔术变量

" hostvars"魔术变量允许您访问其他主机的变量,包括有关该主机的事实。
您可以在剧本的任何位置访问主机变量。

如果服务器需要使用另一个节点的"事实"值,则可以在模板" templates/hosts.j2"中轻松实现:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1

localhost localhost.localdomain localhost6 localhost6.localdomain6
{{ hostvars['ansible2.hl.local']['ansible_default_ipv4']['address'] }} {{ hostvars['ansible2.hl.local']['ansible_fqdn'] }} {{ hostvars['ansible2.hl.local']['ansible_hostname'] }}
{{ hostvars['ansible3.hl.local']['ansible_default_ipv4']['address'] }} {{ hostvars['ansible3.hl.local']['ansible_fqdn'] }} {{ hostvars['ansible3.hl.local']['ansible_hostname'] }}
{{ hostvars['ansible4.hl.local']['ansible_default_ipv4']['address'] }} {{ hostvars['ansible4.hl.local']['ansible_fqdn'] }} {{ hostvars['ansible4.hl.local']['ansible_hostname'] }}
{{ hostvars['ansible5.hl.local']['ansible_default_ipv4']['address'] }} {{ hostvars['ansible5.hl.local']['ansible_fqdn'] }} {{ hostvars['ansible5.hl.local']['ansible_hostname'] }}
{{ hostvars['ansible6.hl.local']['ansible_default_ipv4']['address'] }} {{ hostvars['ansible6.hl.local']['ansible_fqdn'] }} {{ hostvars['ansible6.hl.local']['ansible_hostname'] }}

playbook:

--
- name: Generate Hosts File
hosts: all
become: true
gather_facts: true
vars:
my_file: /etc/hosts
my_template: templates/hosts.j2
tasks:
- name: Create "{{ my_file }}"
template:
src: "{{ my_template }}"
dest: "{{ my_file }}"
owner: root
group: root
mode: "0644"