同一剧本中主机之间的 Ansible 传递事实
Ansible pass fact between hosts in the same playbook
我正在尝试将事实从 host1 传递到 host2,但是当 ansible 到达 host2 时
它说“未定义的变量”
代码:
- name: some playbook
gather_facts: no
hosts: host1
tasks:
- set_fact:
fact1: "foo"
- hosts: host2
gather_facts: no
tasks:
- debug:
msg: "{{ fact1 }}"
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'] }}"
一般来说,这个用例可以分三步解决。创建、共享和使用变量。例如,给定库存
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”添加到 plays 中。
我正在尝试将事实从 host1 传递到 host2,但是当 ansible 到达 host2 时 它说“未定义的变量”
代码:
- name: some playbook
gather_facts: no
hosts: host1
tasks:
- set_fact:
fact1: "foo"
- hosts: host2
gather_facts: no
tasks:
- debug:
msg: "{{ fact1 }}"
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'] }}"
一般来说,这个用例可以分三步解决。创建、共享和使用变量。例如,给定库存
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”添加到 plays 中。