如何在 Ansible 中取消设置变量?

pha*_*naz 4 ansible ansible-facts

是否有可能在 Ansible 中取消设置事实(变量)?

以检查失败的方式取消设置is defined

对于执行决策,我定期使用 来检查条件is defined。但是,可能需要在执行前取消设置这些设置,例如,如果通过 多次使用角色include_role或通过 多次使用任务include_tasks

是否有特殊的语法,例如使用set_fact模块?

如果我理解正确的话,meta: clear_facts我会负责澄清所有事实,而不能仅限于个别事实。

Vla*_*tka 6

警告:vars:在被include_*认为include params

\n

看:

\n\n

例如,vars:以下内容不是task vars(优先级 17.)。是include params(优先级 21.)。因此,set_facts角色内部的潜在(优先级。19)不会覆盖变量 test_var

\n
    - include_role:\n        name: test_role\n      vars:\n        test_var: first run\n
Run Code Online (Sandbox Code Playgroud)\n

apply如果您想为某个角色提供task vars(优先级 17.),请使用

\n
    - include_role:\n        name: test_role\n      apply:\n        vars:\n          test_var: first run\n
Run Code Online (Sandbox Code Playgroud)\n

这尚未被记录。

\n
\n

问:“是否有可能在 Ansible 中取消设置事实(变量)?”

\n

答:不可以。无法在 Ansible 中取消设置变量。相反,可以在不同的范围内定义变量。此类变量不会在特定范围之上定义。请参阅Playbook 关键字。您可以在此范围层次结构中定义变量

\n
    \n
  • \n
  • 角色
  • \n
  • 堵塞
  • \n
  • 任务
  • \n
\n

关于如何解决用例有多种场景:"It may be necessary to unset variables before execution, e.g. if a role is used multiple times via include_role or tasks are used multiple times via include_tasks."

\n

例如创建一个角色

\n
shell> tree roles/\nroles/\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test_role\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tasks\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.yml\n
Run Code Online (Sandbox Code Playgroud)\n

与单一任务

\n
shell> cat roles/test_role/tasks/main.yml \n- debug:\n    var: test_var\n
Run Code Online (Sandbox Code Playgroud)\n

用例 1. 通过 include_role 多次使用一个角色

\n

例如,剧本

\n
- hosts: localhost\n\n  tasks:\n\n    - include_role:\n        name: test_role\n      vars:\n        test_var: first run\n\n    - include_role:\n        name: test_role\n\n    - include_role:\n        name: test_role\n      vars:\n        test_var: third run\n
Run Code Online (Sandbox Code Playgroud)\n

给出(删节)

\n
  test_var: first run\n  test_var: VARIABLE IS NOT DEFINED!\n  test_var: third run\n
Run Code Online (Sandbox Code Playgroud)\n

用例 2. 通过 include_tasks 多次使用任务

\n

同样的,下面的剧本给出了相同的结果

\n
- hosts: localhost\n\n  tasks:\n\n    - include_tasks: roles/test_role/tasks/main.yml\n      vars:\n        test_var: first run\n\n    - include_tasks: roles/test_role/tasks/main.yml\n\n    - include_tasks: roles/test_role/tasks/main.yml\n      vars:\n        test_var: third run\n
Run Code Online (Sandbox Code Playgroud)\n

用例 3. 使用角色

\n

下面的剧本也给出了相同的结果

\n
- hosts: localhost\n\n  roles:\n\n    - role: test_role\n      test_var: first run\n\n    - role: test_role\n\n    - role: test_role\n      test_var: third run\n
Run Code Online (Sandbox Code Playgroud)\n
\n \n

笔记

\n
    \n
  • 请参阅变量范围

    \n
  • \n
  • 最好了解声明空变量时会发生什么。例如,剧本

    \n
  • \n
\n
- hosts: localhost\n  vars:\n    test_var: default_value\n  tasks:\n    - debug:\n        var: test_var\n    - set_fact:\n        test_var:\n    - debug:\n        msg: "test_var is defined: {{ test_var is defined }}"\n    - debug:\n        var: test_var\n
Run Code Online (Sandbox Code Playgroud)\n

显示(删节)空变量是definednull。当您将变量显式设置为 null 时,您将收到相同的结果test_var: !!null

\n
TASK [debug] **********************************************************************************************\nok: [localhost] => \n  test_var: default_value\n\nTASK [set_fact] *******************************************************************************************\nok: [localhost]\n\nTASK [debug] **********************************************************************************************\nok: [localhost] => \n  msg: \'test_var is defined: True\'\n\nTASK [debug] **********************************************************************************************\nok: [localhost] => \n  test_var: null\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 最好理解的是,默认值在定义变量时不会设置值。例如,
  • \n
\n
    - debug:\n        var: test_var\n    - debug:\n        var: test_var|default(\'default when undef\')\n
Run Code Online (Sandbox Code Playgroud)\n

显示过滤器默认默认情况下不关心该值为并且不设置该值,因为该变量已定义

\n
TASK [debug] **********************************************************************************************\nok: [localhost] => \n  test_var: null\n\nTASK [debug] **********************************************************************************************\nok: [localhost] => \n  test_var|default(\'default when undef\'): \'\'\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 如果您想在变量为null时也设置默认值,请设置过滤器的第二个参数True。例如,
  • \n
\n
    - debug:\n        var: test_var\n    - debug:\n        var: test_var|default(\'default when undef or null\', true)\n
Run Code Online (Sandbox Code Playgroud)\n

给出

\n
TASK [debug] **********************************************************************************************\nok: [localhost] => \n  test_var: null\n\nTASK [debug] **********************************************************************************************\nok: [localhost] => \n  test_var|default(\'default when undef or null\', true): default when undef or null\n
Run Code Online (Sandbox Code Playgroud)\n
\n