참고
Ansible 변수
NOTE
Ansible에서 변수는 Playbook, Template. 또는 기타 작업에서 동적으로 값을 설정하고 사용할 수 있는 중요한 요소이며, 설정되는 위치와 목적에 따라 종류가 나뉩니다.
Ansible에서 사용되는 변수는 CLI 변수, 그룹 변수, 호스트 변수, 플레이북 변수, 추가 변수, Playbook의 결과를 저장하기 위한 작업 변수가 있습니다.
# -e 환경변수 설정
ansible-playbook playbook.yaml -e "hello=hello"
Bash
복사
CLI 변수
인벤토리 호스트 & 그룹 변수
NOTE
인벤토리 변수는 인벤토리 파일에서 호스트나 그룹에 정의된 변수이며, 호스트 변수와 그룹변수는 특정 호스트에및 그룹에 대해 정의한 변수이고, 인벤토리나 host_vars 디렉토리에 개별 정의가 가능합니다.
all:
children:
group1:
hosts:
# 호스트 변수
host1:
ansible_host: 192.168.1.1
ansible_user: ubuntu
my_var: value1
# 호스트 변수
host2:
ansible_host: 192.168.1.2
ansible_user: ubuntu
# 그룹 변수
vars:
group_var: value2
YAML
복사
인벤토리 호스트 & 그룹 변수
host_vars(호스트 변수)
ansible_host: 192.168.1.101
ansible_user: ubuntu
custom_var: value1
YAML
복사
/host_vars/host1.yml
group_vars(그룹 변수)
group_var: groupa1_value
another_var: group1_another_value
YAML
복사
group_vars/gruop2.yml
플레이북 변수
NOTE
앤서블은 동일한 코드 구문에 입력되는 값에 따라 실행결과 값이 바뀌도록 플레이북에서 변수를 정의하고 사용할 수 있다!
- hosts: all
# 플레이북 변수 사용
vars:
user: ansible2
task:
- name: Create User {{ user }}
ansible.builtin.user:
name: "{{ user }}"
state: present
YAML
복사
플레이북 변수
# -e(--extra_vars)
ansible-playbook -e user=ansible5 create-user5.yaml # 매개변수 사용
YAML
복사
ansible-playbook을 실행할 때 파라미터로 넘겨주는 변수
- hosts: all
# 플레이북 외부 변수파일 사용
vars_files:
- vars/users.yaml
task:
- name: Create User {{ user }}
ansible.builtin.user:
name: "{{ user }}"
state: present
YAML
복사
플레이북 외부 변수파일
# 변수파일
user: ansible4
Bash
복사
vars/users.yaml
작업 변수
작업 변수는 특정 Task내에서만 사용되는 변수이며, 작업 변수를 활용하면 플레이북의 작업을 더 명확하게 정의할 수 있으며 종류는 다음과 같습니다.
•
vars: 특정 작업 내에서 변수를 정의한다.
•
with_items: 루프를 통해 변수를 정의하고 사용할 수 있다.
•
register: 작업의 출력을 변수에 저장한다.
- name: Jinja2 템플릿
hosts: defaults
gather_facts: no
tasks:
- name: 파일 경로 생성
# 내부 변수 vars 선언
vars:
directory_path: /root/bh
file:
path: "{{ directory_path }}"
state: directory
mode: '0755'
- name: 템플릿 렌더링
# 내부 변수 vars 선언
vars:
template_src: templates/sample_template4.j2
template_dest: /root/bh/output4.txt
name: "Alice"
company: "Acme Corp"
template:
src: "{{ template_src }}"
dest: "{{ template_dest }}"
- name: 파일 출력
# 내부 변수 vars 선언
vars:
file_path: /root/bh/output4.txt
command:
cmd: cat "{{ file_path }}"
# register: 작업 출력을 변수에 저장
register: cat_output
changed_when: false
- name: 출력확인
debug:
msg: "{{ cat_output.stdout }}"
YAML
복사
Ansible Facts
NOTE
Ansible 팩트는 Ansible이 관리 대상 호스트에서 수집하는 시스템 정보를 말합니다. 이 정보는 모듈을 통해 자동으로 수집되며, Ansible 플레이북이나 템플릿에서 사용할 수 있도록 변수 형태로 제공됩니다.
# setup 모듈은 관리 호스트에서 Ansible 팩트를 저장한다.
ansible all -m setup
Bash
복사
•
Ansible 팩트는 setup 모듈에 의해 수집된 호스트의 시스템 정보이다.
Ansible 팩트는 플레이북 실행 시 기본적으로 수집됩니다. 수집을 활성/비활성화 하기위해서는 아래와 같이 설정 해야합니다.
- name: Example Playbook
hosts: all
gather_facts: True # 활성여부
tasks:
# 팩트 사용 ansible_facts[팩트명] 방식
- name: Display OS Family using ansible_facts
debug:
msg: "OS Family: {{ ansible_facts['os_family'] }}"
# 팩트 사용 ansible_팩트명 방식
- name: Display OS Family using ansible_os_family
debug:
msg: "OS Family: {{ ansible_os_family }}"
YAML
복사
Ansible 팩트 사용 예시 1
•
ansible_facts.* 기반과 이전 표기법인 ansible_* 표기법을 모두 인지하며 이는 ansible.cfg의 [default]에 있는 inject_facts_as_vars 매개변수 값이 기본 true이기 때문입니다.
- name: 호스트 정보 수집 및 표시
hosts: all
tasks:
- name: 정보 수집
setup:
- name: 현재 OS 표시
debug:
msg: "현재 OS: {{ ansible_facts['os_family'] }} {{ ansible_facts['distribution'] }} {{ ansible_facts['distribution_version'] }}"
- name: 호스트명 표시
debug:
msg: "호스트명: {{ ansible_facts['hostname'] }}"
- name: 도메인 기반 호스트명 표시
debug:
msg: "FQDN: {{ ansible_facts['fqdn'] }}"
- name: 기본 IPv4 주소 표시
debug:
msg: "기본 IPv4 주소: {{ ansible_facts['default_ipv4']['address'] }}"
- name: 네트워크 인터페이스 목록 표시
debug:
msg: "네트워크 인터페이스: {{ ansible_facts['interfaces'] }}"
- name: /dev/vda1 디스크
debug:
msg: "/dev/vda1 파티션 크기: {{ ansible_facts['devices'] }}"
- name: DNS 서버 목록 표시
debug:
msg: "DNS 서버: {{ ansible_facts['dns']['nameservers'] }}"
- name: 현재 실행 중인 커널 버전 표시
debug:
msg: "커널 버전: {{ ansible_facts['kernel'] }}"
- name: 운영체제 종류 표시
debug:
msg: "OS 분포: {{ ansible_facts['distribution'] }}"
YAML
복사
Ansible 팩트 사용 예시 2
사용자 지정 팩트 만들기
NOTE
Ansible에서 사용자 지정 팩트는 /etc/ansible/facts.d 디렉토리 내에 *.fact로 저장되어야만 자동으로 수집할 수 있습니다.
[pacakges]
web_package = httpd
db_package = mariadb-server
YAML
복사
/etc/ansible/facts.d/my-custom.fact
"ansible_local": {
"my-custom": {
"pacakges": {
"db_package": "mariadb-server",
"web_package": "httpd"
}
}
},
YAML
복사
setup 결과 일부..
•
ansible_local은 Ansible에서 제공하는 특수변수로, Ansible이 호스트에 접근하여 setup을 통해 수집되지 않은 정보를 저장합니다.
Ansible Vault(암호화)
NOTE
앤서블은 중요한 데이터에 대한 정보들을 인벤토리 변수에 사용하기 위해 암호화가 가능한 Ansible Vault기능을 사용한다!
# 암호화 생성
ansible-vault create [암호화 파일 저장경로]
# 패스워드 셍상
# 암호화 내용작성
# 복호화 방법
ansible-vault view [암호화 파일 저장경로]
# 패스워드 입력시 저장된 내용확인 가능
YAML
복사
패스워드 입력
파일을 이용한 암호화
NOTE
password
YAML
복사
암호화 파일
# 암호화 생성(비밀번호 파일 사용)
ansible-vault create \
--vault-pass-file ./vault-pass [암호화 파일 저장경로]
# 복호화 (비밀번호 파일 사용)
ansible-vault view \
--vault-pass-file ./vault-pass [암호화 파일 저장경로]
Bash
복사
기존 파일 암호화/복호화(encrypt, decrypt)
NOTE
user: ansible
password: P@ssw0rd!
YAML
복사
암호화할 파일
# 암호화
ansible-vault encrypt [암호화 파일 저장경로]
# 복호화
ansible-vault decrypt [암호화 파일 저장경로]
Bash
복사
암호화된 파일을 이용한 플레이북
NOTE
user: ansible
password: P@ssw0rd!
YAML
복사
암호화 파일
---
- hosts: all
vars_files:
- /root/infra_study/ansible/vault/mysecret.yaml
tasks:
- name: Create User {{ user }}
ansible.builtin.user:
name: "{{ user }}"
state: present
YAML
복사
플레이북
ansible-playbook ./playbook/vault-playbook.yaml # 에러메시지 출력됨
# --vault-id @prompt를 통해 패스워드 입력 프롬프트 나온다.
ansible-playbook --vault-id @prompt ./playbook/vault-playbook.yaml
# --vault-password-file을 통해 패스워드를 저장해둔 파일 사용
ansible-playbook --vault-password-file=./vault/vault-pass ./playbook/vault-playbook.yaml
Bash
복사
플레이북