如何在ansible中重写高优先级变量?

如何在ansible中重写高优先级变量?,ansible,global-variables,ansible-2.x,Ansible,Global Variables,Ansible 2.x,我试图用播放变量提示变量覆盖库存组变量/all变量。考虑下面的代码: 库存/集团变量/all.yml variable_1: test1 variable_2: test2 test.yml - hosts: localhost vars_prompt: - name: "variable_1" prompt: "Enter variable_1" private: no - name: "variable_2" prompt: "En

我试图用播放变量提示变量覆盖库存组变量/all变量。考虑下面的代码:

库存/集团变量/all.yml

variable_1: test1
variable_2: test2
test.yml

- hosts: localhost
  vars_prompt:
    - name: "variable_1"
      prompt: "Enter variable_1"
      private: no

    - name: "variable_2"
      prompt: "Enter variable_2"
      private: no

- hosts: group_1
  roles:
    - { role: role_1, tags: role_1 }

- hosts: group_2
  roles:
    - { role: role_2, tags: role_2 }
角色/role_1/tasks/main.yml

- name: role_1 task
  shell: echo "{{ variable_1 }}"
  register: out

- debug:
    msg: "{{ out.stdout }}"
- name: role_2 task
  shell: echo "{{ variable_2 }}"
  register: out

- debug:
    msg: "{{ out.stdout }}"
角色/role_2/tasks/main.yml

- name: role_1 task
  shell: echo "{{ variable_1 }}"
  register: out

- debug:
    msg: "{{ out.stdout }}"
- name: role_2 task
  shell: echo "{{ variable_2 }}"
  register: out

- debug:
    msg: "{{ out.stdout }}"
输出 ansible playbook-i目录/hosts.test.yml 输入变量_1:var1 输入变量_2:var2

TASK [role_1 : role_1 task] *******************************************************************************************************************************
Monday 15 January 2018  03:42:12 -0800 (0:00:02.915)       0:00:15.048 *****
changed: [xxx.xxx.com]

TASK [role_1 : debug] *************************************************************************************************************************************
Monday 15 January 2018  03:42:13 -0800 (0:00:00.525)       0:00:15.574 *****
ok: [xxx.xxx.com] => {
    "msg": "test1"
}

PLAY [group_2] ********************************************************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************************************************
Monday 15 January 2018  03:42:13 -0800 (0:00:00.051)       0:00:15.625 *****
ok: [xxx.xxx.com]

TASK [role_2 : role_2 task] *******************************************************************************************************************************
Monday 15 January 2018  03:42:15 -0800 (0:00:02.178)       0:00:17.804 *****
changed: [xxx.xxx.com]

TASK [role_2 : debug] *************************************************************************************************************************************
Monday 15 January 2018  03:42:15 -0800 (0:00:00.397)       0:00:18.202 *****
ok: [xxx.xxx.com] => {
    "msg": "test2"
}

PLAY RECAP ************************************************************************************************************************************************
localhost   : ok=1    changed=0    unreachable=0    failed=0
xxx.xxx.com : ok=3    changed=1    unreachable=0    failed=0
xxx.xxx.com : ok=3    changed=1    unreachable=0    failed=0
xxx.xxx.com : ok=3    changed=1    unreachable=0    failed=0

我想用var1和var2(vars_提示符接受的值)替代test1和test2(在inventory/group_vars/all.yml中设置的值),来覆盖variable_1和variable_2的值。有没有办法覆盖这些值?或者任何其他方法在不同的剧本中共享变量。

变量提示是绑定播放的,因此提示的
variable_1=var
variable_2=var
仅为第一个(在您的示例中为空)剧本注册,第二个和第三个剧本对此一无所知

对各个播放应用提示,或使用
set\u fact
对所有主机进行运行优先播放,如下所示:

- hosts: all
  gather_facts: no
  vars_prompt:
    - name: "variable_1"
      prompt: "Enter variable_1"
      private: no
    - name: "variable_2"
      prompt: "Enter variable_2"
      private: no
  tasks:
    - set_fact:
        variable_1: "{{ variable_1 }}"
        variable_2: "{{ variable_2 }}"

- hosts: group_1
  roles:
    - { role: role_1, tags: role_1 }

- hosts: group_2
  roles:
    - { role: role_2, tags: role_2 }
这将定义主机事实
变量_1
变量_2
,它们受主机限制(并在多个重头戏中存活),并且比库存中的组变量具有更高的优先级

注意:如果您使用标签执行任务子集,请确保您已为
set\u fact
set设置了这些标签