Ansible이 작업장의 도구면 Ansible Playbook은 작업 메뉴얼이고 Inventory는 재료이다.
1. Ansible 구성요소
1. Inventory : 관리할 대상의 서버 리스트, 자동화 대상(Managed Node)목록을 작성하는 곳
2. Modules : host에 action을 수행하는 스크립트, 자동화 기능 내장 패키지로 하나의 완전한 단위 기능 제공
3. Playbook : 앤서블의 구성, 배포 및 오케스트레이션이 포함된 파일로 OS 구성에서 애플리케이션 배포와 모니터링까지 4. 시스템의 상태를 순차적으로 정의할 수 있다.
5. Plug-in: 확장 기능(emai, logging) 제공
6. Custom modules : 사용자가 작성한 모듈
2. Playbook 예시
// Playbook은 yaml 포멧으로 작성한다.
- name: Create account # Playbook의 이름
hosts: "{{ HOST_NAME }}" # Remote host 이름
become: true # 명령을 실행하는 사용자 계정의 권한을 승격
tasks: # Remote host에서 수행할 작업들
- name: create user #create user task
user: # user: user 모듈 사용 선언
name: "{{ USER_NAME }}" #{{}} 이런 것들 playbook 실행 시 입력받을 인자 값, 생성할 사용자 계정이름
- name: set password # set password task
user:
name: "{{ USER_NAME }}" # 생성할 사용자 계정 이름
password: "{{ PASSWORD | password_hash('sha512') }}" # 생성할 사용자 계정 패스워드
- name: create sudoers
copy: # copy 모듈 사용 선언
content: | # content: 복사할 문자열
{{USER_NAME}} ALL=(ALL) NOPASSWD:ALL
dest: "/etc/sudoers.d/{{USER_NAME}}" # 복사할 목적지로 remote host의 절대경로
owner: root # 복사할 목적지의 파일/디렉토리 소유자
group: root # 복사할 목적지의 파일/디렉토리 그룹
mode: 0664 # 복사할 목적지 파일/디렉토리 권한 입력
3. Playbook의 모듈
1) 변수(register), 메세지 출력(debug.msg) 모듈 :
Playbook에서 task를 수행시 어떤 결과를 저장하고 다음 단계에서 이 값을 사용하고 싶은 경우 register 모듈을 사용해 변수에 저장한다.
- name: firstPlaybook
hosts: "{{ HOST_NAME }}"
become: true
tasks:
- name: Check OS version
shell: cat /etc/*rele* |grep VERSION= # shell 모듈 선언 및 OS version 읽어오는 스크립트 작성
register: result # 결과값을 저장할 변수
- name: Print result variable
debug:
msg:
- "{{ result.stdout }}"
변수에 결과를 저장하고 다른 task에서 해당 변수의 값을 사용할 수 있다.
반환 값에서 수행 겨로가 값만 가져오고 싶은 경우 "stdout" 또는 "stdout_lines"(결과 값이 여러 줄일 경우)을 사용하면 된다.
2) 조건문(when) : Task를 특정 조건일 때만 수행하고 싶은 경우 when 모듈을 이용한다.
- name: firstPlaybook
hosts: "{{ HOST_NAME }}"
become: true
tasks:
...
- name: Print result variable
debug:
msg:
- "{{ result.stdout }}"
when: result.stdout.find('17.04') != -1
“result.stdout”에는 “17.04”라는 문자열이 없으면 skip된다.
3) 파일 생성하기(file) :
- name: firstPlaybook
hosts: "{{ HOST_NAME }}"
become: true
tasks:
...
- name: Print result variable
debug:
msg:
- "{{ result.stdout }}"
when: result.stdout.find('16.04') != -1
- name: Create a file
file: #file: file 모듈 선언
path: "/tmp/example.txt" # path : 파일을 생성할 경로
state: touch # touch 옵션 선언, 파일이 존재하지 않을 경우에만 생성 조건
delegate_to: localhost # localhost 옵션 선언, Ansible host에서만 실행된다.
run_once: yes # yes인 경우 1회만 실행된다.
when: result.stdout.find('16.04') != -1
4) 파일에 결과 append하기(lineinfile)
- name: firstPlaybook
hosts: "{{ HOST_NAME }}"
become: true
tasks:
...
- name: Create a file
file:
path: "/tmp/example.txt"
state: touch
delegate_to: localhost
run_once: yes
when: result.stdout.find('16.04') != -1
- name: Append result
lineinfile: #lineinfile 모듈 선언
line: "{{ ansible_hostname }} : {{ (result.stdout | regex_replace('\"')).split('=')[1] }}" #파일에 추가할 값 입력
dest: "/tmp/example.txt" # 파일 경로
insertafter: EOF # 파일의 마지막에 추가
delegate_to: localhost # Ansible host에서만 실행
when: result.stdout.find('16.04') != -1
https://yunsangjun.github.io/automation/2019/11/18/ansible-playbook-advanced.html
'DevOps > Docker, Jenkins, Ansible, Terraform' 카테고리의 다른 글
Apache Tomcat (0) | 2023.02.10 |
---|---|
Terraform 테라폼, 여러 클라우드의 이기종 환경에서 프로비저닝 위함. (0) | 2023.02.05 |
CloudFormation (클라우드 포메이션)으로 인프라 관리하기 (0) | 2023.02.02 |
Jenkins, Packer, Ansible의 역할 (0) | 2023.01.24 |
Docker와 Vmware, Virtualbox 차이점 (0) | 2023.01.23 |