웹사이트 검색

Ansible 플레이 및 플레이북을 만드는 방법 - 5부


Ansible 시리즈의 이번 5부에서는 Ansible 모듈을 사용하여 Ansible PlaysPlaybooks를 생성하는 방법을 설명합니다.

Ansible은 원격 노드에서 특수 작업을 실행하기 위해 플레이북에서 사용되는 모듈이라는 독립형 스크립트와 함께 제공됩니다.

모듈은 패키지 관리, 파일 보관 및 복사와 같은 작업을 자동화하는 데 유용합니다. 구성 파일을 수정하고 라우터, 스위치, 로드 밸런서, 방화벽 및 기타 여러 장치와 같은 장치를 관리할 수 있습니다.

이 하위 주제의 목적은 Ansible 모듈을 통해 수행할 수 있는 다양한 작업에 대한 개요를 제공하는 것입니다.

Linux의 패키지 관리

패키지 관리는 시스템 관리자가 수행하는 가장 중요하고 자주 수행되는 작업 중 하나입니다. Ansible은 RedHatDebian 기반 시스템 모두에서 패키지 관리 작업을 실행하는 데 도움이 되는 모듈과 함께 제공됩니다.

상대적으로 추측하기 쉽습니다. Debian 기반 APT 패키지 관리를 위한 apt 모듈, YUM 패키지 관리를 위한 이전 yum 모듈 및 최신 RHEL 배포판과 관련된 dnf 모듈이 있습니다. .

다음은 플레이북에서 모듈을 사용하는 방법에 대한 몇 가지 예입니다.

예 1: RHEL 8에 Apache 웹 서버 설치

---
- name: install Apache webserver
  hosts: webservers

  tasks:
       - name: install httpd
         dnf:  
          name: httpd  
          State: latest

예제 2: Debian 10에 Apache 웹 서버 설치

---
- name: install Apache webserver
  hosts: databases

  tasks:
       - name: install Apache webserver
         apt:  
          name: apache2  
          State: latest

서비스 모듈

서비스 모듈을 사용하면 시스템 관리자는 시스템에서 서비스를 시작, 중지, 업데이트, 업그레이드 및 다시 로드할 수 있습니다.

예제 1: Apache 웹 서버 시작

---
- name: Start service httpd, if not started
  service:
    name: httpd
    state: started

예 2: Apache 웹 서버 중지

---
- name: Stop service httpd
  service:
    name: httpd
    state: stopped

예 3: 네트워크 인터페이스 enp2s0 다시 시작

---
- name: Restart network service for interface eth0
  service:
    name: network
    state: restarted
    args: enp2s0

모듈 복사

이름에서 알 수 있듯이 복사 모듈은 원격 시스템의 한 위치에서 동일한 시스템의 다른 위치로 파일을 복사합니다.

예 1: 로컬에서 원격 Linux로 파일 복사

---
- name: Copy file with owner and permissions
  copy:
    src: /etc/files/tecmint.conf
    dest: /srv/tecmint.conf
    owner: tecmint
    group: tecmint
    mode: '0644'

플레이북은 구성 파일 tecmint.conf/etc/files/ 디렉토리에서 /srv/ 디렉토리에 tecmint 로 복사합니다. 0644 권한을 가진 사용자입니다.

권한은 마지막 줄에 표시된 대로 기호 표현을 사용하여 표현할 수도 있습니다.

예 2: 로컬에서 원격 Linux로 파일 복사

---
- name: Copy file with owner and permissions
  copy:
    src: /etc/files/tecmint.conf
    dest: /srv/tecmint.conf
    owner: tecmint
    group: tecmint
    mode: u=rw, g=r, o=r

이전 예의 권한은 마지막 줄에 표시된 것처럼 나타낼 수 있습니다. 사용자에게는 읽기쓰기 권한이 할당되고, 그룹에는 쓰기 권한이 할당되며, 나머지 권한은 세상에는 읽기 권한이 할당되어 있습니다.

파일 모듈

파일 모듈은 파일 및 디렉터리 생성, 파일 권한 할당, 심볼릭 링크 설정 등 다양한 파일 작업을 수행하는 데 사용됩니다.

예 1: Linux 파일 권한 수행

---
- name: Change file ownership, group, and permissions
  file:
    path: /etc/tecmint.conf
    owner: tecmint
    group: tecmint
    mode: '0644'

위의 플레이는 /etc 디렉토리에 tecmint.conf라는 파일을 생성하고 권한을 0644로 설정합니다.

예 2: Linux 파일 삭제

---
- name: Remove file (delete file)
  file:
    path: /etc/tecmint.conf
    state: absent

그러면 tecmint.conf 파일이 제거되거나 삭제됩니다.

예 3: 디렉터리 생성

---
- name: create a directory if it doesn’t exist
  file:
    path: /etc/mydirectory
    State: directory
    mode: '0777'

그러면 0777로 권한을 설정하는 /etc 디렉토리에 디렉토리가 생성됩니다.

예 4: 디렉터리를 반복적으로 삭제

---
- name: Recursively deleting a  directory
  file:
    path: /etc/tecmint.conf
    state: absent

위의 플레이는 디렉토리를 재귀적으로 삭제합니다.

라인인파일 모듈

lineinfile 모듈은 파일에서 한 줄을 변경하려고 할 때 유용합니다. 기존 라인을 대체할 수 있습니다.

예 1: Linux에서 파일 조작

---
 - name: Ensure SELinux is set to enforcing mode
  lineinfile:
    path: /etc/selinux/config
    regexp: '^SELINUX='
    line: SELINUX=disabled

위의 플레이는 SELINUX 값을 비활성화로 설정합니다.

SELINUX=disabled

예 2: Linux에서 파일 변경

---
- name: Add a line to a file if the file does not exist, without         passing regexp
  lineinfile:
    path: /etc/hosts
    line: 10.200.50.51 linux-console.net
    create: yes

그러면 10.200.50.51 linux-console.net 항목이 /etc/hosts 파일에 추가됩니다.

아카이브 모듈

아카이브 모듈은 단일 또는 여러 파일의 압축된 아카이브를 생성하는 데 사용됩니다. 압축 소스가 대상 대상에 존재한다고 가정합니다. 보관 후 소스 파일은 나중에 remove=True 문을 사용하여 삭제하거나 제거할 수 있습니다.

예 1: 보관 파일 생성

- name: Compress directory /path/to/tecmint_dir/ into /path/to/tecmint.tgz
  archive:
    path: /path/to/tecmint_dir
    dest: /path/to/tecmint.tgz

This compresses the /path/to/tecmint_dir  directory to /path/to/tecmint.tgz

예 2: 보관 파일 생성 및 제거

- name: Compress regular file /path/to/tecmint into /path/to/foo.gz and remove it
  archive:
    path: /path/to/tecmint
    dest: /path/to/tecmint.tgz
    remove: yes

위 재생에서는 아카이브가 완료된 후 소스 파일 /path/to/tecmint가 삭제됩니다.

예 3: 아카이브 파일 생성

- name: Create a bz2 archive of /path/to/tecmint
  archive:
    path: /path/to/tecmint
    format: bz2

그러면 /path/to/tecmint 파일에서 bz2 형식의 압축 파일이 생성됩니다.

힘내 모듈

이 모듈은 소프트웨어 저장소의 git 체크아웃을 관리합니다.

예 1: Git 리포지토리 확인

- git:
    repo: 'https://foosball.example.org/path/to/repo.git'
    dest: /srv/checkout
    version: release-0.22

명령 모듈

가장 일반적으로 사용되는 모듈 중 하나인 command 모듈은 명령 이름을 취하고 나중에 인수 목록이 옵니다. 이 명령은 Linux 셸에 입력하는 것과 동일한 방식으로 전달됩니다.

예 1: 명령 실행

- name: Executing a command using the command module
  command: cat helloworld.txt

예 2: 원격 Linux 가동 시간 확인

---
 - name: Check the remote host uptime
    hosts: servers
    tasks:
      - name: Execute the Uptime command over Command module
        register: uptimeoutput
        command: "uptime"

- debug:
          var: uptimeoutput.stdout_lines

명령 모듈은 원격 서버의 가동 시간을 검색합니다.

명령 실행 결과를 검색하는 변수

일반적으로 Ansible 플레이북은 명령줄에 출력을 표시하지 않고 관리 호스트에서 작업을 실행하는 데 사용됩니다. 그러나 출력이나 결과를 캡처해야 하는 경우도 있습니다. 이 섹션에서는 플레이북의 출력을 변수로 캡처하고 나중에 표시하는 방법을 안내합니다.

Ansible 레지스터는 작업의 출력을 캡처하고 변수에 저장하는 데 사용됩니다. 이후 변수에는 작업의 표준 출력이 포함됩니다.

예를 들어 df -Th / 명령을 사용하여 각 루트 디렉터리에 있는 관리 노드의 디스크 사용량을 확인한다고 가정해 보겠습니다. 'command' 모듈을 사용하여 명령을 정의하고 'register'를 사용하여 표준 출력을 변수에 저장합니다.

명령을 표시하려면 stdout 반환 값과 함께 'debug' 모듈을 사용합니다.

---

 - hosts: all
   become: yes

   tasks:
     - name: Execute /boot usage on Hosts
       command: 'df -Th /'
       register: df

     - debug: var=df.stdout

이제 플레이북을 실행해 보겠습니다. 이 경우 플레이북 이름을 check_disk_space.yml로 지정했습니다.

ansible-playbook check_disk_space.yml

보시다시피 출력이 모두 뒤죽박죽되어 따라가기가 어렵습니다.

출력을 정렬하고 읽기 쉽게 만들려면 stdout 반환 값을 stdout_lines로 바꾸세요.

---

 - hosts: all
   become: yes

   tasks:
     - name: Execute /boot usage on Hosts
       command: 'df -Th /'
       register: df

     - debug: var=df.stdout_lines

조건문을 사용하여 플레이 실행 제어

프로그래밍 언어와 마찬가지로 조건문은 둘 이상의 결과가 가능할 때 사용됩니다. Ansible 플레이북에서 일반적으로 사용되는 조건문 중 일부를 살펴보겠습니다.

언제 진술

때로는 특정 노드에서만 작업을 수행하고 다른 노드에서는 수행하지 않으려는 경우도 있습니다. 'when' 조건문은 플레이북에서 사용하고 구현하기가 매우 쉽습니다. 'when' 절을 사용할 때는 다음과 같이 절 옆에 조건을 선언하기만 하면 됩니다.

when: condition

조건이 만족되면 원격 시스템에서 작업이 수행됩니다.

몇 가지 예를 확인해 보겠습니다.

예 1: When 연산자 사용

---
- hosts: all

  tasks:
  - name: Install Nginx on Debian
     apt: name=nginx state=present
     when: ansible_os_family == “Debian”

위의 플레이는 Debian 배포판 제품군을 실행하는 호스트에 Nginx 웹 서버를 설치합니다.

when 조건문과 함께 ORAND 연산자를 사용할 수도 있습니다.

예 2: AND 연산자를 When과 함께 사용

---
- hosts: all

  tasks:
  - name: Install Nginx on Debian
     apt: name=nginx state=present
     when: ansible_os_family == “Debian” and
           ansible_distribution_version == “18.04”

AND 연산자를 사용할 때 작업이 실행되려면 두 문이 모두 충족되어야 합니다.

위 플레이에서는 버전 18.04인 Debian OS 제품군을 실행하는 노드에 Nginx를 설치합니다. 분명히 이것은 Ubuntu 18.04가 될 것입니다.

예 3: When과 함께 OR 연산자 사용

OR 연산자를 사용하면 조건 중 하나라도 충족되면 작업이 실행됩니다.

---
- hosts: all

  tasks:
  - name: Install Nginx on Debian
     apt: name=nginx state=present
     when: ansible_os_family == “Debian” or
	      Ansible_os_family == “SUSE”

위의 플레이는 Debian이나 SUSE OS 제품군 또는 둘 다에 Nginx 웹 서버를 설치합니다.

참고: 조건을 테스트할 때는 항상 이중 등호 기호 ==를 사용해야 합니다.

루프의 조건부

조건문은 루프에서도 사용할 수 있습니다. 예를 들어 원격 노드에 설치해야 하는 여러 패키지 목록이 있다고 가정해 보겠습니다.

아래 플레이북에는 설치해야 하는 패키지 목록이 포함된 패키지라는 배열이 있습니다. required 절이 True로 설정된 경우 이러한 작업이 차례로 수행됩니다.

---
 - name: Install Software packages
    hosts: all
    vars:
	packages:
    • name: nginx
required: True
    • name: mysql
required: True
    • name: apache
required: False



   tasks:
    • name: Install “{{ item.name }}”on Debian
apt: 
 name: “{{ item.name }}”
 state: present 
When: item.required == True
loop: “{{ packages }}”  

오류 처리 구성

플레이북을 실행할 때 작업이 실패하는 경우가 있습니다. 아래 플레이북에 표시된 대로 3개의 서버에서 5개의 작업을 실행하고 있다고 가정해 보겠습니다. 서버 2의 작업 3(MySQL 시작)에서 오류가 발생하면 Ansible은 서버 2의 나머지 작업 실행을 중지하고 나머지 서버에서 나머지 작업을 완료하려고 시도합니다.

---
 - name: Install Software packages
   hosts: server1, server2, server3
   tasks:
- name: Install dependencies
<< some code >>

- name: Install MySQL database
<< some code >>

- name: Start MySQL
<< some code >>

- name: Install Nginx
<< some code >>

- name: Start Nginx
<< some code >>

예를 들어, 플레이북 실행의 일관성을 원하는 경우, 서버 중 하나에 장애가 발생하면 플레이북 실행을 중지하고 옵션을 추가하세요.

---
 - name: Install Software packages
   hosts: server1, server2, server3
   any_errors_fatal:  true
   tasks:

이렇게 하면 한 서버에서 하나의 작업이 실패하면 Ansible은 모든 서버에서 전체 플레이북의 실행을 중지하고 종료합니다.

플레이북에서 오류를 무시하고 나머지 작업 집합을 계속 실행하게 하려면 ignore_errors: True 옵션을 사용하세요.

---
 - name: Install Software packages
   hosts: server1, server2, server3
   tasks:
- name: Install dependencies
<< some code >>
     ignore_errors: True

플레이북을 생성하여 시스템을 지정된 상태로 구성

이 섹션에서는 플레이북을 실행할 때 사용할 수 있는 몇 가지 추가 옵션을 살펴보겠습니다.

확인 모드 또는 시험 실행 옵션부터 시작해 보겠습니다. 테스트 실행 또는 확인 모드 옵션은 플레이북을 실행할 때 오류가 발생하는지, 관리 호스트에 변경 사항이 있는지 확인하는 데 사용됩니다. 그러나 원격 노드는 변경되지 않습니다.

예를 들어 Apache 웹 서버를 설치하고 시작하는 httpd.yml라는 플레이북을 테스트 실행하려면 다음을 실행하세요.

ansible-playbook httpd.yml --check

우리가 살펴봐야 할 또 다른 옵션은 --start-at-task 옵션입니다. 플레이북이 시작되거나 시작되어야 하는 작업의 이름을 지정할 때 사용됩니다.

예를 들어 보겠습니다. 아래 플레이북에는 2가지 작업이 설명되어 있습니다. 첫 번째 플레이에서는 Apache 웹 서버를 설치하고 두 번째 플레이에서는 htop 유틸리티를 설치합니다.

---
 - name: Install httpd

   hosts: all
   tasks:
    yum:	 
name: httpd
     state: Installed

- name: Install htop

      yum:  
      name: htop
      state: started

Apache 웹 서버 설치를 건너뛰고 대신 htop 유틸리티를 설치하려면 다음을 실행하십시오.

ansible-playbook playbook.yml --start-at-task “Install htop”

마지막으로 표시된 대로 플레이북에 태그 옵션을 추가하여 작업이나 플레이에 태그를 지정할 수 있습니다. 이는 꽤 큰 플레이북이 있고 전체 플레이북에서 특정 작업을 실행하려는 경우에 유용합니다.

---
 - name: Install httpd
   tags: Install and start
   hosts: all
   tasks:
    yum:	 
name: httpd
     state: Installed

   tags: Install

    • service: 
name: httpd
state: started
ansible-playbook playbook.yml -tags "Install"

태그를 생략하려면 표시된 대로 --skip-tags 옵션을 사용하세요.

ansible-playbook playbook.yml --skip-tags "Install"
결론

이 주제에서는 Ansible에서 일반적으로 사용되는 모듈, 분석을 위해 플레이북 실행에서 stdout을 검색하는 방법, 플레이북에서 조건문을 사용하는 방법, 실행 시 발생할 수 있는 오류를 관리하는 방법을 안내했습니다. 작업. 마지막으로 플레이북 구성과 전체 플레이북을 실행하지 않을 경우 실행할 작업을 결정하기 위해 추가 옵션을 사용하는 방법을 요약했습니다.