有没有办法销毁 Ansible 中的变量?
实际上,我在所有角色中为相应的包使用了 {{version}} 变量。当我运行多个角色时,一个角色的版本值会传递给另一个角色 - 这是因为对于某些角色,我没有提供版本值,因此它可以安装适用于相应 m/c(如 ubuntu/redhat 等)的该包的默认版本。
这是我的角色模板。来自 mysql 的 {{version}} 值正在传递给 rabbitmq。
roles:
- { role: mysql }
- { role: rabbitmq}
如果我可以破坏/删除每个角色中的版本值,我相信这应该可以解决问题。
答案1
正如已经指出的那样,无法在 Ansible 中取消设置变量。
通过在变量名中添加前缀(如rabbitmq_version
等)来避免这种情况。恕我直言,这是最佳做法。
除了避免您遇到的情况之外,这还会使您的host_vars
和更加清晰group_vars
。
答案2
不,没有办法在 Ansible 中取消设置变量(顶层)。
您唯一能做的就是创建一个字典,并将变量作为键存储在该字典中。清除“父”字典实际上会使dictionary.key is defined
条件表达式起作用。
答案3
要取消设置变量,请尝试运行 set_fact 任务将变量设置为 null,例如:
- name: Unset variables
set_fact:
version:
other_var:
如果你有一个完整的字典,可以用 覆盖字典null
,例如:
- name: Set dict
set_fact:
dict:
rabbitmq_version: 1
other_version: 2
- name: override dict to null
set_fact:
dict:
类似other_var:
just 的内容"other_var": null
在 JSON 中。这就是在 Ansible 中取消设置变量的方法。祝您有美好的一天。
答案4
在 Ansible 2.12 中使用undef()
如下函数:
airflow_pip_version: "{{ undef() }}" # unsets default: 20.2.4
此后跳过以下任务:
- name: Airflow | Install pip "{{ airflow_pip_version }}" version
pip:
name: pip
version: "{{ airflow_pip_version }}"
when: airflow_pip_version is defined
这是我想要的行为。文档:
https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_templating_undef.html