Ansibleの9:条件文
プレイの結果は変数、fact、または前のタスクの実行結果に依存する場合があり、条件文に使用する必要があります.
一、when特定のホストで特定のステップをスキップする必要がある場合があります.例えば、パッケージをインストールする場合、ホストのオペレーティングシステムのタイプを指定する必要があります.あるいは、オペレーティングシステムのハードディスクがいっぱいになった後、ファイルを空にする必要があります.など、when文を使用して判断することができます.whenキーワードの後ろにpythonの式が付いています.式では任意の変数やfactを使用できます.式の結果がfalseを返すと、今回のタスクはスキップされます.
1、基本用法、例:
条件文には、一定の条件に達したときに一時停止し、入力の確認を待つ方法もあります.一般的に、ansibleがerrorに遭遇すると、実行が直接終了します.予想外の状況に遭遇したときにpauseモジュールを使用することで、ユーザーがタスクを継続するかどうかを自分で決定することができます.
オペレーティングシステムが"CentOS"である場合、Ansibleがインポートする最初のファイルは"vars/CentOSである.yml’,続いて’/var/os_defaults.yml'、このファイルが存在しない場合.また、リストに見つからないと、エラーが表示されます.Debianシステムでは、最初に表示されるのは'vars/Debian.「vars/centOSではなくyml」yml'、見つからない場合はデフォルトファイル'vars/os_を探しますdefaults.yml’.
一、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