변수

- hosts: 192.168.56.101
  vars:
    user: user
    home: /home/user

- hosts: 192.168.56.101
  vars_files:
    - vars.yml
    - vars2.yml

—
vars.yml
user: user
home: /home/user

<aside> 🏓 변수 사용 예제

user@master ~]$ mkdir vars
[user@master ~]$ cd vars
[user@master vars]$ vim inventory
>> inventory 파일 안에 작성

localhost
192.168.56.101

[user@master vars]$ vim ansible.cfg
>> ansible.cfg 파일 안에 작성

[defaults]
inventory = ./inventory

[user@master vars]$ vim playbook.yml
>> playbook.yml 파일 안에 작성 

---
- name: vars check
  hosts: all
  vars:
    user: user
    home: /home/user
  tasks:
    - name: print user variable
      debug:
        var: user
    - name: print home varialbe
      debug:
        var: home

[user@master vars]$ vim vars.yml
>> vars.yml 파일 안에 작성

user: user
home: /home/user

[user@master vars]$ cp playbook.yml playbook2.yml # 다시 만들기 귀찮아서 그냥 복사하고 내용 수정
[user@master vars]$ vim playbook2.yml
>> playbook2.yml 파일 안에 작성

---
- name: vars check
  hosts: all
  vars_files: # var file 불러오기
    - vars.yml # 파일의 이름만 작성하면 안에 내용 불러옴
  tasks:
    - name: print user variable
      debug:
        var: user
    - name: print home variable
      debug:
        var: home

인벤토리에서 변수 지정

[user@master ~]$ mkdir vars2
[user@master ~]$ cd vars2
[user@master vars2]$ vim ansible.cfg
>> ansible.cfg 파일 안에 작성

[defaults]
inventory = ./inventory

[user@master vars2]$ vim inventory
>> inventory 파일 안에 작성

[server]
localhost
192.168.56.101 hostname=worker # hostname=worker는 ip주소를 변수로 지정

[server:vars]
user=hello

[user@master vars2]$ vim playbook2.yml
>> playbook2.yml 파일 안에 작성

---
- name: vars check
  hosts: [localhost,192.168.56.101]
  tasks:
    - name: print inventory vars
      debug:
        var: user

<aside> 🎄 플레이북에 serverc를 호스트로 지정하고 sesac 변수를 불러오기 실습

# ansible.cfg 파일
[defaults]
inventory = ./inventory

# inventory 파일
[servera]
localhost

[serverb]
192.168.56.101 hostname=worker

[serverc:children]
servera
serverb

[serverc:vars]
sesac=hello

# playbook 파일
---
- name: get var
  hosts: serverc
  tasks:
    - name: print sesac
      debug:
        var: sesac

</aside>

플레이북에서 변수 지정

<aside> 🚖 group_vars, host_vars 실습

[user@master ~]$ mkdir vars3
[user@master ~]$ cd vars3
[user@master vars3]$ vim inventory
>> inventoy 파일 안에 작성

[servera]
localhost

[serverb]
192.168.56.101 hostname=worker

[serverc:children]
servera
serverb

[user@master vars3]$ vim ansible.cfg
>> ansible.cfg 파일 안에 작성

[defaults]
inventory=./inventory

[user@master vars3]$ mkdir group_vars
[user@master vars3]$ cd group_vars/
[user@master group_vars]$ vim servera # 파일이름은 서버와 일치해야함
>> servera 파일 안에 작성

package: httpd

[user@master group_vars]$ vim serverb
>> serverb 파일 안에 작성

package: mariadb-server

[user@master group_vars]$ vim serverc
>> serverc 파일 안에 작성

package: net-tools

[user@master group_vars]$ cd ..
[user@master vars3]$ mkdir host_vars
[user@master vars3]$ cd host_vars/
[user@master host_vars]$ vim 192.168.56.101
>> 192.168.56.101 파일 안에 작성

user: apache

[user@master host_vars]$ cd ..
[user@master vars3]$ vim playbook.yml
>> playbook.yml 파일 안에 작성

---
- name: group_vars host_vars check
  hosts: servera
  tasks:
    - name: servera's group_vars check
      debug:
        var: package

- name: group_vars host_vars check
  hosts: serverb
  tasks:
    - name: serverb's group_vars check
      debug:
        var: package

- name: group_vars host_vars check
  hosts: 192.168.56.101
  tasks:
    - name: 192.168.56.101's group_vars check
      debug:
        var: user

</aside>

명령줄에서 변수 지정

[user@master ~]$ mkdir vars4
[user@master ~]$ cd vars4
[user@master vars4]$ vim inventory
>> inventory 파일 안에 작성

192.168.56.101

[user@master vars4]$ vim ansible.cfg
>> ansible.cfg 파일 안에 작성

[defaults]
inventory = ./inventory

[user@master vars4]$ vim playbook.yml
>> playbook.yml 파일 안에 작성

---
- name: new variable
  hosts: 192.168.56.101
  tasks:
    - debug:
        var: user

# 그냥 실행할 때
[user@master vars4]$ ansible-playbook playbook.yml

PLAY [new variable] **********************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************
ok: [192.168.56.101]

TASK [debug] *****************************************************************************************************************************
ok: [192.168.56.101] => {
    "user": "VARIABLE IS NOT DEFINED!" # 변수가 정의되어 있지 않다고 나옴
}

PLAY RECAP *******************************************************************************************************************************
192.168.56.101             : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

# 명령어에 변수 지정했을 때
[user@master vars4]$ ansible-playbook playbook.yml **-e** "user=hello sesac=good"

PLAY [new variable] **********************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************
ok: [192.168.56.101]

TASK [debug] *****************************************************************************************************************************
ok: [192.168.56.101] => {
    "user": "hello" # 변수에 넣은 값 출력
}

PLAY RECAP *******************************************************************************************************************************
192.168.56.101             : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

<aside> ❗ 명령줄에 지정할 때는 맨 뒤에 -e 옵션 쓰고 뒤에 변수 지정해주기!

</aside>

변수 우선순위

  1. 명령줄에 정의된 추가 변수
  2. playbook의 play변수(vars, vars_files)
  3. 호스트 팩트
  4. 인벤토리에 정의된 host_vars 하위 파일에 정의된 변수