如何设置在Ansible角色的所有主机上都可见的事实开关

如何设置在Ansible角色的所有主机上都可见的事实开关,ansible,Ansible,我在扮演一个角色: - name: Check if manager already configured shell: > docker info | perl -ne 'print "$1" if /Swarm: (\w+)/' register: swarm_status - name: Init cluster shell: >- docker swarm init --advertise-addr "{{ ansible_default

我在扮演一个角色:

- name: Check if manager already configured
  shell: >
    docker info | perl -ne 'print "$1" if /Swarm: (\w+)/'
  register: swarm_status

- name: Init cluster
  shell: >-
    docker swarm init
    --advertise-addr "{{ ansible_default_ipv4.address }}"
  when: "'active' not in swarm_status.stdout_lines"

- name: Get worker token
  shell: docker swarm join-token -q worker
  register: worker_token_result

- set_fact:
    worker_token: "{{ worker_token_result.stdout  }}"
然后我想访问另一台主机上的worker_令牌。这是我的主要剧本,事实是在swarm master角色中定义的

- hosts: swarm_cluster
  become: yes
  roles:
    - docker

- hosts: swarm_cluster:&manager
  become: yes
  roles:
    - swarm-master

- hosts: swarm_cluster:&node
  become: yes
  tasks:
    - debug:
        msg: "{{ worker_token }}"
我得到了一个未定义的变量。如何使其在全球可见?
当然,如果我在同一台主机上运行debug,它会非常有效。

如果您的目标只是从另一台主机上访问
worker\u令牌
,您可以使用
hostvars
变量,并在定义变量的组中进行迭代,如下所示:

- hosts: swarm_cluster:&node
  tasks:
  - debug:
      msg: "{{ hostvars[item]['worker_token'] }}"
    with_items: "{{ groups['manager'] }}"
- hosts: all
  tasks:
  - set_fact:
      worker_token_global: "{{ hostvars[item]['worker_token'] }}"
    with_items: "{{ groups['manager'] }}"

- hosts: swarm_cluster:&node
  tasks:
  - debug:
      var: worker_token_global
如果您的目标是全局定义变量,则可以添加步骤在所有主机上定义变量,如下所示:

- hosts: swarm_cluster:&node
  tasks:
  - debug:
      msg: "{{ hostvars[item]['worker_token'] }}"
    with_items: "{{ groups['manager'] }}"
- hosts: all
  tasks:
  - set_fact:
      worker_token_global: "{{ hostvars[item]['worker_token'] }}"
    with_items: "{{ groups['manager'] }}"

- hosts: swarm_cluster:&node
  tasks:
  - debug:
      var: worker_token_global

如果所有操作都在同一个剧本中完成,您可以使用
hostvars[manager]从工作人员处访问您的管理人员的事实。工作人员令牌
变量是按主机设置的,就像安装模块发现的事实一样。在ansible playbook运行期间,这些变量将可用于后续播放。将cacheable设置为yes,以使用事实缓存跨执行保存变量。使用set_fact创建的变量具有不同的优先级,这取决于它们是否缓存。OMG。我花了一天的时间才明白,但它确实有效。谢谢。:)