출처 : 앤서블로 시작하는 인프라 자동화, 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에 태스크를 수행한 결과가 저장되고 그 값을 출력하는 것을 확인할 수 있다.
변수들의 우선 순위
- 추가 변수
- 플레이 변수
- 호스트 변수
- 그룹 변수
'Study > 앤서블(Ansible)' 카테고리의 다른 글
변수와 팩트 사용하기 - 자동 예약 변수 팩트 (0) | 2024.03.20 |
---|---|
변수와 팩트 사용하기 - 패스워드 보관 Ansible Vault (0) | 2024.03.18 |
앤서블 플레이북 작성 및 실습 (0) | 2024.03.10 |
앤서블 환경 설정 파일 이론 및 앤서블 접근을 위한 SSH 인증구성 (0) | 2024.03.09 |
앤서블 활용 - 인벤토리 이론 및 실습 (0) | 2024.03.09 |