我坐在一个相当复杂的Ansible项目前面,我们用它来设置我们的本地开发环境(多个VM ),有一个角色使用Ansible收集的事实在每个VM上设置/etc/hosts文件。不幸的是,当您只想为一台主机运行攻略时(使用-limit参数),来自其他主机的事实(显然)就会丢失。
有没有一种方法可以强制Ansible收集所有主机上的事实,即使您将攻略限制到一个特定的主机?
我们试图向行动手册添加一个剧本,以从所有主机收集事实,但当然这也会限制在-limit参数给定的一个主机上。如果有一种方法可以在其他游戏之前在所有主机上运行此游戏,那将是完美的。
我用谷歌搜索了一下,找到了使用redis的事实缓存的解决方案,但由于我们的攻略是在本地使用的,我想避免需要额外的软件。我知道,这不是什么大问题,但我只是在寻找一种“更干净”的、仅适用于Ansible的解决方案,并且想知道是否存在这样的解决方案。
发布于 2017-08-15 07:13:06
Ansible版本2引入了一种干净的、官方的方式来使用委托事实来完成这项工作(请参阅:http://docs.ansible.com/ansible/latest/playbooks_delegation.html#delegated-facts)。
when: hostvars[item]['ansible_default_ipv4'] is not defined是一种检查,以确保您不会检查您已经知道的主机中的事实
---
# This play will still work as intended if called with --limit "<host>" or --tags "some_tag"
- name: Hostfile generation
hosts: all
become: true
pre_tasks:
- name: Gather facts from ALL hosts (regardless of limit or tags)
setup:
delegate_to: "{{ item }}"
delegate_facts: True
when: hostvars[item]['ansible_default_ipv4'] is not defined
with_items: "{{ groups['all'] }}"
tasks:
- template:
src: "templates/hosts.j2"
dest: "/etc/hosts"
tags:
- hostfile
...发布于 2015-05-04 19:24:19
通常,即使您不想在所有主机上运行任务,获取所有主机的事实的方法也是这样做的:
- hosts: all
tasks: [ ] 但正如您所提到的,--limit参数将限制将应用于哪些主机。
我不认为有一种方法可以简单地告诉Ansible忽略任何plays上的--limit参数。然而,在Ansible中可能有另一种方法可以完全完成您想要的操作。
我还没有亲自使用过它,但是从Ansible 1.8开始,fact caching就可以使用了。简而言之,启用事实缓存后,Ansible将使用redis服务器来缓存所有关于它遇到的主机的事实,您将能够在后续的攻略中引用它们:
在启用事实缓存的情况下,一个组中的计算机可以引用另一个组中的计算机的变量,尽管在当前执行/usr/bin/ansible-playbook时尚未与这些变量进行通信。
发布于 2016-07-01 07:14:38
在2016年,这似乎仍然是一个没有干净解决方案的问题,但Ansible的新版本提供了一个"jsonfile“事实缓存后端,这似乎是为了满足这一需求而在本地安装Redis的一个不错的折衷方案。现在,在使用--limit选项运行攻略之前,我只需启动一个ansible all -m setup。对爵士来说已经足够好了!
http://docs.ansible.com/ansible/playbooks_variables.html#fact-caching
https://stackoverflow.com/questions/30024664
复制相似问题