[ansible] 교육 2일차

ansible 2018. 8. 28. 20:06





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






Posted by pysany
,