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"