我在剧中注册了一个变量.
---
- hosts: 127.0.0.1
gather_facts: no
connection: local
sudo: no
vars_files:
- vars.yml
tasks:
- name: build load balancer
os_load_balancer: net=mc_net ext_net=vlan3320 name=load_balancer protocol=HTTPS port=80
register: my_lb
Run Code Online (Sandbox Code Playgroud)
我可以访问该变量,直到我在角色中发出请求.
例如,在同一个运行中的单独角色中,我想访问该注册变量:
- debug: var=my_lb
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
{'msg': "AnsibleUndefinedVariable: One or more undefined variables: 'my_lb' is undefined", 'failed': True}
Run Code Online (Sandbox Code Playgroud)
如何在同一个游戏中访问在单独角色中注册的变量?
编辑以清楚地了解事物的组合:
Run Code Online (Sandbox Code Playgroud)Top Play -includes: - Sub play 1 - registers variable foo - Sub play 2 -includes: - sub play A - role 1 - role 2 - role 3 - references variable foo in template - Sub play B - Sub play 3
注意:这是指Ansible 1.X. 我怀疑变量解析和范围已经与Ansible 2.0发生了很大的变化,所以请记住这一点.如果我有时间,我会尝试更新答案(或者其他人可能会回答v2.0!)
这里有两个选择.最简单的方法是在顶级剧本中定义变量,然后将它们传播到各种角色中.您可以将它们设置为简单变量,也可以pre_tasks用于动态查找/计算值,例如
vars:
foo_static: "value_bar"
pre_tasks:
- set_fact:
foo_ncpu: "{{ ansible_processor_vcpus }}"
roles:
- {role: role1, role1_var1: "{{foo_static}}", role1_var2: "{{foo_ncpu}}" }
- {role: role2, role2_var1: "{{foo_static}}", role2_var2: "{{foo_ncpu}}" }
Run Code Online (Sandbox Code Playgroud)
第二个选项要求您将任务添加到从中提取变量所需的任何角色(尽管所有ansible角色都是开源的,这应该很容易).诀窍是使用set_fact将变量导出为'host_fact',例如
- name: Export role1_varfoo to a 'host-fact' type variable
set_fact:
role1_varfoo: "{{ role1_varfoo }}"
Run Code Online (Sandbox Code Playgroud)
然后可以像以后一样访问它:
vars:
role2_varfoo: "{{ hostvars['myhost']['role1_varfoo']}}"
Run Code Online (Sandbox Code Playgroud)
正如在ansible docs的这一点中所描述的那样.
请注意,如果您总是想要查找当前计算机的主机变量,而您正在运行命令(不知道它在ansible主机文件中实际调用了什么),您可以inventory_hostname像这样使用变量:
vars:
role2_varfoo: "{{ hostvars[inventory_hostname]['role1_varfoo']}}"
Run Code Online (Sandbox Code Playgroud)
(注意缺少引号,因为它是变量,而不是字符串文字.)
稍微尴尬,但这些组合到目前为止满足了我的所有需求.
| 归档时间: |
|
| 查看次数: |
26672 次 |
| 最近记录: |