Ansible:when子句中的多个和/或条件

Jay*_*Jay 3 ansible ansible-2.x

尝试在when语句中使用多个和/或条件来决定是否需要运行任务时,我遇到了问题.基本上我正在制作一本剧本来自动化系统修补,其中包括安全补丁,仅内核补丁和在var文件中指定包的选项.

我使用以下命令运行playbook并通过扩展变量选项定义变量(-e)

ansible-playbook site.yml -i inventory --ask-vault -u (username) -e "security=true restart=true" -k -K

默认情况下,playbook将更新除内核之外的系统上的每个包,但如果我指定任何一些变量,我想跳过该操作.我的代码如下:

- name: Update all packages
  yum:
     name: "*"
     state: latest
     exclude: "kernel*"
  when: security is not defined or kernel is not defined  or specified_packages 
 is not defined and ansible_os_family == "RedHat" 
Run Code Online (Sandbox Code Playgroud)

我尝试了以下所有组合:

when: (ansible_os_family == "RedHat") and (security is defined or kernel is defined or specified_packages is defined)

when: (ansible_os_family == "RedHat") and (security == true or kernel == true or specified_packages == true ) < - 这种情况会抛出一个未定义的错误,因为每次运行playbook时我都没有定义所有变量

when: ansible_os_family == "RedHat" when: security is defined or kernel is defined or specified_packages is defined

注意:我知道并使用了一个额外的变量,例如"skip"来跳过此任务并使用when子句,when: ansible_os_family == "RedHat" and skip is not defined但我不希望我的用户只需要使用额外的变量来跳过此默认操作.

我也没有使用标签,因为我在升级之前和之后收集了一个包列表,最后进行比较和报告,因此我无法运行它们,因为它们是本地操作命令.这就是为什么我使用一个角色,通过扩展变量打开和关闭多个任务.我对任何以更有效的方式重写剧本的建议持开放态度,因为我有点像菜鸟.

Jay*_*Jay 9

这是一个简单的答案!

以下作品:

when: not (security is defined or kernel is defined or specified_packages is defined) and ansible_os_family == "RedHat"
Run Code Online (Sandbox Code Playgroud)


Kon*_*rov 6

正如@techraf 在评论中指出的那样,defined/undefined是一个令人讨厌的测试......

像这样重构:

when:
  - ansible_os_family == "RedHat"
  - security|d('') != '' or kernel|d('') != '' or specified_packages|d('') != ''
Run Code Online (Sandbox Code Playgroud)

更新。可重现的例子:

- hosts: localhost
  gather_facts: no
  tasks:
    - debug:
        msg: hello
      when:
        - '"RedHat" == "RedHat"'
        - security|d('') != '' or kernel|d('') != '' or specified_packages|d('') != ''
Run Code Online (Sandbox Code Playgroud)

执行:

ansible-playbook -e kernel=true playbook.yml

PLAY [localhost] ***************************************************************

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "hello"
}

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0
Run Code Online (Sandbox Code Playgroud)

版本:

$ pip list | grep -iP 'ansible|jinja'
ansible (2.2.1.0)
Jinja2 (2.8)
Run Code Online (Sandbox Code Playgroud)