Ansibleの9:条件文


プレイの結果は変数、fact、または前のタスクの実行結果に依存する場合があり、条件文に使用する必要があります.
一、when特定のホストで特定のステップをスキップする必要がある場合があります.例えば、パッケージをインストールする場合、ホストのオペレーティングシステムのタイプを指定する必要があります.あるいは、オペレーティングシステムのハードディスクがいっぱいになった後、ファイルを空にする必要があります.など、when文を使用して判断することができます.whenキーワードの後ろにpythonの式が付いています.式では任意の変数やfactを使用できます.式の結果がfalseを返すと、今回のタスクはスキップされます.
1、基本用法、例:
---
- name: Install VIM
 hosts: all  
 tasks:

   - name:Install VIM via yum
     yum: name=vim-enhanced state=installed
     when: ansible_os_family =="RedHat"
   - name:Install VIM via apt
     apt: name=vim state=installed
     when: ansible_os_family =="Debian"
   - name: Unexpected OS family
     debug: msg="OS Family ` ansible_os_family ` is not supported" fail=yes
     when: not ansible_os_family =="RedHat" or ansible_os_family =="Debian"

条件文には、一定の条件に達したときに一時停止し、入力の確認を待つ方法もあります.一般的に、ansibleがerrorに遭遇すると、実行が直接終了します.予想外の状況に遭遇したときにpauseモジュールを使用することで、ユーザーがタスクを継続するかどうかを自分で決定することができます.
- name: pause for unexpected conditions
 pause: prompt="Unexpected OS"
 when: ansible_os_family !="RedHat"
2、 when   jinja2   ,  :
tasks:
  - command: /bin/false
    register: result        # result
    ignore_errors: True    #
  - command: /bin/something
    when: result|failed    #   failed true
  - command: /bin/something_else
    when: result|success    # success true
  - command: /bin/still/something_else
    when: result|skipped    # skipped true
  - command: /bin/foo
    when: result|changed    # changed true
- hosts: all
  user: root
  vars:
    epic: true
  tasks:    
  - shell: echo "This certainly is epic!"     
    when: epic
    
  - shell: echo "This certainly is not epic!"
    when: not epic
4、       ,     jinja2 'defined'    ,  :

tasks:
   - shell: echo "I've got '{{ foo }}' and am not afraid to use it!"
      when: foo is defined
    - fail: msg="Bailing out. this play requires 'bar'"
      when: bar is not defined
5、when           ,  :
tasks:
    - command: echo {{ item }}
      with_items: [ 0, 2, 4, 6, 8, 10 ]
      when: item > 56、 include roles when:
 include      :- include: tasks/sometasks.yml
  when: "'reticulating splines' in output"
 roles      :- hosts: webservers
  roles:
     - { role: debian_stock_config, when: ansible_os_family == 'Debian' }

    ,       Playbook         ,    debian centos   apache,apache     ,  when  ,             :
---
- hosts: all
  remote_user: root
  vars_files:
    - "vars/common.yml"
    - [ "vars/{{ ansible_os_family }}.yml", "vars/os_defaults.yml" ]
  tasks:
  - name: make sure apache is running
    service: name={{ apache }} state=running yml , :

---
# for vars/CentOS.yml
apache: httpd
somethingelse: 42

オペレーティングシステムが"CentOS"である場合、Ansibleがインポートする最初のファイルは"vars/CentOSである.yml’,続いて’/var/os_defaults.yml'、このファイルが存在しない場合.また、リストに見つからないと、エラーが表示されます.Debianシステムでは、最初に表示されるのは'vars/Debian.「vars/centOSではなくyml」yml'、見つからない場合はデフォルトファイル'vars/os_を探しますdefaults.yml’. 
 、with_first_found
    ,            ,         ,          ,    with_first_found   :
- name: template a file
   template: src={{ item }} dest=/etc/myapp/foo.conf
   with_first_found:
     - files:
        - {{ ansible_distribution }}.conf
        - default.conf
       paths:
        - search_location_one/somedir/
        - /opt/other_location/somedir/
 、failed_when
failed_when   ansible         ,  fail     when         。    :
- name: this command prints FAILED when it fails
  command: /usr/bin/example-command -x -y -z
  register: command_result
  failed_when: "'FAILED' in command_result.stderr" fail when , :
- name: this command prints FAILED when it fails
  command: /usr/bin/example-command -x -y -z
  register: command_result
  ignore_errors: True

- name: fail the play if the previous command did not succeed
  fail: msg="the command failed"
  when: "'FAILED' in command_result.stderr" 、changed_when
                  ,             ,       ,   changed    ,        ,   OK    ,       ,   skipped    。      changed_when     changed    。    :

  - shell: /usr/bin/billybass --mode="take me to the river"
    register: bass_result
    changed_when: "bass_result.rc != 2"    # task ,bass_result.rc 2 , changed

  # this will never report 'changed' status
  - shell: wall 'beep'
    changed_when: False    # changed_when false , task , changed