쿠버네티스 전문가 양성과정 7주차 3일(2/1)

최수환·2023년 2월 1일
0

Kubernetes

목록 보기
29/75
post-thumbnail

Ansible

플레이북

이전 블로그에서는 플레이북의 변수까지 다루었다.
이번에는 변수 이후에 조회 플러그인 부터 다룰 예정이다.

조회(lookup) 플러그인

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

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


📒 Ansible document 참조

프롬프트

vars_propmt

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

📒 파이썬 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를 확인해보면 실제로 유저가 생성된 것을 확인

필터

<필터의 역할>

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

<필터의 종류>

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으로 출력됨

profile
성실하게 열심히!

0개의 댓글