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"

