Ansible Fundamentals III

Dongmin Lee·2024년 1월 14일
0

Ansible

목록 보기
3/7

1. Role이란?

  • 인프라를 프로비저닝하거나 애플리케이션을 배포하는 데 필요한 모든 작업, 변수, 파일, 템플릿, 기타 리소스를 표준화된 디렉터리 구조로 패키징
  • 앤서블에서 제공하는 role을 사용하면 일반적인 앤서블 코드를 더 쉽게 재사용할 수 있다.

2. Role의 장점

  • 콘텐츠를 그룹화하여 코드를 다른 사용자와 쉽게 공유할 수 있다.
  • 웹 서버, 데이터베이스 서버 또는 깃 리포지토리와 같은 시스템 유형의 필수 요소를 정의할 수 있다.
  • 대규모 프로젝트를 쉽게 관리할 수 있다.
  • 다른 사용자와 동시에 개발할 수 있다.
  • 잘 작성한 role은 앤서블 갤럭시를 통해 공유하거나 다른 사람이 공유한 롤을 가져올 수도 있다.

3. Role의 구조

하위 디렉터리기능
defaultsrole이 사용될 때 덮어쓸 수 있는 role의 가변 변수 값 (우선순위가 낮으며, 플레이북에서 변경할 수 있음)
filesrole 작업에서 참조한 정적 파일
handlersrole의 핸들러 정의
meta작성자, 라이센스, 플랫폼 및 옵션, role 종속성을 포함한 role에 대한 정보
tasksrole의 작업 정의
templatesrole 작업에서 참조할 Jinja2 템플릿
testsrole을 테스트하는 데 사용할 수 있는 인벤토리와 test.yml 플레이북
varsrole의 불변 변수 값 (우선순위가 높으며, 플레이북에서 변경되지 않음)

4. Role 사용법

4.1 Role 생성

$ ansible-galaxy role init my-role
- Role my-role was created successfully

$ tree ./my-role/
my-role/
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

8 directories, 8 files

4.2 Role을 이용한 Playbook

프로세스

  • 롤이 호출되면 현재 호스트의 운영체제 버전이 지원 운영체제 목록에 포함되는지 확인한다.
  • 운영체제가 CentOS나 레드햇이면 httpd 관련 패키지를 dnf 모듈을 이용하여 설치한다.
  • 설치가 끝나면 제어 노드의 files 디렉터리 안에 있는 index.html 파일을 관리 노드의 /var/www/html 디렉터리에 복사한다.
  • 파일 복사가 끝나면 httpd 서비스를 재시작한다.

Role 구조

  • Role 이름 : my-role
  • tasks (메인 태스크)
    • install service : httpd 관련 패키지 설치
    • copy html file : index.html 파일 복사
  • files (정적 파일)
    • index.html
  • handlers (핸들러)
    • restart service : httpd 서비스 재시작
  • defaults (가변 변수) : 메인 태스크에서 사용된 변수 선언
    • service_title
  • vars (불변 변수) : 메인 태스크와 핸들러에서 사용된 변수 선언
    • service_name : 서비스명
    • src_file_path : 복사할 파일 경로
    • dest_file_path : 파일이 복사될 디렉터리 경로
    • httpd_packages : httpd 관련 패키지 목록
    • supported_distros : 지원 OS 목록

코드

role.yml

---
- hosts: all

  tasks:
    - name: Print start play
      ansible.builtin.debug:
        msg: "Let's start role play"

    - name: Install Service by role
      ansible.builtin.import_role:
        name: my-role
      vars:
        service_title: Httpd

my-role link

4.3 Playbook에 여러 role 사용하기

---
- hosts: all

  roles:
    - role: my-role
      service_title: "Httpd Web"
    - role: my-role2

  tasks:
    - name: Print finish role play
      ansible.builtin.debug:
        msg: "Finish role play"

4.4 특수 작업

  • pre_tasks:
    • roles 섹션보다 먼저 실행한다.
    • pre-tasks 섹션은 작업을 핸들러에 알리면 해당 핸들러 작업이 role 또는 일반 태스크 전에 실행한다.
  • post_tasks
    • tasks 및 tasks에서 알림을 받은 핸들러 다음에 실행한다.
---
- hosts: all

  pre_tasks:
    - name: Print Start role
      ansible.builtin.debug:
        msg: "Let's start role play"
 
  roles:
    - role: my-role
    - role: my-role2
 
  tasks:
    - name: Curl test
      ansible.builtin.uri:
        url: http://tnode1
        return_content: true
      register: curl_result
      notify: Print result
      changed_when: true

  post_tasks:
    - name: Print Finish role
      ansible.builtin.debug:
        msg: "Finish role play"

  handlers:
    - name: Print result
      ansible.builtin.debug:
        msg: "{{ curl_result.content }}"

Tip. failed_when vs changed_when

  • failed_whenchanged_when은 플레이북이나 작업의 결과를 제어하는데 사용되는 조건문
  • 작업의 성공, 실패, 변경 여부를 사용자 정의 조건에 따라 결정하는 데 사용한다.

공통점

  • 사용자가 정의한 조건에 따라 작업의 결과를 결정한다.
  • 표준 작업 결과(성공, 실패, 변경 없음 등)를 넘어서 보다 세밀한 제어를 가능하다.

차이점

  • failed_when
    • 특정 조건에서 사용자 정의 조건이 참(True)일 때 작업이 실패한 것으로 처리한다.
    • 작업이 기술적으로는 성공했지만 특정 조건에 따라 실패로 간주해야 할 때 사용하면 좋다.
    • 예를 들어, 특정 문자열이 출력되었을 때 실패로 간주하고 싶은 경우에 사용하면 좋다.
  • changed_when
    • 조건이 참일 경우 작업이 변경을 일으킨 것으로 간주되고, 거짓일 경우 변경을 일으키지 않은 것으로 간주한다.
    • 앤서블이 자동으로 '변경됨' 상태를 감지하지 못하는 경우에 사용하면 좋다.
    • 예를 들어, 스크립트 실행 결과가 실제 시스템에 변화를 주었는지를 사용자가 직접 결정해야 할 때 유용하다.

예시

- name: 예시 작업
  command: /some/command
  register: result
  failed_when: "'ERROR' in result.stderr"
  changed_when: "result.rc == 2"
  • failed_whenresult.stderr에 'ERROR' 문자열이 있을 때 작업을 실패로 간주한다.
  • changed_whenresult.rc (반환 코드)가 2일 때 작업이 변경을 일으킨 것으로 간주한다.

5. Galaxy

5.1 Role 검색

$ ansible-galaxy role search postgresql --platforms Ubuntu

5.2 Role 상세 정보

$ ansible-galaxy role info geerlingguy.postgresql

5.3 Role 설치

$ ansible-galaxy role install -p roles geerlingguy.postgresql

5.4 설치된 Role 확인

$ ansible-galaxy role list -p roles

5.5 Role 삭제

$ ansible-galaxy role remove geerlingguy.postgresql
$ rm -r roles

6. Collection

  • 앤서블 핵심 코드 업데이트와 모듈 및 플러그인에 대한 업데이트를 분리한다.
  • 플레이북에서 사용할 수 있는 관련 모듈, role, 기타 플러그인을 제공한다.
  • 지원되는 모듈을 모두 설치하는 대신 필요한 콘텐츠만 추가로 설치할 수 있다.
  • https://docs.ansible.com/ansible/latest/collections/index.html

6.1 Collection 확인

$ ansible-galaxy collection list

6.2 Collection 설치

$ ansible-galaxy collection install openstack.cloud:2.1.0

$ ansible-galaxy collection list openstack.cloud
# /root/.ansible/collections/ansible_collections
Collection      Version
--------------- -------
openstack.cloud 2.1.0

6.3 Collection 삭제

$ ansible-galaxy collection list openstack.cloud
# /usr/lib/python3/dist-packages/ansible_collections
Collection      Version
--------------- -------
openstack.cloud 2.1.0

$ rm -rf /usr/lib/python3/dist-packages/ansible_collections/openstack*

$ ansible-galaxy collection list openstack.cloud

0개의 댓글