본문 바로가기
IT study/Linux

03.yaml syntax 설정

by 핸조 2022. 12. 10.
yaml syntax

기본자료형

scalar : 스트링 또는 숫자
sequence : 배열 또는 리스트
mapping : 해시 또는 딕셔너리, 키/value 형태


---
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
...

# An employee record
martin:
    name: Martin D'vloper
    job: Developer
    skill: Elite

# Employee records
-  martin:
    name: Martin D'vloper
    job: Developer
    skills:
      - python
      - perl
      - pascal
-  tabitha:
    name: Tabitha Bitumen
    job: Developer
    skills:
      - lisp
      - fortran
      - erlang


---
martin: {name: Martin D'vloper, job: Developer, skill: Elite}
['Apple', 'Orange', 'Strawberry', 'Mango']


include_newlines: |
            exactly as you see
            will appear these three
            lines of poetry

fold_newlines: >
            this is really a
            single line of text
            despite appearances

---
# An employee record

name: Martin D'vloper
job: Developer
skill: Elite
employed: True
foods:
    - Apple
    - Orange
    - Strawberry
    - Mango
languages:
    perl: Elite
    python: Elite
    pascal: Lame
education: |
    4 GCSEs
    3 A-Levels
    BSc in the Internet of Things

yaml 변수

변수이름 규칙은 대체로 다른언어와 비슷하다.
변수이름은 문자로 시작해야 하고 특수문자는 '_' 만 사용가능하다.
ok
--------
foobar
foo_bar
foo_bar2

not ok
--------
foo bar
foo-bar
1st_foobar
foo.bar

변수정의
inventory 내에서 변수정의
playbook 에서 변수 정의
vars 블록에서 정의
var_files 로 외부파일에서 정의

- hosts: all
  vars:
    service: httpd
    service_port: 80

- hosts: all
  vars_files:
    - vars/service.yml

users.yml
----------------
service: httpd
service_port: 80

playbook 에서 변수사용
변수를 이중괄호로 묶어서 사용한다.
{{service}}
{{service_port}}

example)
vars:
  service: httpd

tasks:
  - name: install {{httpd}} packages
    yum:
      name: "{{httpd}}"
      state: present

* key 에 대한 value 가 변수로 시작하는 경우에는 value 와 변수를
구분하기 위하여 반드시 변수가 포함된 이중괄호를 큰따옴표를 붙여야 한다.

----------------------------------------
host 변수 및 그룹 변수
[web_servers]
server2.example.com  service=httpd

[db_servers]
server3.example.com
server4.example.com

[db_servers:vars]
service=mariadb
----------------------------------------
inventory 파일에 변수를 등록하면 inventory 가
복잡해지고 관리하기 좋지 않다.
그래서 group_vars 및 host_vars 디렉토리를 사용하는것이
권장된다.

~/sample/group_vars/test
service: httpd
~/sample/group_vars/test2
service: vsftpd

~/sample/host_vars/test
service: httpd
~/sample/host_vars/tets2
service: vsftpd
~/sample/host_vars/test3
service: mariadb
---------------------------------------
command line 에서 변수정의

ansible-playbook server2.example.com test.yml -e "service=httpd"

배열변수

user1_uid: 1000
homedir: /home/user1
user2_uid: 1001
homedir: /home/user2
user3_uid: 1002
homedir: /var/user3
...
==> 이 많은 변수들을 아래처럼 
배열로 바꿔서 사용할 수 있다.
python 에서는 아래처럼 정의할수 있다.
users = { 'user1':{'uid':1000,'homedir':'/home/user1'},user2:{'uid':10001,'homedir':'/home/user2'},..}
users.get('user2') ; key 대한 value 출력

users:
  user1:
    uid: 1000
    homedir: /home/user1
  user2:
    uid: 1001
    homedir: /home/user2
  .....

변수사용
users.user1.uid ==> 1000
또는 users['user1']['uid']

users.user2.homedir ==> /home/user2
또는 users['user2']['homedir']

register
- task 의 실행결과를 변수에 저장 (주로 디버깅을 위한 목적으로 사용)




example)
---
- name : test
  hosts: all
  tasks:
    - name: install package
      yum:
        name: tftp-server
        state: present
      register: install_result
    - debug: var=install_result   
   
-----------------------------------
* debug 모듈
디버깅을 하기 위한 목적으로 사용하며 메시지나 변수값을 출력해준다

매직변수
- ansible 에 의해 자동으로 설정되는 변수
hostvars
- 관리대상 호스트의 변수를 얻을때 사용
group_names 
- 현재 호스타 속한 그룹리스트
groups
- inventory 내의 전체 그룹 및 모든호스트
inventory_hostname
- inventory 에 실제기록되어 있는 호스트 이름

팩트변수 
- ansible 이 managed node(host) 에서 자동으로 검색한 변수
팩트에는 다음과 같증 정보가 포함되어 있다.

호스트이름
커널버전
환경변수
CPU 정보
메모리정보
디스크정보
네트워크정보
운영체제버전
IP 주소

팩트는 managed node 의 상태를 파악하고 해당 상태에 따라서 여러가지
조치를 하기위한 방법

adhoc 명령어로 팩트수집
ansible hostname -m setup

특정 팩트변수만 수집하려면
{{ ansible_facts['devices']['xvda']['model'] }}
{{ansible_factc['nodename']}}

이런식으로 사용가능하다.

* 플레이북이 실행될때 팩트를 수집하지 않을려면
- hosts: all
  gather_facct: no




제어구문
when 

tasks:
  - command: /bin/false
    register: result
    ignore_errors: True

  - command: /bin/something
    when: result is failed

  # In older versions of ansible use ``success``, now both are valid but succeeded uses the correct tense.
  - command: /bin/something_else
    when: result is succeeded

  - command: /bin/still/something_else
    when: result is skipped

------------------------------------

tasks:
    - command: echo {{ item }}
      loop: [ 0, 2, 4, 6, 8, 10 ]
      when: item > 5

-----------------------------------

tasks:
    - name: gather site specific fact data
      action: site_facts
    - command: /usr/bin/thingy
      when: my_custom_fact_just_retrieved_from_the_remote_system == '1234'

------------------------------------
- hosts: all
  remote_user: root
  vars_files:
    - "vars/common.yml"
    - [ "vars/{{ ansible_facts['os_family'] }}.yml", "vars/os_defaults.yml" ]
  tasks:
  - name: make sure apache is started
    service: name={{ apache }} state=started
-----------------------------------------------

- name: test play
  hosts: all

  tasks:

      - shell: cat /etc/motd
        register: motd_contents

      - shell: echo "motd contains the word hi"
        when: motd_contents.stdout.find('hi') != -1
-------------------------------------------------------

- name: check registered variable for emptiness
  hosts: all

  tasks:

      - name: list contents of directory
        command: ls mydir
        register: contents

      - name: check contents for emptiness
        debug:
          msg: "Directory is empty"
        when: contents.stdout == ""
---------------------------------------------------------

loops

loop는 with_list 와 같다.

- name: add several users  //모듈
  user:
    name: "{{ item }}" 
    state: present
    groups: "wheel"
  loop:
     - testuser1
     - testuser2


- name: nested loop test
  user:
    name: "{{item.name}}"
    state: present
    groups: "{{item.groups}}"
  with_items:
    - { name: 'user1', groups: 'user1'}
    - { name: 'admin', groups: 'wheel'}


nested loop

  mysql_user
    name: "{{ item[0] }}"
    priv: "{{ item[1] }}".*:ALL
    append_privs: yes
    password: redhat
  with_netsted
   - [ 'dbuser1', 'dbuser2' ]
   - [ 'testdb','mydb','sampledb']

--------------------------------

핸들러
- notify 문을 사용하여 명시적으로 호출된 경우에만 실행된다

---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: name=httpd state=latest
  - name: write the apache config file
    copy:
      src: /var/lib/httpd.conf
      dest: /etc/httpd/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running (and enable it at boot)
    service: name=httpd state=started enabled=yes
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

'IT study > Linux' 카테고리의 다른 글

05. ansible addhook  (0) 2022.12.10
05. ansible vault  (0) 2022.12.10
04. ansible 실습  (0) 2022.12.10
02. yaml 파일 설정  (0) 2022.12.10
01. ansible 및 yaml 실습  (0) 2022.12.10