Ansible: 조건과 브랜치를 통해 작업 수행에 영향을 미침
본고에서 나는 다음과 같은 조작 집행에 영향을 주는 옵션을 소개할 것이다. 언제 조작을 집행할 것인지, 언제 조작을 정지할 것인지, 분기 제어 흐름과 제어 조작 결과를 정의할 것이다.
본문은 최초로 발표되었다my blog.
변덕스러운 개념
이 문서에서는 Ansible의 개념에 대해 잘 알고 있다고 가정합니다.만약 당신이 그렇지 않다면, 여기에 간단한 정의가 있습니다.
특정 조건에서 작업 실행
조건을 표현하기 위해 어떤 동작이든 키워드
when
로 확장할 수 있다.조건은 Jinja2 templating language에 적혀 있습니다.흔히 볼 수 있는 용례는 호스트 운영체제의 분포나 체계 구조를 검사하는 것이다.다음은 나의 가정 인프라 시설 프로젝트의 한 예이다.Consor를 설치할 때 호스트에 arm 아키텍처(raspberry Pi) 또는 x86 64 아키텍처가 있는지 확인합니다.이를 바탕으로 필요한 바이너리 파일을 다운로드하는 정확한 경로를 정합니다.
- name: Set vars when architecture is armv7l
set_fact:
consul_src_file: "consul_{{ consul_version }}_linux_armhfv6.zip"
...
when: ansible_facts.architecture == 'armv7l'
- name: Set vars when architecture is x86_64
set_fact:
consul_src_file: "consul_{{ consul_version }}_linux_amd64.zip"
...
when: ansible_facts.architecture == 'x86_64'
어떤 경우, 당신은 조건을 진실로 기다려야 합니다.이것은 동작wait_for
으로 표시할 수 있다.예를 들어, 당신은 일부 소프트웨어를 시작하도록 정성스럽게 안배된 시나리오가 있는데, 하나의 임무는 소프트웨어가 실행되기를 기다려야 한다.다음과 같이 호스트에 응용 프로그램 PID 파일이 있는지 확인할 수 있습니다.- name: wait for Nginx server to be running
command: /usr/sbin/sync_web_content
wait_for:
path: /var/logs/nginx.pid
state: present
조건에 따라 작업 중지
몇몇 조건이 충족되지 않을 때, 검증, 단언, 현식 실패 세 가지 명령이 재생을 중지합니다.그것들을 완성해야 할 검사표 요점으로 상상해라.
확인
검증은 templates 또는 lineinfile 등의 특정 모듈별 명령입니다.그들은 새 파일을 수신하는 명령을 호출했다.만약 이 명령의 반환 코드가 0이 아니라면 검증에 성공하지 못할 것입니다.
다음 예에서 파일에 오류가 발생하지 않도록
/etc/fstab
에 새 항목을 추가했습니다.시스템을 시작할 수 없는 것과 같은 결과는 매우 무서울 수 있다.mount -f
를 사용하면 시스템이 모든 파일 시스템을 마운트하려고 시도하고 로고-T %s
가 있는 새 파일을 전달합니다.- name: Create fstab entry
lineinfile:
path: /etc/fstab
line: "{{ nfs_dir_server_ip }}:{{ nfs_dir_mnt_path }} {{ nfs_dir_mnt_path }} nfs defaults,soft,bg,noauto,rsize=32768,wsize=32768,noatime 0 0"
regex: "{{ nfs_dir_server_ip }}:{{ nfs_dir_mnt_path }}"
state: present
validate: /usr/sbin/mount -fa -T %s
자산.
단언은
assert
로 표시된 동작이다.that
를 사용하여 하나 이상의 조건을 정의하고 사용자 정의success_msg
또는 fail_msg
를 정의할 수 있습니다.다음 예제에서는 호스트의 OS 시리즈가 Debian 시스템인지 확인하고 있습니다. 그렇지 않으면 오류 메시지가 표시됩니다.- name: Check OS family
assert:
that:
- ansible_facts[inventory_hostname].ansible_os_family == 'Debian'
fail_msg: Host is not Debian, stopping installation
명시적 실패
마지막으로 조건이 충족되지 않을 때는 현식적으로
fail
할 수 있다.다음은 제 가정 인프라 프로젝트의 예입니다. 어떤 버전의 concur 프로그램이 설치되었는지 확인하거나 재생을 즉시 중지하고 있습니다.- name:
command: consul --version
register: result
failed_when: false
- name: Check if current consul version is installed
fail:
msg: Consul v{{consul_version}} already installed - only updating config files
when: result is search("Consul v{{consul_version}}")
블록이 있는 브랜치 제어 흐름
지금까지 우리는 조건에 따라 임무를 집행하거나 다른 임무를 집행하지 않는 예를 보았다.이것은 좋은 시작이지만, 때로는 더 많은 통제가 필요하다.
거리가 답이야.기본 형식에서 블록에는 작업 세트가 포함됩니다.
when
자구를 블록에 추가할 수 있기 때문에 프로그래밍 언어에서 if-else
와 유사한 간단한 분기 형식을 제공합니다.다음은 변수
software_package
가 정의되고 나노와 같을 때 텍스트 편집기 나노를 설치하고 설정하는 예시입니다.- name: Install text editor
block:
- name: Install nano
apt:
name: nano
state: present
- name: Configure nano
template:
src: .nanorc.js
dest: {{user_home}}.nanorc
state: present
when: software_package is defined and software_package == 'nano'
- name: Install zsh
...
블록은 오류를 포착하고 오류나 그 어떠한 상황에서도 작업을 수행할 수 있는 더 많은 기능을 제공합니다.첫 번째 행위는 rescue
자구를 통해 이루어집니다. 오류가 발생하면 이 유사한 블록의 구조에서 작업을 수행합니다.두 번째 행위는 always
자구로 이 임무를 시종일관 수행하는 것은 오류를 일으키는지 여부와 무관하다는 것을 나타낸다.나의 가정 인프라 시설 프로젝트의 한 예는 특정한 프로그램과 프로그램 버전이 설치되어 있는지 검사하는 것이다.인 경우
block
로 그룹화된 설치 작업은 수행되지 않지만 적용always
섹션에 표시된 구성 섹션은 수행되지 않습니다.나는 이걸로 영사를 설치한다.다음은 관련 발췌문이다.- block:
- name:
command: consul --version
register: result
failed_when: false
- name: Check if current consul version is installed
fail:
msg: Consul v{{consul_version}} already installed - only updating config files
when: result is search("Consul v{{consul_version}}")
- name: Get consul binary
...
always:
- name: Copy consul config
template:
src: consul.config.hcl.j2
dest: "{{ consul_base_directory }}/consul.config.hcl"
mode: 0644
notify: Restart consul
작업 결과 제어
수행한 작업 중 하나는 확인, 변경, 실패, 건너뛰기입니다.ansible 시나리오를 집행하는 마지막에 당신은 이 결과를 보게 될 것입니다.
changed_when
와 failed_when
자구의 정의가 변경되고 실패한 결과를 사용할 수 있습니다. 이것은 평가가 필요한 조건입니다.Consul을 설치할 때 failed_when
자구를 사용했습니다. 시작할 때 consul -version
명령을 실행하고, Consul을 설치하지 않았을 때 이 동작은 실패합니다.하지만, 나는 계속 재생하고 싶어서 failed_when
조건을false로 현저하게 설정했다.- block:
- name:
command: consul --version
register: result
failed_when: false
결론
Ansible을 사용하면 위에서 아래로 작업이 수행됩니다.본고는 당신에게 이 주문서에 어떻게 영향을 미치는지 보여 줍니다.작업을 수행할 때 명시적 조건을 정의할 수 있습니다.인증과 자산을 설정하여 완료되지 않았을 때 재생을 중지할 수 있습니다.블록을 사용하면 여러 조작과 조건을 조합하여 던진 오류에 반응할 수 있습니다.마지막으로 작업이 변경되거나 실패한 것으로 간주되는 시간을 확인할 수 있습니다.이러한 옵션을 사용하면 Ansible에서 작업을 수행할 때 더 많은 효과를 얻을 수 있습니다.
Reference
이 문제에 관하여(Ansible: 조건과 브랜치를 통해 작업 수행에 영향을 미침), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/admantium/ansible-influencing-action-execution-with-conditions-and-branches-578h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)