Ansible 如果set#u fact的作用域是主机,我可以使用';假人';作为全局变量映射的主机?

Ansible 如果set#u fact的作用域是主机,我可以使用';假人';作为全局变量映射的主机?,ansible,ansible-playbook,Ansible,Ansible Playbook,我定义了两组主机:wmaster和wnodes。每一组在其游戏中运行: - hosts: wmaster roles: - all - swarm-mode vars: - swarm_master: true - hosts: wnodes roles: - all - swarm-mode 我使用主机变量(swarm\u master)来定义某些角色的不同行为 现在,我的第一个playbook执行一些初始化,我需要与节点共享数据。我所做

我定义了两组主机:
wmaster
wnodes
。每一组在其游戏中运行:

- hosts: wmaster
  roles:
    - all
    - swarm-mode
  vars:
    - swarm_master: true

- hosts: wnodes
  roles:
    - all
    - swarm-mode
我使用主机变量(
swarm\u master
)来定义某些角色的不同行为

现在,我的第一个playbook执行一些初始化,我需要与节点共享数据。我所做的是在第一个剧本中使用
set\u fact
,然后在第二个剧本中查找:

- set_fact:
    docker_worker_token: "{{ hostvars[smarm_master_ip].foo }}"

我不喜欢使用
swarm\u master\u ip
。如何添加一个虚拟主机:
global
,例如地址
1.1.1.1
,该主机没有任何角色,仅用于保存全局事实/变量?

如果您使用的是Ansible 2,那么您可以在第一次玩游戏时使用:

- name: set fact on swarm nodes
  set_fact: docker_worker_token="{{ some_var }}"
  delegate_to: "{{ item }}"
  delegate_facts: True
  with_items: "{{ groups['wnodes'] }}"
这应该将
set_fact
任务委托给
wnodes
组中的每个主机,并且还将结果事实委托给这些主机,而不是在第一个重头戏当前针对的库存主机上设置事实

如何添加一个虚拟主机:全局

事实上,我发现这个建议在某些情况下非常有用

---
- hosts: my_server

  tasks:

      # create server_fact somehow

    - add_host:
        name: global
        my_server_fact: "{{ server_fact }}"

- hosts: host_group

  tasks:
    - debug: var=hostvars['global']['my_server_fact']

您可以使用
hostvars[groups['wmaster'][0]
语法而不是
swarm\u master\u ip
.TIL。谢谢你发布这篇文章,真是太棒了!如果您想将该事实委托给所有主机,请对_项使用
“{{groups['all']}}”