如何在 Ansible 中销毁/删除/取消设置变量值?

如何在 Ansible 中销毁/删除/取消设置变量值?

有没有办法销毁 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

相关内容