ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Ansible: Playbook yaml
    공부합시다!/Ansible 2022. 7. 6. 10:04
    728x90

    오늘은 ansible 실행에서의 핵심 파일인 playbook에 대해서 살펴보겠습니다.

     

     

    1. yaml 파일

     1.1. "야믈" 

     1.2. YAML은 markup 보다구조화 된 Data를 표현하기 위한 Test 형식의 Format

      1.2.1. 사람이 쉽게 읽을 수 있는 데이터 직렬화 형식

      1.2.2. Markup 언어와 다르기 때문에 사람이 읽고, 쓰고, 식별하기 쉽다.

      1.2.3. 'Yet Another Markup Language' 공식적인 약자

      1.2.4. 설정파일, 데이터 저장 형식, Log파일에 주로 사용

      1.2.5. http://www.yaml.org 참조

    json vs yaml

    2. Playbook

     2.1. Ansible의 환경 설정, 배포를 가능하게 함.

     2.2. yaml 문법을 사용하여 정의

     2.3. linux 기반의 권한 관리(user, group) 지원

     2.4. 하나의 playbook은 하나 또는 그 이상의 play를 정의

     2.5. play의 목적은 여러 호스트들에 잘 정의된 Role과 Task를 매핑하는 역할

     2.6. 그 외 기능

      2.6.1. 반복 (with_item, with nested, until ....)

      2.6.2. 조건 분기 (when, register, .....)

      2.6.3. 다른 playbook 참조 (include, role ......)

      2.6.4. 외부 정보 참조

      2.6.5. 환경 변수, 파일 등 (environment, lookup, vars_prompt.....)

      2.6.6. Custom Module을 이용한 확장

     2.7. playbook 실행

    ansible 명령어 실행
    # ansible-playbook i inventory_file playbook.yml

     

    3. playbook 구조

    playbook 구조

     3.1. Task

      3.1.1. 정형화 된 작업 열거

      3.1.2. Task는 관련 지을 수 있는 Module 호출

      3.1.3. Module 은 Python 이나 Bash로 기술

    tasks:
      - name: check instal httpd
        yum: name=httpd state=latest

     

     3.2. Module 

      3.2.1. 특정 목적을 위해 작성된 Ansible Backend

      3.2.2. 주로 Python으로 구현

      3.2.3. 대표적인 Module

       3.2.3.1. packgae 관리

                   - yum, atp

                     지정 패키지 및 의존 패키지 설치

       3.2.3.2. 서비스 제어

                    - service

                      서비스 시작 정지

       3.2.3.3. 파일처리

                    -  File, copy, fetch, template

                       파일 배포(copy, template), 파일 수집(fetch)등

       3.2.3.4. command 실행

                    - command, shell

                      외부 command 실행가 출력 결과 보고 등

       3.2.3.5. git, subversion

     3.3. 변수 정의(vars)

      3.3.1. Tasks 섹션 전에 vars: 섹션으로 변수를 정의

    vars:
      hello: Hello
    tasks:
      - name: Hello World
        debug: msg=”{{ hello }} Ansible

     

     

     3.4. 조건분기실행

      3.4.1. Task에서 Module명 다음 줄에서 "when:"을 기술하여 module의 실행 조건을 정의

      3.4.2. 지역 변수나 vars정의된 변수에 대해 등호화 부등호를 이용하여 조건식이 true인 경우에 실행

    tasks:
      - name: install Apache Web server
        yum: name=httpd state=latest
        when: ansible_os_family == 'RedHat'
      - name: install Apache Web server
        apt: name=apache2 state=latest
        when: ansible_os_family == 'Debian' or \
            ansible_os_family == 'Ubuntu

     

     3.5. Loop 실행(Loops)

      3.5.1. Task에서 Module명의 다음 줄에서 "with_000" 기술하여 모듈에 {{item}}변수를 전달

    with_items
    with_nested
    with_dict
    with_lines
    with_indexed_items
    with_ini
    with_flattened
    with_file
    with_fileglob
    with_first_found
    with_together
    with_subelements
    with_random_choice
    with_sequence

     

     3.6. Template

      3.6.1. yaml파일 뿐 아니라 모든 파일에서 활용가능

      3.6.2. 일반적으로 파일 확장자명을 .j2로 함

       3.6.2.1  index.php.j2

       3.6.2.2. msyql.j2

      3.6.3. Template Task일 때 jinja2 적용 가능(copy tast는 적용 불가)

    tasks:
      - name: deploy my.cnf
        template: src=my.cnf.j2 dest=/etc/my.cnf
    filename: my.cnf.j2
    [mysqld]
    user = {{ mysql_user }}
    port = {{ mysql_port }}
    datadir = /var/lib/mysql
    socket = /var/lib/mysql/mysql.sock
    pid-file = /var/lib/mysqld/mysqld.pid

     

    좀 많이 복잡한 듯 하지만 하나하나 설정하시다면 이해하실겁니다.

    왜 그렇게 Linux를 열심히 공부했는지 

    그 티가 나기 시작합니다.

    K8S도 Config File을 많이 만들어봐야 하듯 Ansible도 Playbook을 많이 작성해 보셔야 합니다.

     

     

    Ansible Module 참조 사이트

    https://docs.ansible.com/ansible/2.9/index.html

     

    Have a nice day!

     

     

     

    728x90
Designed by Tistory.