이전 블로그에서는 플레이북의 변수까지 다루었다.
이번에는 변수 이후에 조회 플러그인 부터 다룰 예정이다.
파일, 인벤토리, 키/값 저장소, API 등 외부 소스에서 데이터를 검색해 변수로 가져올 수 있음
ansible-doc -t lookup -l # 조회 플러그인 목록 확인
📒 파이썬 input이랑 비슷
# vars_prompt를 사용한 플레이북
- name: vars prompt test
hosts: ansi-node1
gather_facts: 0
vars_prompt: # prompt는 여러개가 들어감으로 리스트형태로 작성
- name: filename # 변수명
prompt: Input filename # 입력창
private: false # 입력하는 창이 보이도록 설정
tasks:
- name: create file
file:
state: touch
path: "/home/vagrant/{{ filename }}"
mode: "0600"
-> 플레이북 실행시 filename을 입력하라는 창이 뜬다
-> filename입력시 대상의 해당경로에 파일 생성
- name: vars prompt test
hosts: ansi-node2
gather_facts: 0
vars_prompt: # 아래에 옵션 입력
- name: username # 변수명
prompt: Input username # 입력창
private: 0 # 입력을 보이게
- name: password # 변수명
prompt: Input Password
private: 0
confirm: 1 # 다시 한번 암호 입력(암호 확인)
encrypt: sha512_crypt # 암호화 알고리즘
tasks:
- name: create user
user: # user 모듈
name: "{{ username }}"
password: "{{ password }}"
shell: "/bin/bash" # 쉘 지정
-> 위의 명령어를 통해 /etc/passwd를 확인해보면 실제로 유저가 생성된 것을 확인
<필터의 역할>
<필터의 종류>
1.
- name: default filter test
hosts: AA
tasks:
- name: test1
debug:
msg: "{{ var1 | default('DEFAULT') }}"
-> var1에 대한 변수가 지정이 안되면, 오류를 출력하는게 아니라 default라는 메세지를 출력 = 파이썬의 예외처리랑 비슷
# default 추가 예시
- name: deault & mandatory test
hosts: ansi-node1
tasks:
- name: command task
command: lt -al /home/vagrant #오타입력
register: result # 어떤 값도 담기지 않는다
ignore_errors: yes # 에러를 무시한다
- name: print result
debug:
msg: "{{ result.stdout | default('DEFAULT') }}"
-> 오타를 입력했을 때 result변수에 어떤 값도 안 담기고 오류가 나는 것을 ignore_errors로 무시하고 result변수를 출력하면 값이 없다. 이때 default필터에 의해 에러가 아닌 default가 출력
2.
- name: mandatory filter test
hosts: ansi-node1
tasks:
- debug:
msg: "{{ var1 | mandatory }}"
-> var1에 대한 변수가 지정이 안되면, 오류를 출력하되 var1에 대해 변수를 선언하라는 오류를 출력한다. 즉, 반드시 var1이 충족되어야 하게 만든다.
3.
- name: dicton to list
hosts: ansi-node1
vars:
dic1:
a: 1
b: 2
tasks:
- name: dic2 to list
debug:
msg: "{{ dic1 | dict2items }}"
-> dictionary를 list의 형태로 바꾸어 출력
# 위의 코드 마지막줄에 추가
- name: dict2list2
debug:
msg: "{{ dic1 | dict2items (key_name='alpha', value_name='int') }}"
-> dictionary를 list형태로 바꾸면서 key / value가 아닌 원하는 변수명으로 지정해서 출력
4.
- name: list to dict test
hosts: ansi-node1
vars:
list1:
- key: a
value: 1
- key: b
value: 2
tasks:
- debug:
msg: "{{ list1 | items2dict }} "
-> list를 dictionary 형태로 바꾸어 출력
5.
- name: ip addr filter
hosts: ansi-node1
tasks:
- debug:
msg: "{{ '192.168.56.21/24' | ipaddr('address') }}"
- debug:
msg: "{{ '192.123214r.123213' | ipaddr('address') }}"
-> pythons netaddr이 설치가 되어 있지 않아 오류가 출력된다
# 해당 노드와 master에 각각 netaddr 설치
ssh ansi-node1 # 해당 노드만
sudo apt install -y python-pip
sudo pip install netaddr
-> 설치후 다시 플레이북을 실행해보면 주소체계인 첫번째 주소는 정상적으로 출력되고 두번째 주소는 주소체계가 아니기 때문에 false가 출력되는 것을 확인
6.
- name: test
hosts: ansi-node1
gather_facts: 0
tasks:
- name: hash test
debug:
msg: "{{ '123' | hash('sha256') }}"
# 123을 sha256 알고리즘을 사용한 해쉬변환
-> 123이 해쉬변환되어 암호문이 출력되는 것을 확인
7.
- name: comment filter test
hosts: ansi-node1
gather_facts: 0
tasks:
- debug:
msg: "{{ '123\nbbb' | comment }}" # 주석처리
- debug:
msg: "{{ '123\nbbb' | comment(decoration='!') }}" # 원하는 문자로 주석처리
-> 주석변환으로 문장을 주석처리 한다.
- name: comment filter test
hosts: ansi-node1
gather_facts: 0
tasks:
- name: create file
file:
state: touch
dest: "/home/vagrant/commentfile"
- name: write file
lineinfile:
dest: "/home/vagrant/commentfile"
line: "{{ '123\nbbb' | comment }} {{ '123\nbbb' | comment(decoration='//') }}"
-> 파일 생성 후 lineinfile 모듈에 옵션으로 주석변환 필터를 적용하면 위의 사진처럼 주석처리가 되는 것을 볼 수 있다.
8.
- name: url split filter test
hosts: ansi-node1
gather_facts: 0
tasks:
- debug:
msg: "{{ 'http://user:password@www.acme.com:9000/dir/index.html?query=term#fragment' | urlsplit }}"
-> url의 각 항목이 분리되서 나타나는 것을 볼 수 있다.
9.
# 디렉터리와 파일 구분
- name: path check test
hosts: ansi-node1
gather_facts: 0
tasks:
- debug:
msg: "{{ '/etc/hostname' | basename }}" # basename = 파일, 맨 끝 경로
- debug:
msg: "{{ '/etc/hostname' | dirname }}" # dirname = 디렉터리, 중간 경로
-> /etc/hostname에서 맨 끝 경로이자 파일인 hostname이 basename으로 출력되고 중간 경로이자 디렉터리 /etc가 dirname으로 출력됨