我想动态创建一个内存中的清单,它是对标准清单的过滤器,该清单仅包括安装了特定服务的主机。过滤后的广告资源将在后续播放中使用。
因此,我确定了安装服务的主机的IP地址。
- name: find where the service is installed
win_service:
name: "{{ service }}"
register: service_info
这将返回一个布尔值“ exists”。以此值为条件,尝试添加运行服务的主机。
- 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,因此条件“ when”检查始终返回false。 >
- name: create filtered in memory inventory
add_host:
name: "{{ ansible_host }}"
when: service_info.exists
with_items: "{{ ansible_play_batch }}"
有没有一种方法可以将带有hostvars的主机作为迭代器传递给add_host?
答案 0 :(得分:0)
我建议在add_host
之前创建一个任务,以便在executor上创建一个临时文件,其中包含符合条件的服务器列表,然后在该文件中循环进入模块add_host
。
我之前问过的来自Improving use of add_host in ansible的例子
---
- 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