Search
Duplicate
📒

[Ansible] 02-2. 변수, 팩트(환경변수), 암호화

상태
완료
수업
Ansible
주제
4 more properties
참고

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
복사
플레이북