如何设置 ansible inventory 中主机的 hosts 文件?

如何设置 ansible inventory 中主机的 hosts 文件?

我已经开始学习和使用 ansible 来配置我的暂存和生产服务器。我想做的一件事是通过 inventory 文件配置 /etc/hosts。

看起来这是可能的。下面是其中一种用法: https://gist.github.com/rothgar/8793800

但是,我对 Ansible 还不太熟悉,不太明白。有人能用通俗易懂的英语解释一下我在实践中如何让它发挥作用吗?

例如,如果我的库存文件包含。

[compute]
1.2.3.4 
5.6.7.8

[db]
2.3.4.5
6.7.8.9
10.11.12.13

[all]
compute
db

[all:vars]
...

我想一致地说,运行剧本后我的主机文件包含

2.3.4.5 db1
6.7.8.9 db2
10.11.12.13 db3
1.2.3.4 compute1
5.6.7.8 compute2

这可能吗?

答案1

您可以从模板生成主机条目。循环遍历组列表,丢弃像all和 这样的组ungrouped,然后循环遍历每个组中的主机列表:

{# this loops over the list of groups.  inside the loop #}
{# "group" will be the group name and "hosts" will be the #}
{# list of hosts in that group. #}
{% for group,hosts in groups.items() %}

{# skip the "all" and "ungrouped" groups, which presumably #}
{# you don't want in your hosts file #}
{% if group not in ["ungrouped", "all"] %}

{# generate a hosts entry for each host, using the "loop.index" #}
{# variable and the group name to generate a unique hostname. #}
{% for host in hosts %}
{{host}} {{group}}{{loop.index}}
{% endfor %}

{% endif %}
{% endfor %}

上面使用的是{{host}}IP 地址,因为这让我可以在我的系统上进行测试,但是你可能更喜欢{{hostvars[host]['ansible_default_ipv4']['address']}}在真实环境中进行测试,除非你确定你总是在你的库存中使用 IP 地址。

答案2

在库存文件中:

  [myhosts]
    192.168.29.2 host_name=host1
    192.168.29.3 host_name=host2

在 playbook.yaml 中

    - name: Update /etc/hosts from inventory
  lineinfile: dest=/etc/hosts regexp='.*{{item}}$' line='{{hostvars[item]['ansible_eth1']['ipv4']['address'] }}   {{hostvars[item]['host_name']}} ' state=present
  with_items: '{{groups.myhosts}}'

相关内容