我如何 modify/overwrite Ansible 角色中的角色变量?

How can I modify/overwrite a role variable inside the role in Ansible?

我正在编写一个角色,用户可以将列表传递给该角色。在该角色中,我想有条件地将项目添加到此列表中,然后再以我的角色进行处理。角色变量称为 my_list。它像这样传递给角色:

---
- name: Do something
  hosts: all
  roles:
    - role: my.role
      my_list:
        - { name: test1, url: 'http://foo.bar' }
        - { name: test2, url: 'http://foo.bar' }

在我的角色中,我尝试像这样修改角色变量:

---
- name: Do something
  ansible.builtin.set_fact:
    my_list: "{{ my_list + internal_list }}"
  when: condition_is_met

- debug:
    var: my_list

但是不行;该列表不会被修改。如果我使用新的变量名,它会起作用:

---
- name: Do something
  ansible.builtin.set_fact:
    my_new_list: "{{ my_list + internal_list }}"
  when: condition_is_met

- debug:
    var: my_new_list

所以我认为它与变量范围有关。 set_fact 将设置一个宿主变量,它的优先级低于角色变量。如果set_fact不适合修改角色变量,那怎么办呢?

如果 internal_list 是字符串

,试试这个
- name: Do something
  ansible.builtin.set_fact:
    my_list: "{{ my_list + [ internal_list ] }}"
  when: condition_is_met

如果 internal_list 是列表

,试试这个
- name: Do something
  ansible.builtin.set_fact:
    my_list: "{{ my_list + [ item ] }}"
  loop: internal_list
  when: condition_is_met

set_fact 将覆盖角色变量,如果它实际上是角色变量而不是角色参数。摘自Understanding variable precedence

  1. role vars (defined in role/vars/main.yml)
  2. block vars (only for tasks in block)
  3. task vars (only for the task)
  4. include_vars
  5. set_facts / registered vars
  6. role (and include_role) params

有:

---
- name: Do something
  hosts: all
  roles:
    - role: my.role
      my_list:
        - { name: test1, url: 'http://foo.bar' }
        - { name: test2, url: 'http://foo.bar' }

我将 my_list 作为角色参数传递。如果我将它作为角色变量传递,set_fact 有效:

---
- name: Do something
  hosts: all
  roles:
    - role: my.role
      vars:
        my_list:
          - { name: test1, url: 'http://foo.bar' }
          - { name: test2, url: 'http://foo.bar' }