# 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 |