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

mel*_*yed 8 ansible

我正在尝试使用 Ansible 在服务器主机文件中添加条目。我有一组服务器,我需要通过专用 LAN 相互通信。

我的库存文件:

[server_list]
server1
server2
Run Code Online (Sandbox Code Playgroud)

我试图开始工作的任务:

- lineinfile: dest=/etc/hosts line="{{ hostvars[" {{ item }} "]['ansible_eth1']['ipv4']['address'] }}   {{ hostvars[" {{ item }} "]['ansible_hostname'] }}"
  with_items: groups['server_list']
Run Code Online (Sandbox Code Playgroud)

它没有做到这一点,我明白了:

fatal: [server1] => host not found:  {{item}} 
fatal: [server2] => host not found:  {{item}} 
Run Code Online (Sandbox Code Playgroud)

这是基本相同,这样,但在新的Ansible变量访问格式{{ }}

任何想法如何完成这项工作?

mel*_*yed 10

好的。我以前试过这个,但它并没有真正奏效。所以我一定是在那里做错了什么。

这有效:

- lineinfile: dest=/etc/hosts line="{{ hostvars[item]['ansible_eth1']['ipv4']['address'] }}   {{ hostvars[item]['ansible_hostname'] }}"
  with_items: groups['server_list']
Run Code Online (Sandbox Code Playgroud)

或 1.9 或更高版本:

- lineinfile: dest=/etc/hosts line="{{ hostvars[item]['ansible_eth1']['ipv4']['address'] }}   {{ hostvars[item]['ansible_hostname'] }}"
  with_items: "{{ groups['server_list'] }}"
Run Code Online (Sandbox Code Playgroud)


小智 5

有同样的问题,我想查看一组中的主机列表,然后使用它们的 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 }}"
Run Code Online (Sandbox Code Playgroud)


Chr*_*rel 0

你的语法只是稍微有点偏差。尝试使用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
Run Code Online (Sandbox Code Playgroud)

  • 不。还是坏了。`groups['server_list']` 已正确扩展。我认为问题在于嵌套。{{ }} 围绕主机变量的 {{ }} 内的 `item`。 (2认同)