변수와 팩트 사용하기 - 변수의 종류와 사용법

728x90
반응형

출처 : 앤서블로 시작하는 인프라 자동화, https://www.youtube.com/watch?v=DU0NMpof4j0

https://www.youtube.com/watch?v=-FRh8Ng_V48

 

  • 동일한 코드 구문에 입력되는 값에 따라 동작을 변경하여 반복적인 사용이 가능하도록 설계하기 위해 앤서블 플레이북에서도 변수를 정의하고 사용할 수 있다.
  • 변수를 어디에 정의하느냐에 따라 그룹 변수가 될 수도, 호스트 변수가 될 수도, 플레이 변수가 될 수 있다.
  • 변수는 일반적인 내용을 저장하는 일반 변수, 패스워드와 같이 암호화가 필요한 정보들을 저장하는 변수, 시스템에서 수집한 값들을 저장하는 변수가 있다.

 

 

변수의 종류와 사용법

  • 앤서블은 변수를 사용하여 사용자, 설치하고자 하는 패키지, 재시작할 서비스, 생성 또는 삭제할 파일명 등 시스템 작업 시 사용되는 다양한 값을 저장할 수 있다.
  • 변수를 활용하면 플레이북을 재사용할 수 있으며, 사용자로부터 받은 값도 쉽게 적용할 수 있다.
  • 앤서블에서 사용되는 다양한 변수가 존재한다.
    • 그룹 변수
    • 호스트 변수
    • 플레이 변수
    • 추가 변수
    • 작업 변수

 

그룹 변수

  • 그룹 변수는 인벤토리에 정의된 호스트 그룹에 적용하는 변수를 의미한다.
  • 인벤토리에 선언해야 하고, 선언하고자 하는 그룹명과 함께 :vars 라는 문자열을 추가해 변수를 선언한다는 것을 알려준다.

 

vi inventory

 

ansible-server의 my-ansible 디렉토리에 있는 inventory를 vi 에디터를 이용해 실행 및 수정한다.

 

 

[web]
tnode1-centos
tnode2-ubuntu

[db]
tnode3-ubuntu

[all:children]
web
db

[all:vars]
user=ansible

 

기존 인벤토리에 [all:vars] 섹션을 선언하고 user=ansible 이라는 변수와 값을 선언한다.

이렇게하면 all 이라는 그룹에서 user 라는 변수를 사용할 수 있다. 다음 예제에서 all 그룹에는 web 그룹과 db 그룹이, web 그룹에는 tnode1-centos, tnode2-ubuntu 가 포함되며, db 그룹에는 tnode3-ubuntu 라는 호스트가 포함된다.

 

---


- hosts: all
  tasks:
  - name: Create User {{ user }}
    ansible.builtin.user:
      name: "{{ user }}"
      state: present

 

vi 에디터로 create-user.yml 파일을 생성하고 위 내용을 작성한다.

해당 파일은 사용자를 생성하는 태스크를 포함한다. 앤서블에서 시스템 사용자(account)를 생성하기 위해서는 ansible.builtin.user 라는 모듈을 사용한다. 인벤토리에서 선언한 user 라는 변수를 겹 중괄호 사이에 넣어주면, 해당 변수를 플레이북에서 사용할 수 있다. (겹 중괄호와 변수명 사이는 항상 한 칸씩 띄어주어야 한다.)

 

ansible-playbook --syntax-check create-user.yml

 

--syntax-check 옵션을 사용해서 문법 오류가 있는지 확인한다.

 

ansible-playbook create-user.yml

 

생성한 플레이북을 실행한다. 

태스크명으로 "Create User ansible" (인벤토리에서 {[ user }} = ansible 이므로) 이 출력된다.

 

 

ssh tnode1-centos
ll /home
exit
ssh tnode2-ubuntu
ll /home
exit
ssh tnode3-ubuntu
ll /home
exit

 

실제 대상 호스트에 접근해서 ansible 이라는 사용자가 생성되었는지 확인한다.

시스템에서 사용자를 생성하면 /home 디렉토리 아래에 해당 사용자명으로 디렉토리가 생성된다.

 

 

호스트 변수

  • 호스트 변수는 해당 호스트에서만 사용할 수 있는 변수이다.

 

vi inventory

[web]
tnode1-centos
tnode2-ubuntu

[db]
tnode3-ubuntu user=ansible1

[all:children]
web
db

[all:vars]
user=ansible

 

vi 에디터로 인벤토리를 열고 db 그룹에 user=ansible1 이라는 변수를 선언한다.

 

cp create-user.yml create-user1.yml
vi create-user1.yml

---


- hosts: db
  tasks:
  - name: Create User {{ user }}
    ansible.builtin.user:
      name: "{{ user }}"
      state: present

 

create-user.yml 파일을 create-user1.yml 파일로 복사한 다음 vi 에디터로 hosts를 all -> db 로 수정한다.

 

ansible-playbook --syntax-check create-user1.yml

 

ansible-playbook의 --syntax-check 옵션을 사용해 create-user1.yml 파일의 문법 오류가 있는지 확인한다.

 

ansible-playbook create-user1.yml

 

ansible-playbook 명령어로 create-user1.yml 파일을 실행한다.

이때 user 명은 인벤토리 [all:vars] 섹션에 선언된 ansible이 아니라 db 그룹의 ansible1 이 출력되는 것을 확인할 수 있다.

이를 통해 호스트 변수는 그룹 변수에 비해 우선 순위가 높다는 것을 알 수 있다.

 

ssh -p 22 tnode3-ubuntu
ll /home
exit

 

tnode3-ubuntu 호스트로 들어가보면 ansible1 이라는 사용자가 생성된 것을 확인할 수 있다.

 

 

플레이 변수

  • 플레이 변수는 플레이북 내에서 선언되는 변수를 의미한다.

 

 

cp create-user1.yml create-user3.yml
vi create-user3.yml

---


- hosts: all
  vars:
    user: ansible2

  tasks:
  - name: Create User {{ user }}
    ansible.builtin.user:
      name: "{{ user }}"
      state: present

 

create-user1.yml 파일을 create-user3.yml 파일로 복사하고 vi 에디터로 열어 수정한다.

hosts 아래에 vars: 를 추가하고 user: ansible2라는 변수와 값을 추가한다.

 

ansible-playbook --syntax-check create-user3.yml
ansible-playbook create-user3.yml

 

에러 체크를 진행한 다음, 문제가 없으면 create-user3.yml 파일을 실행한다.

실행하고 TASK [Create User {{ user }}]부분을 보면 인벤토리에서 선언한 ansible이나 호스트 변수 ansible1 대신 플레이 변수 ansible2가 출력되는 것을 확인할 수 있다.

즉, 플레이 변수가 그룹 변수나 호스트 변수보다 우선순위가 높다는 것을 알 수 있다.

 

mkdir vars
cd vars
vi users.yml

user: ansible4

 

플레이 변수를 별도의 파일로 분리하여 정의한 후 이를 플레이북에서 선언하는 방법으로 변수를 사용해보자.

먼저 vars 디렉토리를 만들고 이동한 다음 users.yml 파일에 다음과 같이 user: ansible4 라는 내용을 추가한다.

 

cp create-user3.yml create-user4.yml
vi create-user4.yml

---


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

  tasks:
  - name: Create User {{ user }}
    ansible.builtin.user:
      name: "{{ user }}"
      state: present

 

create-user3.yml 파일을 복사해 create-user4.yml 파일을 만들고 위 내용처럼 vars를 vars_files: 로 수정한다.

 

ansible-playbook create-user4.yml

 

create-user4.yml 파일을 실행하면 user 변수가 ansible4로 출력되는 것을 확인할 수 있다.

 

 

추가 변수

  • 추가 변수는 외부에서 ansible-playbook를 실행할 때 함께 파라미터로 넘겨주는 변수를 의미한다.
  • 추가 변수는 앞에서 살펴봤던 변수 중 우선 순위가 가장 높다.

 

ansible-playbook -e user=ansible5 create-user4.yml

 

이번에는 플레이북을 새로 생성하지 않고 기존에 사용했던 create-user4.yml 파일을 사용한다.

ansible-playbook 명령어와 함께 -e user=ansible5 라는 값을 추가한다. 여기서 -e 옵션은 --extra_vars의 약어로 추가 변수를 의미한다.

플레이북을 실행하면 별도의 파일을 추가한 ansible4 가 아닌 추가 변수에 의해 선언한 ansible5 가 출력되는 것을 확인할 수 있다.

 

 

작업 변수

  • 작업 변수는 플레이북의 태스크 수행 결과를 저장한 것을 의미한다.
  • 특정 작업 수행 후 그 결과를 후속 작업에서 사용할 때 주로 사용된다.

 

cp create-user1.yml create-user6.yml
vi create-user6.yml

---


- hosts: db
  tasks:
  - name: Create User {{ user }}
    ansible.builtin.user:
      name: "{{ user }}"
      state: present
    register: result

  - ansible.builtin.debug:
      var: result

 

create-user1.yml 파일을 create-user6.yml 파일로 복사한다. 그리고 vi 에디터로 create-user6.yml 파일을 수정한다.

Create User 태스크에 register: result 라는 문구를 추가한다.

register를 선언하면 태스크를 실행한 결과를 register 다음에 나오는 result 라는 변수에 저장하겠다는 의미이다.

그리고 result 라는 변수에 저장한 결과를 debug 모듈을 통해 출력한다.

 

ansible-playbook --syntax-check create-user6.yml
ansible-playbook -e user=ansible6 create-user6.yml

 

에러 체크를 진행하고 문제가 없으면 추가 변수 -e user=ansible6로 실행한다.

결과를 보면 result에 태스크를 수행한 결과가 저장되고 그 값을 출력하는 것을 확인할 수 있다.

 

 

변수들의 우선 순위

  1. 추가 변수
  2. 플레이 변수
  3. 호스트 변수
  4. 그룹 변수

 

 

728x90
반응형