在 Ansible 中访问主机组的主机变量

在 Ansible 中访问主机组的主机变量

我正在尝试使用 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

相关内容