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

MMA*_*MMA 15 ansible ansible-playbook

有没有办法销毁 Ansible 中的变量?

实际上,我在各个包的所有角色中都使用了一个 {{version}} 变量。当我运行多个角色时,一个角色的版本值会传递给另一个角色 - 这是因为对于某些角色,我没有提供版本值,以便它可以安装可用于相应 m/c 的该软件包的默认版本,例如 ubuntu/红帽等

这是我的角色模板。来自 mysql 的 {{version}} 值被传递给 rabbitmq。

    roles:
- { role: mysql }
- { role: rabbitmq}
Run Code Online (Sandbox Code Playgroud)

如果我可以在每个角色中销毁/删除版本的值,我相信它应该可以解决问题。

Hen*_*gel 15

正如已经指出的那样,在 Ansible 中无法取消设置变量。

通过为变量名称添加前缀来避免这种情况,例如rabbitmq_version等等。恕我直言,这是一个最佳实践。

除了避免您遇到的情况外,这还将使您的host_varsgroup_vars.


tec*_*raf 8

不,无法在 Ansible 中取消设置变量(顶层)。

您唯一可以做的就是创建一个字典并将变量作为键存储在该字典中。清除“父”字典本质上将使dictionary.key is defined条件表达式起作用。


小智 7

要取消设置变量,请尝试运行 set_fact 任务将变量设置为 null,例如:

- name: Unset variables
  set_fact:
    version:
    other_var:
Run Code Online (Sandbox Code Playgroud)

如果您有一个完整的字典,可以用 覆盖 dict null,例如:

- name: Set dict
  set_fact:
    dict:
      rabbitmq_version: 1
      other_version: 2

- name: override dict to null
  set_fact:
    dict:
Run Code Online (Sandbox Code Playgroud)

就像other_var:"other_var": null在 JSON 中一样。这就是您如何在 Ansible 中取消设置变量的方法。祝你今天过得愉快。


小智 6

您应该使用每个角色的变量来代替:

  roles:
    - role: mysql
      version: mysql_version
    - role: rabbitmq
      version: rabbitmq_version
Run Code Online (Sandbox Code Playgroud)

或者

  roles:
    - { role: mysql, version: mysql_version }
    - { role: rabbitmq, version: rabbitmq_version }
Run Code Online (Sandbox Code Playgroud)