ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Ansible 101] 반복문
    IT/Ansible 2024. 1. 21. 07:01
    728x90

     

    안녕하세요, 오늘은 2주 차 진행 내용을 가지고 왔습니다.

    먼저, 반복문입니다.

     

    1. 반복문

    반복문을 사용하면 동일한 모듈을 사용하는 작업을 여러 번 작성하지 않아도 됩니다. 

    예를 들어 서비스에 필요한 포트를 방화벽에 추가한다고 하면, 포트를 추가하는 작업을 여러 개 작성하는 대신 loop 반복문을 이용해 작업 하나로 여러 개의 포트를 추가할 수 있습니다.

    참조 링크 : https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_loops.html

     

    여기서 빌트인 모듈을 통해서 실습을 진행했습니다.

     

    #1. ansible.builtin.service

    참조 링크 : https://docs.ansible.com/ansible/latest/collections/ansible/builtin/service_module.html

     

    loop 키워드를 작업에 추가하면 작업을 반복해야 하는 항목의 목록을 값으로 사용합니다. 그리고 해당하는 값을 사용하려면 item 변수를 이용할 수 있습니다.

     

     

    1) 플레이북 생성

    ~/my-ansible/check-services.yml

    ---
    - hosts: all
      tasks:
        - name: Check sshd state
          ansible.builtin.service:
            name: sshd
            state: started
    
        - name: Check rsyslog state
          ansible.builtin.service:
            name: rsyslog
            state: started

     

     

    state -

    • started : **Start service httpd, if not started**
    • stooped : Stop service httpd, if started
    • restarted : Restart service httpd, in all cases
    • reloaded : Reload service httpd, in all cases

    참조 링크 : https://docs.ansible.com/ansible/latest/collections/ansible/builtin/service_module.html#parameter-state

     

    위의 플레이북을 통해서 프로세스가 동작하는지 확인해 봅니다.

    위에 볼드체로 되어 있는 것과 같이, state의 started 상태를 확인하는 플레이북입니다.

     

    2) 플레이북 실행

    ansible -m shell -a "pstree |grep sshd" all
    ansible -m shell -a "pstree |grep rsyslog" all

     

    3) loop 반복문 적용

    동일한 내용을 반복문을 적용해 봅시다.

     

    ~/my-ansible/check-services1.yml

    ---
    - hosts: all
      tasks:
      - name: Check sshd and rsyslog state
        ansible.builtin.service:
          name: "{{ item }}"
          state: started
        loop:
          - sshd
          - rsyslog

     

    위의 내용을 실행하면 다음과 같이 출력됩니다.

     

    4) loop 키워드에 변수명 추가

    ~/my-ansible/check-services2.yml

    ---
    - hosts: all
      vars:
        services:
          - sshd
          - rsyslog
    
      tasks:
      - name: Check sshd and rsyslog state
        ansible.builtin.service:
          name: "{{ item }}"
          state: started
        loop: "{{ services }}"

     

    위의 check-services1.yml 플레이북에서 sshd, rsyslog를 loop: "{{ services }}"로 지정해 봅니다.

    실행 결과는 다음과 같습니다.

     

    #2. ansible.builtin.file 모듈

    참조 링크 : https://docs.ansible.com/ansible/latest/collections/ansible/builtin/file_module.html

    • 하나의 아이템을 사용할 때도 있지만, 여러 개의 아이템이 필요한 경우가 발생합니다. 예를 들어 여러 개의 사용자 계정을 생성하는 플레이북을 작성한다면 사용자 계정을 생성하기 위해 필요한 이름과 패스워드 등의 여러 항목을 loop 문에서 사전 목록으로 사용할 수 있습니다.
    • 여러 개의 아이템을 loop 문에서 사전 목록 dictionary으로 사용해 봅니다.

    이번에는 ansible.builtin.file 모듈을 사용하여 사전 목록을 통한 반복을 진행해 보겠습니다.

     

    1) 플레이북 생성

    ---
    - hosts: all
    
      tasks:
        - name: Create files
          ansible.builtin.file:
            path: "{{ item['log-path'] }}"
            mode: "{{ item['log-mode'] }}"
            state: touch
          loop:
            - log-path: /var/log/test1.log
              log-mode: '0644'
            - log-path: /var/log/test2.log
              log-mode: '0600'

    먼저 위와 같이 플레이북을 만들어 줍니다.

     

    2) 실행

     

    터미널을 하나 더 띄우고, 다음의 명령어를 실행합니다.

    <터미널 2>
    watch -d "ssh tnode1 ls -l /var/log/test*.log"
    
    <플레이북 실행>
    ansible-playbook make-file.yml


    터미널2와 터미널 1의 실행 모습입니다.

     

    3) 확인

     

    #3. 반복문과 Register 변수 사용

    - Register 변수는 반복 실행되는 작업의 출력을 캡처할 수 있습니다.

    생성할 파일 설명

    - shell 모듈을 이용하여 “I can speak~”라는 메시지를 출력합니다.
    - 이때 loop 키워드를 이용하여 Korean과 English를 할 수 있다고 아이템을 나열합니다.
    - 그리고 하단에 register 키워드를 이용하여 실행 결과를 result 변수에 저장합니다.
    - 이렇게 저장된 result 변수는 debug 모듈을 통해 해당 내용을 확인합니다.

     

    1) 플레이북 생성

    ~/my-ansible/loop_register.yml

    ---
    - hosts: localhost
      tasks:
        - name: Loop echo test
          ansible.builtin.shell: "echo 'I can speak {{ item }}'"
          loop:
            - Korean
            - English
          register: result
    
        - name: Show result
          ansible.builtin.debug:
            var: result

     

    2) 실행

    register 키워드에 의해 저장된 result 내용에는 대괄호 ([]) 사이에 Key-Value 쌍으로 구성된 결과 값들이 모두 저장됨

    ansible-playbook loop_register.yml

     

     

    여기서 results의 실행 결과는 배열 형식으로 저장된 것을 볼 수 있습니다.

    이때 results의 특정 값을 플레이북에서 사용할 경우 loop문을 이용할 수 있습니다.

     

    다음 플레이북을 통해서 debug 모듈에 loop 키워드를 사용하여 result.results아이템 변수로 사용해 보겠습니다.
    해당 아이템의 stdout의 값을 출력할 때는 item.stdout이라는 변수로 결과값을 출력합니다.

     

    1) 플레이북 생성

    ~/my-ansible/loop_register1.yml

    ---
    - hosts: localhost
      tasks:
        - name: Loop echo test
          ansible.builtin.shell: "echo 'I can speak {{ item }}'"
          loop:
            - Korean
            - English
          register: result
    
        - name: Show result
          ansible.builtin.debug:
            msg: "Stdout: {{ item.stdout }}"
          loop: "{{ result.results }}"

     

    Return Values : Common

    참조 링크 : https://docs.ansible.com/ansible/latest/reference_appendices/common_return_values.html#common

    • stderr : 명령의 표준 에러
      • stderr_lines : 표준 에러 출력을 행 단위로 구분한 목록
    • stdout : 명령의 표준 출력
      • stdout_lines : 표준 출력을 행 단위로 구분한 목록
    • rc : ‘return code’ 반환 코드
    • msg : 사용자가 전달한 일반 문자열 메시지

    2) 실행

    ansible-playbook loop_register1.yml

     

     

    감사합니다.

    728x90
    반응형
Designed by Tistory.