如何在Ansible中仅对单个主机禁用gather_facts事实采集
Ansible跨play共享变量问题解决方案
1. 为指定主机关闭事实采集
Ansible支持针对单个主机或主机组关闭事实采集,可通过两种方式实现:
- 在play级别通过条件判断动态控制是否采集事实,跳过虚拟主机即可:
- name: 集群业务配置play hosts: all gather_facts: "{{ inventory_hostname != 'K8S_MASTER_CA_HASH' }}" tasks: # 你的业务任务逻辑
- 在inventory中为虚拟主机添加永久关闭事实采集的变量:
# inventory配置示例 K8S_MASTER_CA_HASH ansible_gather_facts=false
2. 解决localhost作为变量存储主机的SSH连接报错
默认Ansible会对未指定连接类型的主机尝试走SSH连接,只需为localhost指定本地连接类型即可避免该报错:
- inventory配置示例:
localhost ansible_connection=local ansible_gather_facts=true
- play级别指定示例:
- name: 存储全局共享变量play hosts: localhost connection: local gather_facts: false tasks: - name: 持久化存储共享变量 set_fact: k8s_ca_hash: "{{ your_ca_hash_var }}" cacheable: yes
3. 自定义虚拟主机完整配置方案
如果要使用自定义命名的虚拟主机作为变量存储载体,推荐在inventory中配置以下参数,彻底避免各类报错:
[global_var_storage] K8S_MASTER_CA_HASH ansible_connection=local ansible_gather_facts=false ansible_python_interpreter={{ ansible_playbook_python }}
参数说明:
ansible_connection=local指定该主机走本地连接,无需建立SSH会话ansible_gather_facts=false关闭事实采集,避免虚拟主机不存在的报错ansible_python_interpreter指定使用执行playbook的本地Python解释器,避免解释器找不到的报错
提示:若要实现跨play的变量持久化共享,需要在ansible.cfg中开启事实缓存,配置示例:
[defaults] fact_caching = jsonfile fact_caching_connection = /tmp/ansible_facts_cache fact_caching_timeout = 3600
内容的提问来源于stack exchange,提问作者TSG
相关产品推荐
相关产品推荐

