ansible - 如何在引用 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 作为迭代器?
解决方案
我建议先创建一个任务,然后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
推荐阅读
- cassandra - 白天频繁更新的数据的 Cassandra 压缩策略
- sql-server - 服务代理 - 多个队列与一个队列
- mysql - Kubernetes:使用 MySQL 容器创建 StatefulSet 时出错
- php - 如何使用codeigniter将多个复选框值插入数据库
- python - 将 BeautifulSoup 函数应用于 Pandas DataFrame
- javascript - 在对象中使用方法不会给我值
- asp.net - 如何使用 MS Access 数据库在 ISS 中设置现有的 asp 站点?
- ruby-on-rails - 检查字符串是否属于枚举作为值
- c++ - 在 Visual Studio 2015 中链接 .lib
- matlab - 将 .ods 工作表加载到 Octave 时出错