ansible
가능 : 루프 및 조건부
수색…
비고
공식 문서는 플레이 북 조건을 설명합니다.
유능한 (github)
어떤 종류의 조건문을 사용할 수 있습니까?
조건부 비아 사용 (구문은 [brackets]
) :
언제 [ when : ]
Task: - name: run if operating system is debian command: echo "I am a Debian Computer" when: ansible_os_family == "Debian"
루프 [ with_items : ]
루프 [ with_dicts : ]
커스텀 사실 [ when : my_custom_facts == '1234']
조건부 수입
변수를 기반으로 파일 및 템플릿 선택
[When] 조건 :`ansible_os_family`리스트
공동 사용
- 언제 : ansible_os_family == "CentOS"
- 언제 : ansible_os_family == "레드햇"
- when : ansible_os_family == "다윈"
- when : ansible_os_family == "Debian"
- 언제 : ansible_os_family == "Windows"
모든 목록
여기 토론을 기반으로 http://comments.gmane.org/gmane.comp.sysutils.ansible/4685
OS_FAMILY = dict(
RedHat = 'RedHat',
Fedora = 'RedHat',
CentOS = 'RedHat',
Scientific = 'RedHat',
SLC = 'RedHat',
Ascendos = 'RedHat',
CloudLinux = 'RedHat',
PSBM = 'RedHat',
OracleLinux = 'RedHat',
OVS = 'RedHat',
OEL = 'RedHat',
Amazon = 'RedHat',
XenServer = 'RedHat',
Ubuntu = 'Debian',
Debian = 'Debian',
SLES = 'Suse',
SLED = 'Suse',
OpenSuSE = 'Suse',
SuSE = 'Suse',
Gentoo = 'Gentoo',
Archlinux = 'Archlinux',
Mandriva = 'Mandrake',
Mandrake = 'Mandrake',
Solaris = 'Solaris',
Nexenta = 'Solaris',
OmniOS = 'Solaris',
OpenIndiana = 'Solaris',
SmartOS = 'Solaris',
AIX = 'AIX',
Alpine = 'Alpine',
MacOSX = 'Darwin',
FreeBSD = 'FreeBSD',
HPUX = 'HP-UX'
)
조건
기본 사용법
when 조건을 사용하여 작업 또는 역할 실행 여부를 제어합니다. 일반적으로 대상 시스템의 사실을 기반으로 재생 동작을 변경하는 데 사용됩니다. 이 게임 플레이를 고려하십시오.
- hosts: all
tasks:
- include: Ubuntu.yml
when: ansible_os_family == "Ubuntu"
- include: RHEL.yml
when: ansible_os_family == "RedHat"
여기서 Ubuntu.yml
과 RHEL.yml
은 특정 배포 관련 로직을 포함합니다.
또 다른 일반적인 용도는 특정 Ancial 인벤토리 그룹의 결과로 결과를 제한하는 것입니다. 다음 인벤토리 파일을 고려하십시오.
[dbs]
mydb01
[webservers]
myweb01
그리고이 플레이 북 :
- hosts: all
tasks:
- name: Restart Apache on webservers
become: yes
service:
name: apache2
state: restarted
when: webservers in group_names
이것은 group_names
매직 변수를 사용하고 있습니다.
조건부 구문 및 논리
단일 조건
통사론
when: (condition)
예
-
when: ansible_os_family == "Debian"
-
when: ansible_pkg_mgr == "apt"
-
when: myvariablename is defined
부울 필터
예
when: result|failed
다중 조건
통사론
When: condition1 and/or condition2
예 (단순)
when: ansible_os_family == "Debian" and ansible_pkg_mgr == "apt"
예 (복합)
명확성이나 우선 순위를 제어하려면 괄호를 사용하십시오. "AND"는 "OR"보다 우선 순위가 높습니다.
절은 다음과 같이 줄 수 있습니다.
when:
ansible_distribution in ['RedHat', 'CentOS', 'ScientificLinux'] and
(ansible_distribution_version|version_compare('7', '<') or
ansible_distribution_version|version_compare('8', '>='))
or
ansible_distribution == 'Fedora'
or
ansible_distribution == 'Ubuntu' and
ansible_distribution_version|version_compare('15.04', '>=')
첫 번째 분배 확인에서 "또는"을 그룹화하려면 괄호를 사용하십시오.
setup으로`ansible_os_family`와`ansible_pkg_mgr`을 얻으십시오.
설정 모듈과 필터의 Ad-Hoc 명령으로 사실 ( ansible_os_family
, ansible_pkg_mgr
)을 얻을 수 있습니다.
ansible_os_family :
$ ansible all -m setup -a 'filter=ansible_os_family' ra.local | SUCCESS => { "ansible_facts": { "ansible_os_family": "Debian" }, "changed": false }
ansible_pkg_mgr :
$ ansible all -m setup -a 'filter=ansible_pkg_mgr' debian.local | SUCCESS => { "ansible_facts": { "ansible_pkg_mgr": "apt" }, "changed": false }
간단한 "When"예제 (들)
주어진:
---
variable_name: True
그런 다음이 작업은 항상 실행됩니다.
- name: This is a conditional task
module: src=/example/ dest=/example
when: variable_name
- name: This is a conditional task
module: src=/example/ dest=/example
when: True
이 작업은 절대로 실행되지 않습니다.
- name: This is a conditional task
module: src=/example/ dest=/example
when: False
재시도 반복 검사를 위해 until을 사용할 때
이것은 시작하는 웹 애플리케이션에 대한 살아있는 체크를 구현하기 위해 until / retries / delay를 사용하는 예제입니다. 웹 응용 프로그램이 소켓 연결을 거부하는 일정 기간 (최대 3 분)이 있다고 가정합니다. 그런 다음 / 살아있는 페이지에서 "OK"라는 단어를 확인합니다. 또한 URL을 검색하여 해당 호스트가 실행중인 localhost에 위임합니다. 이는 전개 플레이 북의 마지막 태스크로서 의미가 있습니다.
---
- hosts: my-hosts
tasks:
- action: uri url=http://{{ ansible_all_ipv4_addresses }}:8080/alive return_content=yes
delegate_to: localhost
register: result
until: "'failed' not in result and result.content.find('OK') != -1"
retries: 18
delay: 10
until 재시도 패턴은 모든 조치와 함께 사용할 수 있습니다. 가능한 문서는 특정 쉘 명령이 원하는 결과를 반환 할 때까지 기다리는 예제를 제공합니다. http://docs.ansible.com/ansible/playbooks_loops.html#do-until-loops .