如果set_fact的范围限定为主机,我可以使用'dummy'主机作为全局变量映射吗?

igr*_*igr 4 ansible ansible-playbook

我已经定义了两组主机:wmasterwnodes.每组都在其游戏中运行:

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

- hosts: wnodes
  roles:
    - all
    - swarm-mode
Run Code Online (Sandbox Code Playgroud)

我使用宿主变量(swarm_master)来定义某个角色的不同行为.

现在,我的第一个playbook执行一些初始化,我需要与节点共享数据.我做的是set_fact在第一次播放中使用,然后在第二次播放中查找:

- set_fact:
    docker_worker_token: "{{ hostvars[smarm_master_ip].foo }}"
Run Code Online (Sandbox Code Playgroud)

我不喜欢使用swarm_master_ip.如何添加一个虚拟主机:global例如,地址1.1.1.1没有任何角色,并且仅用于保存全局事实/变量?

yda*_*coR 8

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

- name: set fact on swarm nodes
  set_fact: docker_worker_token="{{ some_var }}"
  delegate_to: "{{ item }}"
  delegate_facts: True
  with_items: "{{ groups['wnodes'] }}"
Run Code Online (Sandbox Code Playgroud)

这应该将set_fact任务委派给组中的每个主机,wnodes并且还将结果事实委托给这些主机,而不是在第一次播放当前作为目标的库存主机上设置事实.

  • 直到。感谢您发布此信息,请享用!如果您想将事实委托给 _all_ 主机,请使用 `with_items: "{{ groups['all'] }}"` (3认同)

Tom*_*Tom 2

如何添加虚拟主机:全局

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

---
- 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']
Run Code Online (Sandbox Code Playgroud)