同一剧本中主机之间的 Ansible 传递事实

时间:2021-07-06 18:31:05

标签: ansible ansible-facts

我试图将一个事实从主机 1 传递到主机 2,但是当 ansible 到达主机 2 时 它说“未定义的变量”

代码:

- name: some playbook
  gather_facts: no
  hosts: host1
  tasks:

    - set_fact:
        fact1: "foo"

- hosts: host2
  gather_facts: no
  tasks:

    - debug:
        msg: "{{ fact1 }}"

2 个答案:

答案 0 :(得分:3)

set_fact 模块设置宿主变量,您可以使用 hostvars 访问这些变量。

- name: some playbook
  gather_facts: no
  hosts: host1
  tasks:

  - set_fact:
      fact1: "foo"

- hosts: host2
  gather_facts: no
  tasks:

  - debug:
      msg: "{{ hostvars['host1']['fact1'] }}"

答案 1 :(得分:0)

一般来说,这个用例可以通过三个步骤来解决。创建、共享和使用变量。例如,给定库存

shell> cat hosts
host1
host2

剧本按预期工作

- name: Run single host and create facts
  hosts: host1
  tasks:
    - set_fact:
        fact1: foo

- name: Share facts among all hosts
  hosts: all
  tasks:
    - set_fact:
        fact1: "{{ hostvars.host1.fact1 }}"
      run_once: true

- name: Use shared facts
  hosts: host2
  tasks:
    - debug:
        var: fact1

如果您将用例扩展为“将事实从一组主机传递到另一组主机”,问题是如何有效地共享变量?动态创建剧本。例如,给定库存

shell> cat hosts
host1
host2
host3
host4

让host1 和host4 创建变量,host2 和host3 使用它们。创建模板

shell> cat share-vars.yml.j2
- name: Share facts among all hosts
  hosts: all
  tasks:
    - set_fact:
{% for i in share_vars %}
        {{ i.var }}: "{{ lbr }} hostvars.{{ i.host }}.{{ i.var }} {{ rbr }}"
{% endfor %}
      run_once: true

和剧本

shell> cat create-share-vars.yml
- name: Create playbook share-vars.yml
  hosts: localhost
  vars:
    share_vars:
      - {host: host1, var: fact1}
      - {host: host4, var: fact4}
    lbr: "{{ '{{' }}"
    rbr: "{{ '}}' }}"
  tasks:
    - template:
        src: share-vars.yml.j2
        dest: share-vars.yml

给予

shell> cat share-vars.yml
- name: Share facts among all hosts
  hosts: all
  tasks:
    - set_fact:
        fact1: "{{ hostvars.host1.fact1 }}"
        fact4: "{{ hostvars.host4.fact4 }}"
      run_once: true

导入这个剧本,例如

shell> cat playbook.yml
- hosts: host1
  tasks:
    - set_fact:
        fact1: foo

- hosts: host4
  tasks:
    - set_fact:
        fact4: bar

- import_playbook: share-vars.yml

- hosts: host2,host3
  tasks:
    - debug:
        var: fact1
    - debug:
        var: fact4

给出(删减)

PLAY [host2,host3] *********************************************************

TASK [debug] ***************************************************************
ok: [host2] => 
  fact1: foo
ok: [host3] => 
  fact1: foo

TASK [debug] ***************************************************************
ok: [host2] => 
  fact4: bar
ok: [host3] => 
  fact4: bar

注意事项

  • 模板的优势是什么?更改变量 share_vars 并在需要时重建导入的游戏。不要更改代码。
  • 在 Ansible 中,无法替换作业的左侧,即没有 symbolic reference
  • 如果您不需要,请将“gather_facts: false”添加到剧中。
相关问题