web-dev-qa-db-ja.com

Ansible:when句の複数または条件付き

タスクを実行する必要があるかどうかを判断するために、whenステートメントで複数の条件式を使用しようとすると問題が発生します。基本的に私は、セキュリティパッチ、カーネルのみのパッチ、およびvarファイルでパッケージを指定するオプションを使用して自動システムパッチを実行するためのプレイブックを作成しています。

以下のコマンドでプレイブックを実行し、拡張変数オプション(-e)を使用して変数を定義します

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

デフォルトでは、プレイブックはカーネルを除くシステム上のすべてのパッケージを更新しますが、いくつかの変数のいずれかを指定した場合は、そのアクションをスキップします。私が持っているコードは次のとおりです:

_- 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" 
_

私は次のすべての組み合わせを試しました。

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 ) <-この場合、プレイブックを実行するたびにすべての変数を定義するわけではないため、未定義のエラーがスローされます

_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_を使用していますが、ユーザーが追加の変数を使用する必要がない方がよいでしょう。このデフォルトのアクションをスキップするだけです。

また、アップグレードの前後にパッケージのリストを収集して最終的に比較およびレポートするため、タグを使用していません。ローカルアクションコマンドであるため、それらを実行できません。これが、拡張変数を介して複数のタスクのオンとオフを切り替える1つのロールを使用している理由です。私は初心者なので、プレイブックをより効率的な方法で書き換える提案を受け入れます。

3
Jay

とても簡単な答えでした!

次の作品:

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

@techrafがコメントで述べたように、defined/undefinedは厄介なテストです...

このようなリファクタリング:

when:
  - ansible_os_family == "RedHat"
  - security|d('') != '' or kernel|d('') != '' or specified_packages|d('') != ''

更新。再現可能な例:

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

実行:

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

バージョン:

$ pip list | grep -iP 'ansible|jinja'
ansible (2.2.1.0)
Jinja2 (2.8)
3