[쿠버네티스 2/1] Ansible - 프롬프트(prompt) & 필터(filter)

신현식·2023년 2월 2일
0

구름_Ansible

목록 보기
3/5
post-thumbnail

조회(lookup) 플러그인

파일, 인벤토리, 키/값 저장소, API 등 외부 소스에서 데이터를 검색해 변수로 가져올
수 있다.

  • 조회 플러그인 목록 확인
    $ ansible-doc -t lookup -l

# 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) }}"

ansible 내용 참고 사이트

vars_prompt

▪ 플레이북에 vars_prompt 키워드로 변수를 선언하면, 플레이북을 실행하기 전 사용자에게 변수의 값을 입력하도록 요청할 수 있음
▪ 민감한 데이터나 자주 변경되는 데이터를 플레이북에 저장하지 않고, 사용자가 입력하도록 하는 것
▪ 사용자를 생성하기 위한 패스워드와 같은 민감한 데이터나, 설치 하고자하는 패키지의 버전이 자주 변경되는 경우 버전을 지정하도록 사용할 수 있음

  • name: 변수 명
  • prompt: 프롬프트에 출력될 문자열
  • private: 입력 값이 보이는지 여부
  • default: 기본값
  • encrypt: 암호화/해시 알고리즘
  • confirm: 입력값을 한번 더 검증
  • salt_size: Salt 길이(기본 8)

프롬프트 실습

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

user와 password 입력해서 만들기

- 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

ansi-node2, ansi-node3 대상 (그룹이 아닌 노드로 지정해 볼 것)으로 /home/vagrant/testdir/testfile 생성, testdir 과 testfile은 prompt 변수를 이용해서 이름을 지정하고 소유자와 소유 그룹은 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

필터

  • 변수값의 변환

    • JSON 데이터를 YAML 데이터로 변환
    • URL을 분할하여 호스트 이름을 추출
    • 문자열의 SHA1 해시를 가져옴
    • 정수를 더하거나 곱하는 등의 작업을 수행
  • 정의되지 않은 변수를 관리하기 위해 변수에 기본값을 제공하거나 변수를 선택적으로 설정한다.

  • 변수 선언 뒤에 파이프 ‘|’ 를 이용해 필터를 지정

필터 실습 : default


- 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 }}"

필터 실습 : IP address 확인

# 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 
                                                             

노드에 수동으로 설치없이 IP address 확인하기


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='!') }}"

profile
전공 소개

0개의 댓글