【问题标题】:If set_fact is scoped to a host, can I use 'dummy' host as a global variable map?如果 set_fact 的范围为主机,我可以使用“虚拟”主机作为全局变量映射吗?
【发布时间】:2016-08-29 13:33:48
【问题描述】:

我定义了两组主机:wmasterwnodes。每个小组都在各自的游戏中运行:

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

- hosts: wnodes
  roles:
    - all
    - swarm-mode

我使用主机变量 (swarm_master) 来定义某些角色的不同行为。

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

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

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

【问题讨论】:

  • 您可以使用hostvars[groups['wmaster'][0]] 语法代替swarm_master_ip

标签: ansible ansible-playbook


【解决方案1】:

如果您使用的是 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'] }}"

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

【讨论】:

  • TIL。感谢您张贴此,工作请客!如果您想将事实委托给 所有 主机,请使用 with_items: "{{ groups['all'] }}"
【解决方案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']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 2014-10-06
    相关资源
    最近更新 更多