[ansible] 교육 3일차

ansible 2018. 8. 29. 23:38



# tags
- ansible-playbook -t TAGS or --tags=TAGS
로 사용 가능함, 사용가능한 tag 확인은 ansible-playbook --list-tags
해당 tag만 실행 할 수 있다.
동일한 tag는 그룹개념으로 묶어서 해당 tag가 붙은것들만 실행이 되며, 실행 순서는 위-> 아래로 진행 된다.

- name: tags
  hosts: all
  tasks:
    - name: tags1
      yum:
        name: "{{ item }}"
        state: latest
      with_items:
        - postfix
        - mariadb-server
      tags:
        - packages


playbook 에 있는 tag 중 실행하고 싶지 않은것은
--skip-tags=SKIP_TAGS_NAME 옵션을 사용하면 된다.

# Handling Errors
ansible은 에러가 발생하면 task가 멈추는데 , 몇가지 에러 처리 방법이 있다.

- ignore_errors: yes
     - yum:
         name: notapkg
         state: latest
        ignore_erros: yes


- force_handlers: yes
  handler 를 실행하는 notify 가 changed 가 반환된 tasks가 있으면 그이후에 에러가 발생하더라도, handler를 강제로 실행한다.

- 작업 실패 재지정
 보통 shell 이나 command 모듈을 실행 했을때 나오는 결과 값을 기반으로 조건을 주어 failed 처리를 할 수 있다.
     - failed_when
        실패했을때를 정의

#failed_when
tasks:
     - shell: /usr/local/bin/create_users.sh
        register: command_result
        failed_when: "'Password missing' in command_result.stdout"


     - changed_when
     tasks 실행시 반환되는 changed 값을 변경한다.

tasks:
     - shell:
         cmd: /usr/local/bin/upgrade-database
        register: command_result
        changed_when: "'Success' in command_result.stdout"
        notify:
             - restart_database

handlers:
     - name: restart_database
           service:
              name: mariadb
              state: restarted


- blcok 지정
     여러개의 task를 block 으로 지정해서 실행 할 수 있다.

- name: block example
  hosts: all
     tasks:
         - block:
              - name: package needed by yum
                   yum:
                        name: yum-plugin-versionlock
                        state: present
              - name: lock version of tzdata
                lininfile:
                   dest: /etc/yum/pluginconf.d/versionlock.list
                   line: tzdata-2016j-1
                   state: present
           when: ansible_distribution == "RedHat"


- block, rescue, always
     if else 문으로 생각할 수 있다.
     block 성공 -> always
     block 실패 -> rescue -> always


tasks:
     - block:
         - name: upgrade the database
             shell:
             cmd: /usr/local/lib/upgrade-database
     - rescue:
         - name: revert the database upgrade
              shell: cmd /usr/local/lib/rever-database
     - always:
         - name: always restart the database
              service:
                   name: mariadb
                   state: restarted



#JINJA2 템플릿
파일 내용을 미리 지정해 놓은 변수 값을 적용해서 copy 한다.
fatcs, custom variable 을 사용 할 수있다.
{#   #} = 주석
{%   %} = 반복문
{{    }} = 변수

JINJA 도 반복문이 있다.
     - 반복문
playbook결과

---

- name: jinja
  hosts: localhost
  vars:
    - user:
      - tom
      - boy
      - girl

  tasks:
    - name: jinja template
      template:
        src: jinja.j2
        dest: /tmp/test.txt

============================================
jinja2 template


{% for users in user %}
TEST {{ users }}
{% endfor %}

TEST tom
TEST boy
TEST girl



     - 반복문에서 index number 를 입력 할 수 있다.
playbook결과

---

- name: jinja
  hosts: localhost
  vars:
    - user:
      - tom
      - boy
      - girl

  tasks:
    - name: jinja template
      template:
        src: jinja.j2
        dest: /tmp/test.txt

============================================
jinja2 template


{% for users in user %}
TEST{{ loop.index }} {{ users }}
{% endfor %}

TEST1 tom
TEST2 boy
TEST3 girl



# Role
단일 playbook 으로 작업을 할 순 있지만, 좀더 큰 규모에 대한 playbook 을 작성할때는 role 을 사용하는것이 좋다.

- Role 디렉터리 구조
     아래 구조 디렉터리가 꼭 있어야 하는것은 아니다. 필요한것만 사용해도 된다.
     - defaults     : 우선순위가 낮은 기본 변수 집함, 보통 공용으로 사용하는 변수를 담는다.
     - files             : 파일을 넣어놓고 필요할때 사용할 수 있다. 예) 별도의 copy 모듈 안쓰고 원격 서버에 tar.gz 파일을 풀때 unarchive 모듈을 사용하여 작업할 수 있다.
     - handlers     : daemon 관리
     - meta            : 의존성 관련
     - tasks            : 일반적인 tasks
     - templates   : jinja2 템플릿
     - tests             : 뭐지?
     - vars              : 변수 집합. defaults 보다 우선순위다.

- 의존성
     dependencies:
         - { role: apache, port: 8080 }
         - { role: postgres, dbname: serverlist, admin_user: felix }
     meta 디렉터리에 main.yml 에 위와 같이 설정이 되어있다면, apache, postgres 를 설치하고  role을 실행한다.

- tags
 role 에도 tag를 사용 할 수 있다.
php 를 설치할때 의존성으로 apache or nginx 를 설치하게끔 해야할때 의존성에 대한 tag로 설정하여 호출하면 된다.
- hosts: webservers
roles:
- { role: foo, tags: ["bar", "baz"] }


- role 디렉터리 구조 만들기
role 디렉터리 구조를 만드는데 귀찮을때 아래와 같이 만들수 있다.

ansible-galaxy init --offline roles/test
[student@workstation test1]$ ansible-galaxy init --offline roles/test
- roles/test was created successfully
[student@workstation test1]$ tree
.
`-- roles
    `-- test
        |-- README.md
        |-- defaults
        |   `-- main.yml
        |-- handlers
        |   `-- main.yml
        |-- meta
        |   `-- main.yml
        |-- tasks
        |   `-- main.yml
        |-- tests
        |   |-- inventory
        |   `-- test.yml
        `-- vars
            `-- main.yml

8 directories, 8 files
[student@workstation test1]$



# ansible-galaxy
폐쇄망일경우 ansible-galaxy 를 이용할 수없지만, 내부 repository 를 셋팅한경우 다운받을 수 있는 방법이 있다.
# roles2install.yml 내용
# From Galaxy
     - src: author.rolename

# From a webserver, where the role ispackaged in a qzipped tar archive
     - src: httpd://webserver.example.com/files/sample.tgz
      name: ftpserver-role

#명령어
ansible-galaxy ins어tall -r roles2install.yml -p roles-directory



# 작업 위임
 - delegate_to 모듈을 통해 작업 위임을 할 수있다.
 inventory 내에서 작업 대상 외에 다른 서버에서 작업이 필요한경우 delegate_to 모듈을 사용해서 다른 호스트 서버에서 작업 할 수 있다.

 - inventory 에 없는 호스트에 delegate_to 작업이 필요한 경우
 add_host 모듈을 사용하여 임시로 inventory 에 추가 할 수 있다.

- name: add delegation host
  add_host:
         name: demo
         ansible_host: 172.21.250.10
         ansible_user: devops

- name: echo hello
  command: cmd "Hello from {{ inventory_hostname }}"
         delegate_to: demo
         register: ouput
- debug:
     msg: "{{ output.stdout }}"

- facts 도 위임 가능하다.

- hosts:app_servers
     tasks:
         - name: gather facts from app server
            setup:
            delegate_to: "{{ item }}"
            with_items: "{{groups['lb_servers']}}"
         - debug:
              var: ansible_eth0['ipv4']['address']

# inventory file
[appservers]
demo.lab.example.com

[lb_servers]
workstation.lab.example.com
              



# optimize ansible
/etc/ansible/ansible.cfg 파일에서 설정 가능
fork : 5  tasks를 5대씩 병렬 실행
serial : 2 play 당 2대씩 작업한다. play 안에 있는 모든 tasks 를 2대가 모두 완료 하면 다음 두대가 play tasks의 처음부터 다시 시작한다.

- 비동기
asyn: 3600 | 3600초 동안 기다린다.
poll: 10 | task가 완료 되었는지 10초동안 확인한다.

- name: Long running task
  hosts: demoservers
  remote_user: devops
  tasks:
         - name: Download big file
           get_url:
              url: http://demo.example.com/bigfile.tar.gz
           async: 3600
           poll: 10



Posted by pysany
,