파일, 인벤토리, 키/값 저장소, API 등 외부 소스에서 데이터를 검색해 변수로 가져올
수 있다.
# file 조회 플러그인을 이용해서 파일의 내용을 가져오기
- name: hostname lookup
hosts: AA
vars:
m_hostname: "{{ lookup('file', '/etc/hostname') }}"
tasks:
- name: var print
debug:
msg: "{{ m_hostname }}"
# url 조회 플러그인을 이용해 정보를 변수로 지정
- name: url lookup
hosts: AA
tasks:
- name: display ip ranges
debug:
msg: "{{ lookup('url', 'https://ip-ranges.amazonaws.com/ip-ranges.json',split_lines=False) }}"
▪ 플레이북에 vars_prompt 키워드로 변수를 선언하면, 플레이북을 실행하기 전 사용자에게 변수의 값을 입력하도록 요청할 수 있음
▪ 민감한 데이터나 자주 변경되는 데이터를 플레이북에 저장하지 않고, 사용자가 입력하도록 하는 것
▪ 사용자를 생성하기 위한 패스워드와 같은 민감한 데이터나, 설치 하고자하는 패키지의 버전이 자주 변경되는 경우 버전을 지정하도록 사용할 수 있음
vi prompt1.yml
- name: var prompt test
hosts: ansi-node1
gather_facts: no
vars_prompt:
- name: filename
prompt: Input filename
private: no
tasks:
- name: create file
file:
state: touch
path: "/home/vagrant/{{ filename }}"
mode: 600
ansible-playbook prompt1.yml --syntax-check
ansible-playbook prompt1.yml
Input filename: testfile1
# ansi-node1으로 가서 testfile1이 만들어 졌나 확인
vagrant@ansi-master1:~/ansitest
$ ssh ansi-node1 ls -l ~/
total 0
---x-wx--T 1 root root 0 Feb 1 05:21 testfile1
- name: vars prompt test
hosts: ansi-node2
gather_facts: 0
vars_prompt:
- name: username
prompt: Input username
private: no
- name: password1
prompt: Input password
private: 0
confirm: 1
encrypt: sha512_crypt
tasks:
- name: create user
user:
name: "{{ username }}"
password: "{{ password1 }}"
shell: "/bin/bash"
vagrant@ansi-master1:~/ansitest
$ ansible-playbook prompt2.yml
Input username: tesetuser1
Input password: dkagh1
confirm Input password: dkagh1
PLAY [vars prompt test] ************************************************************************
TASK [create user] *****************************************************************************
changed: [ansi-node2]
PLAY RECAP *************************************************************************************
ansi-node2 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# 만들어진거 확인
vagrant@ansi-master1:~/ansitest
$ ssh ansi-node2 ls -l /home
total 12
drwxr-xr-x 2 tesetuser1 tesetuser1 4096 Feb 1 06:01 tesetuser1
drwxr-xr-x 3 ubuntu ubuntu 4096 Jan 30 02:27 ubuntu
drwxr-xr-x 6 vagrant vagrant 4096 Feb 1 02:37 vagrant
- name: create file & directory
hosts: ansi-node2,ansi-node3 #ansi-node2:ansi-node3
gather_facts: no
vars_prompt:
- name: f_name
prompt: Input FileName
private: no
- name: d_name
prompt: Input DirectoryName
private: no
tasks:
- name: Create Directory
file:
state: directory
path: /home/vagrant/{{ d_name }}
owner: vagrant
group: vagrant
- name: Create File
file:
state: touch
path: "/home/vagrant/{{ d_name }}/{{ f_name }}"
owner: vagrant
group: vagrant
변수값의 변환
정의되지 않은 변수를 관리하기 위해 변수에 기본값을 제공하거나 변수를 선택적으로 설정한다.
변수 선언 뒤에 파이프 ‘|’ 를 이용해 필터를 지정
- name: default filter
hosts: localhost
tasks:
- name: var print
debug:
msg: "{{ var1 | default('default') }}"
정의되지 않은 변수를 무시하도록 Ansible을 구성하는 경우 일부 값을 필수로 정의하도록 요구할 수 있다.
- name: default filter
hosts: localhost
vars:
var1: test
tasks:
- name: var print
debug:
msg: "{{ var1 | mandatory }}"
# dict => list
- name: dict2items filter
hosts: ansi-node1
vars:
dic1:
a: 1
b: 2
tasks:
- name: dict2list
debug:
msg: "{{ dic1 | dict2items }}"
- name: dict2list
debug:
msg: "{{ dic1 | dict2items(key_name='alph',value_name='int') }}"
# list => dict
- name: list2dict filter
hosts: ansi-node1
gather_facts: no
vars:
list1:
- key: a1
value: 1
- key: b1
value: 2
tasks:
- debug:
msg: "{{ list1 | items2dict }}"
# ansi-node1에 설치
sudo apt install -y python-pip
sudo pip install netaddr
vi ipaddr.yml
- name: ip addr test
hosts: ansi-node1
tasks:
# 실패사례
- debug:
msg: "{{ '192.168.56.21/24' | ipaddr('address') }}"
# 성공사례 -> false로 나옴
- debug:
msg: "{{ '192.16121218.56.2123' | ipaddr('address') }}"
ansible-playbook ipaddr.yml
vi ipaddr2.yml
- name: ip addr test
hosts: ansi-node2
tasks:
- name: install pip
- apt:
name: python-pip
state: present
update_cache: 1
- name: install netaddr
- pip:
name: netaddr
version: '0.8.0'
state: present
# 성공사례
- debug:
msg: "{{ '192.168.56.21/24' | ipaddr('address') }}"
# msg: "{{ '192.168.56.21/24' | ipaddr('0.0.0.0/0') }}" 이 형식도 가능함
# 실패사례 -> false로 나옴
- debug:
msg: "{{ '192.16121218.56.2123' | ipaddr('address') }}"
ansible-playbook ipaddr2.yml
문자열을 해시 변환한다.
vi hash1.yml
- name: hash filter
hosts: ansi-node1
gather_facts: no
tasks:
- debug:
msg: "{{ '123' | hash('sha256') }}"
- debug:
msg: "{{ 'vagrant' | password_hash('sha512','i/uZX2Q9') }}"
변수 값에 대해서 주석으로 전환
- name: comment filter
hosts: ansi-node1
gather_facts: no
tasks:
- debug:
msg: "{{ 'aaa\nbbb' | comment }}"
- debug:
msg: "{{ 'aaa\nbbb' | comment(decoration='!') }}"