首页 > 解决方案 > 如何在引用 add_host 中的主机变量时遍历 Ansible 库存

问题描述

我想动态创建一个内存清单,它是标准清单的过滤器,仅包括安装了特定服务的主机。过滤后的库存将在后续播放中使用。

所以我确定了安装服务的主机的IP地址。

- name: find where the service is installed
  win_service:
    name: "{{ service }}"
  register: service_info

这将返回一个布尔“存在”值。使用此值作为条件尝试添加运行服务的主机。

- name: create filtered in memory inventory
  add_host:
    name: "{{ ansible_host }}"
  when: service_info.exists

add_host 模块绕过播放主机循环,并且只对播放中的所有主机运行一次,因此这仅在 add_host 运行的主机是安装了服务的主机时才有效。

下面是强制 add_host 遍历清单中的主机的尝试,但是似乎没有将 hostvars 和 service_info.exists 传递给 add_host,因此条件“何时”检查总是返回 false。

- name: create filtered in memory inventory
  add_host:
    name: "{{ ansible_host }}"
  when: service_info.exists
  with_items: "{{ ansible_play_batch }}"

有没有办法将主机及其主机变量传递给 add_host 作为迭代器?

标签: ansible

解决方案


我建议先创建一个任务,然后add_host在执行器上创建一个与条件匹配的服务器列表的临时文件,然后在add_host文件中循环模块。

示例取自我之前问过的在 ansible 中改进 add_host 的使用

---
- hosts: servers
  tasks:

   - name: find where the service is installed
     win_service:
       name: "{{ service }}"
     register: service_info

   - name: write server name in file on control node
     lineinfile:
       path: /tmp/servers_foo.txt
       state: present
       line: "{{ inventory_hostname }}"
     delegate_to: 127.0.0.1
     when: service_info.exists

   - name: assign target to group
     add_host:
       name: "{{ item }}"
       groups:
         - foo
     with_lines: cat /tmp/servers_foo.txt
     delegate_to: 127.0.0.1

推荐阅读