如何在ansible角色中保留ansible变量?

J0h*_*4lt 8 ansible

我在剧中注册了一个变量.

---
- 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)

如何在同一个游戏中访问在单独角色中注册的变量?

编辑以清楚地了解事物的组合:

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
Run Code Online (Sandbox Code Playgroud)

Tim*_*ley 6

注意:这是指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)

(注意缺少引号,因为它是变量,而不是字符串文字.)

稍微尴尬,但这些组合到目前为止满足了我的所有需求.