我正在尝试使用 Ansible 在服务器主机文件中添加条目。我有一组服务器,需要通过私有 LAN 相互通信。
我的库存文件:
[server_list]
server1
server2
我正在尝试完成的任务:
- lineinfile: dest=/etc/hosts line="{{ hostvars[" {{ item }} "]['ansible_eth1']['ipv4']['address'] }} {{ hostvars[" {{ item }} "]['ansible_hostname'] }}"
with_items: groups['server_list']
它没有起作用,我得到了这个:
fatal: [server1] => host not found: {{item}}
fatal: [server2] => host not found: {{item}}
这基本上与这,但采用新的 Ansible 变量访问格式{{ }}
。
有什么想法可以完成这个吗?
答案1
好的。我之前试过这个,但并没有奏效。所以我之前肯定做错了什么。
这有效:
- lineinfile: dest=/etc/hosts line="{{ hostvars[item]['ansible_eth1']['ipv4']['address'] }} {{ hostvars[item]['ansible_hostname'] }}"
with_items: groups['server_list']
或者对于 1.9 或更高版本:
- lineinfile: dest=/etc/hosts line="{{ hostvars[item]['ansible_eth1']['ipv4']['address'] }} {{ hostvars[item]['ansible_hostname'] }}"
with_items: "{{ groups['server_list'] }}"
答案2
遇到了同样的问题,我想查看一个组中的主机列表,然后添加带有其 IP 的防火墙规则。查看了一下 hostvars[item] 的结构,并使用不同的名称来访问该值。这对我有用:
- name: Setting up firewall so web_servers can access MySQL on port {{ mysql_port }}
ufw: rule=allow proto=tcp to_port={{ mysql_port }} src="{{ hostvars[item]['ansible_default_ipv4']['address'] }}"
with_items: "{{ groups.web_servers }}"
答案3
如果您需要添加前缀和后缀,以及将所有内容列成列表,请查看以下内容:
set_fact:
extended_etcd_endpoints_list: "{{ groups['etcd'] | map('extract', hostvars, ['ansible_default_ipv4','address']) | map('regex_replace', '^(.*)$','https://\\1:2379') | list }}"
它获取 etcd 组中所有机器的列表,提取 ipv4,在前面添加 'https://',在末尾添加 ':2379'。最后,所有内容都转换为列表。
答案4
您的语法只是稍微有点不对。尝试使用groups.server_list
作为您的with_items list
。
我不像你那样使用 host_vars,因此如果你在执行剧本的该部分时遇到解析器错误,请告诉我。
但下面应该用主机名代替 {{ item }}。
- lineinfile: dest=/etc/hosts line="{{ hostvars[" {{ item }} "]['ansible_eth1']['ipv4']['address'] }} {{ hostvars[" {{ item }} "]['ansible_hostname'] }}"
with_items: groups.server_list