我如何 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:
- role vars (defined in role/vars/main.yml)
- block vars (only for tasks in block)
- task vars (only for the task)
- include_vars
- set_facts / registered vars
- 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' }
我正在编写一个角色,用户可以将列表传递给该角色。在该角色中,我想有条件地将项目添加到此列表中,然后再以我的角色进行处理。角色变量称为 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:
- role vars (defined in role/vars/main.yml)
- block vars (only for tasks in block)
- task vars (only for the task)
- include_vars
- set_facts / registered vars
- 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' }