Ansible: 조건과 브랜치를 통해 작업 수행에 영향을 미침

13591 단어 devopsansible
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_whenfailed_when 자구의 정의가 변경되고 실패한 결과를 사용할 수 있습니다. 이것은 평가가 필요한 조건입니다.Consul을 설치할 때 failed_when 자구를 사용했습니다. 시작할 때 consul -version 명령을 실행하고, Consul을 설치하지 않았을 때 이 동작은 실패합니다.하지만, 나는 계속 재생하고 싶어서 failed_when 조건을false로 현저하게 설정했다.
    - block:
      - name:
        command: consul --version
        register: result
        failed_when: false
    

    결론
    Ansible을 사용하면 위에서 아래로 작업이 수행됩니다.본고는 당신에게 이 주문서에 어떻게 영향을 미치는지 보여 줍니다.작업을 수행할 때 명시적 조건을 정의할 수 있습니다.인증과 자산을 설정하여 완료되지 않았을 때 재생을 중지할 수 있습니다.블록을 사용하면 여러 조작과 조건을 조합하여 던진 오류에 반응할 수 있습니다.마지막으로 작업이 변경되거나 실패한 것으로 간주되는 시간을 확인할 수 있습니다.이러한 옵션을 사용하면 Ansible에서 작업을 수행할 때 더 많은 효과를 얻을 수 있습니다.

    좋은 웹페이지 즐겨찾기