ssh key 복사 : ssh-copy-id -i ./.ssh/id_rsa.pub id@ip
# plsaybook 문법
- key: value 형식으로 작성
두칸 띄우기, visual studio code 에서 --- 으로 yaml 파일로 선언해주면 탭으로 가능하고 줄은 맞춰줘야 한다. - key: value key: value key: value |
- vi 에서 yaml 작성할때 탭으로 가능하도록 설정
$HOME/.vimrc 파일안에 아래 입력 .vimrc 파일 없으면 만들어주면 된다. autocmd FileType yaml setlocal ai ts=2 sw=2 et |
- 주석
- # 오른쪽부터 주석 처리
# This is a YAML comment
some data # This is also a YAML comment
- YAML 문자열은 아래와 같이 사용 가능
this is a string
'this is a string'
"this is a string"
- 개행 문자 사용
- 개행 문자는 |, > 으로 사용 할 수 있다.
- " | " 는 개행을 포함하여 출력 한다.
- " > " 는 한줄로 출력 한다.
개행 문자 ( | ) 사용 플레이북 | 결과 |
- name: Multi line Test (|) hosts: localhost tasks: - debug: msg: | This is string. yeah. | PLAY [Multi line Test (|)] ****************************************************************************** TASK [Gathering Facts] ********************************************************************************** ok: [localhost] TASK [debug] ******************************************************************************************** ok: [localhost] => { "msg": "This is\nstring.\nyeah.\n" } |
개행 문자 ( > ) 사용 플레이북 | 결과 |
- name: Multi line Test (|) hosts: localhost tasks: - debug: msg: > this is string. yeah. | PLAY [Multi line Test (|)] ****************************************************************************** TASK [Gathering Facts] ********************************************************************************** ok: [localhost] TASK [debug] ******************************************************************************************** ok: [localhost] => { "msg": "this is string. yeah.\n" } |
- 빈파일 만들어서 내용 입력 하기, 기존 파일은 lineinfile 모듈 사용하면 된다.
- copy 모듈의 content 사용
- name: input content hosts: localhost tasks: - copy: content: "This is Text" dest: /tmp/text.log |
# 변수 관리
- 사용 사례
- Users to create
- Packages to install
- Services to restart
- Files to remove
- Archives to retrieve from the internet
- 변수 규칙
- 띄어쓰기 사용불가
- . 사용 불가
- 특수문자 사용 불가
- _ 는 허용
- 변수 사용 우선 순위(순서대로 우선 순위임)
- command 에서 지정한 변수
- playbook 에서 지정한 변수
- host scope 변수
- 변수 사용
- playbook 안에서 변수 지정
- hosts:all vars: user: joe home: /home/joe |
- 별도의 변수를 설정한 파일 사용
user.yml 파일에는 변수가 선언이 되어있어야함.
- hosts:all vars_file: - vars/user.yml |
- inventory 에서 변수 사용
inventory 에서 group 을 별도로 만들어서 변수를 선언 할 수 있고, 호스트별로 선언하여 사용 할 수도 있다.
[all:vars] # these defaults can be overridden for any group in the [group:vars] section ansible_connection=network_cli ansible_user=ansible [switches:children] eos ios vyos [eos] veos01 ansible_host=veos-01.example.net veos02 ansible_host=veos-02.example.net veos03 ansible_host=veos-03.example.net veos04 ansible_host=veos-04.example.net [eos:vars] ansible_become=yes ansible_become_method=enable ansible_network_os=eos ansible_user=my_eos_user ansible_ssh_pass= !vault | $ANSIBLE_VAULT;1.1;AES256 37373735393636643261383066383235363664386633386432343236663533343730353361653735 6131363539383931353931653533356337353539373165320a316465383138636532343463633236 37623064393838353962386262643230303438323065356133373930646331623731656163623333 3431353332343530650a373038366364316135383063356531633066343434623631303166626532 9562 [ios] ios01 ansible_host=ios-01.example.net ios02 ansible_host=ios-02.example.net ios03 ansible_host=ios-03.example.net |
- 변수에서 "" 사용 유무 이유
- 변수는 {{ }} 으로 이루어진 dictionary 형태로 변수 삽입 라인에서 맨앞에 변수를 사용하면 반드시 ""를 사용해야한다. "" 를 사용하지 않으면 python dictionary 로 인식해서 에러가 발생된다.
- when 절에서는 예외.
- 배열
아래와 같은 값을 변수로 선언 했을때 하나하나 변수를 불러와야 하는 귀차니즘이 있다. ansible에서는 다른 개발언어와는 다른 배열을 제공한다. user1_first_name: Bob User1_last_name: Jones user1_home_dir: /users/bjones user2_first_name: Anne user2_last_name: Cook user3_home_dir: /users/accok |
- ansible 변수 배열 사용
users: bjones: first_name: Bob last_name: Jones home_dir: /users/bjones acook: first_name: Anne last_name: Cook home_dir: /users/acook 위와 같이 변수 선언을 할 수 있고, 아래 와 같이 사용 가능하다. # Returns 'Bob' users.bjones.first_name # Returns '/users/acook' users.acook.home_dir [] 리는스트형태로 사용하는걸 권장한다. 변수의 . 을 사용하면 python 의 고유 메소드와 중첩 될 수 있는데, 이때 우선순위는 python 고유 메소드가 호출된다. # Returns 'Bob' users['bjones']['first_name'] # Returns '/users/acook' users['acook']['home_dir'] |
# Facts
- target host 가 가지고 있는 정보
- OS정보, H/W정보, 네트워크 정보등등 매우 많다.
- 간단한 facts 내용 확인 방법
- ansible localhost -m setup
- playbook 사용하면 기본적으로 gather_facts = yes 라서 자동 수집된다.
- gather_facts 하는데 리소스가 좀 소요되는데.. 많은 서버에 대해 작업할때 굳이 필요없다면
gather_facts: no 로 처리하면 된다.
- filter, 보고싶은 facts 만 볼 수 있다.
- 최상위 계층만 필터를 걸 수 있다.
- ansible localhost -m setup -a filter=ansible_hostname
- wildcard 사용 가능
ex) ansible localhost -m setup -a filter=*host*
"ansible_python_version": "2.7.5", #필터 가능 "ansible_real_group_id": 1000, #필터 가능 "ansible_real_user_id": 1000, #필터 가능 "ansible_selinux": { #필터 가능 "config_mode": "enforcing", #필터 불가 "mode": "enforcing", #필터 불가 "policyvers": 28, #필터 불가 "status": "enabled", #필터 불가 "type": "targeted" #필터 불가 }, |
- Custom Facts
- 사용자가 별도의 facts를 만들 수 있다.
- ansible localhost -m setup -a filter=ansible_local
- facts 파일은 /etc/ansible/facts.d/ 아래에 만들어서 사용 하면 된다.
- Magic Variables
- ansible 에서 이미 설정 되어있는 변수
- inventory 에 있는 호스트 설정들에 대해 가져오기 가능하다.
- Including tasks
- yml 파일을 include 할 수 있다.
- tasks 안에서 사용 가능하고, include: aa.yml 으로 사용 한다.
- 요건 말하기가 좀 애매한데.. 함 해보길 바란다. 별거 아니당.. 그냥 넣고 싶은데 넣으면됌.
- Task에서도 var file을 포함가능
- include_vars: vars/variable.yml
- Task를 Task에서 포함가능
- include: another_task.yml
# 흐름제어문
- 반복문
with_items 를 사용해서 반복 작업을 실행 할 수 있다.
- name: Postfix and Dovecot are running service: name: "{{ item }}" with_items: - postfix - dovecot |
- dictionary 형태도 사용 가능
- name: Users exist and are in the correct groups user: name: "{{ item.name }}" state: present groups: "{{ item.groups }}" with_items: - { name: 'jane', groups: 'wheel' } - { name: 'joe', groups: 'root' } |
- 리스트 value가 두개 이상인 경우 nested 를 사용할 수 있다.
tasks: - name: All DB users have privileges on all databases mysel_user: name: "{{ item[0] }}" priv: "{{ item[1] }}.*:ALL" append_privs: yes password: password with_nested: - ['joe','jane'] - ['clientdb','employeedb', 'providerdb'] |
- when 절 사용. if 문이라고 보면 된다. ansible Conditionals
tasks 에서 when 모듈을 사용하여 조건식을 사용할 수 있다.
- hosts: all vars: my_special_user: devops superusers: - root - devops - toor tasks: - name: Task runs if my_specialuser is in superusers user: name: "{{ my_special_user }}" groups: wheel append: yes when: my_special_user in superusers |
# handlers - 서비스 제어 모듈
- 서비스를 제어하는 모듈인데, 어떤 모듈을 실행하고 나서 결과가 changed 이면 notify 를 통해
등록된 service 제어 모듈을 호출해서 서비스 제어 가능함.
결과가 changed 외에는 notify 가 실행 안됨.
- notify 가 tasks 안에 있는데 다음 모듈이 실행되는것이 있다면, 우선 notify 는 keep 상태로 된다.
모든 tasks 안에 있는 모듈이 끝나면, 그때 handlers 에 정의 되어있는 handler 모듈 순서대로 실행된다.
tasks: - name: copy demo.example.conf configuration template copy: src: /var/lib/templates/demo.example.conf.template dest: /etc/httpd/conf.d/demo.example.conf handlers: - name: restart_mysql service: name: mariadb state: restarted - name: restart_apache name: httpd state: restarted |
'ansible' 카테고리의 다른 글
[ansible] 교육 3일차 (0) | 2018.08.29 |
---|---|
[ansible] 서버마다 작업해야할 파일이 다른경우 wildcard 처리까지. (0) | 2018.08.28 |
[ansible] 교육 1일차, basic & tip (0) | 2018.08.27 |
[ansible] ntp 설치 (0) | 2018.08.26 |
[ansible] 여러개의 파일 / 디렉터리를 삭제하는 방법 (0) | 2018.08.26 |