Ansible When 조건문 및 파일 내용 추가
Ansible when 조건문을 활용하여 해당 파일이 있는 서버에만(*조건) 파일에 내용을 추가하는 기능을 실습해보려 한다.
EC2 3개 (ansible1, hosts2) 로 테스트를 진행해보겠다.
Ansible 파일 내용 추가
일단 이미 존재하는 파일에서 내용을 추가하는 기능을 실습하겠다.
ansible의 lineinfile 모듈은 regular expression을 사용하여 파일의 내용을 변경하는 작업을 하는 모듈이다.
( regular expression/정규 표현식 은 문자열에서 특정 문자 조합을 찾기 위한 패턴이다.)
---
- hosts: all
name: rc-local service status check
gather_facts: false
become: true
tasks:
- name: rc-local start and check
lineinfile:
path: /home/rc.local
line: |
cd /app/tomcat8.5/apache-tomcat-8.5.53/bin # tomcat start
sleep 1
./startup.sh
(파일명이 rc.local 인 이유는... 맞춰보세요 ㅋㅋ)
성공적으로 라인이 추가되었다.
옵션을 지정하지 않으면 일단 가장 마지막 내용 다음으로 추가되는듯하다.
Ansible When 조건문
이번에는 when 조건문을 활용하여 조건이 참인 hosts에만 명령을 수행해보겠다.
hosts server1 에는 cwcw 디렉터리가 존재하고, hosts server 2에는 cwcw 디렉터리가 존재하지 않는다.
when 조건문을 활용하여 cwcw 디렉터리의 존재 유무를 파악하고, cwcw 디렉터리가 존재하지 않는
경우에만 cwcw 디렉터리를 생성해주겠다.
---
- hosts: all
name: lvm filesys checker
gather_facts: false
become: true
tasks:
- name: Check that the unarchive files exists
stat:
path: /home/cwcw/
register: stat_result
- name: Move unarchive directory to root directory
shell: sudo mkdir /home/cwcw/
when: stat_result.stat.exists == False
stat 모듈로 디렉터리의 존재 유무를 register(stat_result)로 가져온다.
그리고 값이 저장된 register를 사용하여 조건을 지정하고, cwcw 디렉터리를 생성하는 명령을 실행한다.
(참고로 name에 lvm 어쩌구는 무시하셔도 좋습니다.)
cwcw 디렉터리가 존재하지 않는 hosts server 2에 cwcw 디렉터리가 생성되면 성공한것이다.
task 실행 결과 내용에 이미 cwcw가 존재하는 hosts 1은 skipped 된 것을 확인할 수 있다.
hosts2에 cwcw 디렉터리가 성공적으로 생성되었다.
성공~
Ansible 조건에 충족하면 파일에 내용 추가
본인은 /etc/rc.local 파일에 service start 기능을 하는 sh을 등록해 서버들의 service가 재부팅시
자동으로 시작하게끔 when, lieninfile을 실습해보았다.
(서버 수가 수십대고 각자 서비스도 달라서 rc.local 파일에 내용을 각각 다르게 설정해주어야한다.)
이제 실제로 본인이 필요한 기능을 테스트해보겠다.
---
- hosts: all
name: file gogo
gather_facts: false
become: true
tasks:
- name: Check that the unarchive files exists
stat:
path: /home/cwcw/
register: stat_result
- name: Move unarchive directory to root directory
lineinfile:
path: /home/rc.local
line: |
cd /app/tomcat8.5/apache-tomcat-8.5.53/bin
sleep 1
./startup.sh
when: stat_result.stat.exists == True
만약 cwcw 디렉터리가 존재한다면, rc.local에 내용을 추가하는 명령이다.
(hosts 2 cwcw는 삭제하고 진행하였다.)
오류없이 성공적으로 진행되었다.
아무런 변화가 없는 cwcw 미존재 hosts 2.
반면 cwcw 디렉터리가 존재하는 hosts 1은 rc.local 파일 라인이 더 추가된것을 확인할 수 있다.
이걸로 when 조건문으로 lieninfile(파일 내용 추가 모듈)을 조건에 맞게 사용하는 실습을 완료하였다.
.
.
.
이렇게 Ansible은 기본적으로 우리가 필요한 거의 모든 기능이 모듈로 구현이 되어 있다.
본인도 처음 Ansible을 만지고 배울때는 모듈의 존재를 몰라 필요한 기능들을 한 줄 한줄 ~ shell로 나타내 진행했던
기억이 난다.
(사실 이번 글에도 충분히 모듈로 진행할 수 있는 부분이 있습니다. cwcw디렉터리 생성의 경우가 그렇습니다. )
file 모듈을 사용하면 될 것을..
그러므로 상황에 따라 필요한 모듈을 찾아내는것이 Ansible 고수의 지름길이 아닐까 생각해 본다.^^
'IaC > Ansible_앤서블' 카테고리의 다른 글
[Ansible] 자주 사용하는 간단한 모듈 활용 (0) | 2023.02.13 |
---|---|
[Ansible] When 조건문 트리구조 생성(includ_tasks) (0) | 2023.01.30 |
[Ansible] 작업 제어 구현 - 오류처리 (0) | 2023.01.19 |
[Ansible] 앤서블(Ansible) Playbook 만들기 - update, shutdown, 파일 복사하기 (0) | 2023.01.13 |
[Ansible] 앤서블(Ansible) 호스트 명령 내리기 (0) | 2023.01.12 |