我想使用 ansible 创建一个服务器集群。
在一个主剧本中,我包含了一些子剧本。
- include: playbook_commandserver.yml
- include: playbook_agent.yml
在 playbook_commandserver.yml 中,我创建了命令服务器(在 aws 上)。然后,我触发一个角色,该角色使用该set_fact
模块来记住命令服务器的 dns 名称:
- name: Get hostname of command server
shell: /usr/bin/host $(/usr/bin/curl -s http://ipecho.net/plain) | /usr/bin/awk '{print $5}' | /usr/bin/awk -F 'aws.com' '{print $1"aws.com"}'
register: cs
- name: Set hostname of command server as fact
set_fact: commandserver="{{ cs.stdout }}"
事实commandserver
在同一个剧本中可用,但在同一个剧本中不可用……更不用说在playbook_agent.yml
之后包含的 中了。而它恰好在那里,我需要访问该命令服务器事实。
那么如何设置/存储对完整 ansible-run 有效的变量?
我发现了这一点: https://stackoverflow.com/questions/26732241/ansible-save-registered-variable-to-file 然而对我来说,这看起来像是一个丑陋的黑客。
这个问题没有更好的解决方案吗?有没有办法设置一个对整个 ansible-run 有效的变量?
答案1
是的,这是可能的。当您使用set_fact
模块,这个事实可以通过“hostvars”访问。因此,如果您像这样定义变量 commandserver:
- name: Set hostname of command server as fact
set_fact: commandserver="{{ cs.stdout }}"
然后您可以通过这种方式在同一剧本的其他包含的剧本中访问此变量(调试模块仅仅是一个示例):
- debug: msg="{{ hostvars['put the hostname in here']['commandserver'] }}"