[Ansible] Ansible 정리

Ansible 정리

(# 앤서블 철저 입문 요약)

1. 개요

1.1 앤서블 구성

1.1.1 본체

앤서블 소프트웨어 그 자체

1.1.2 인벤토리

1.1.3 모듈

앤서블에서 실행된 하나하나의 명령

1.1.4 플레이북

1.2 특징

2. 앤서블 사용

2.1 플레이북

2.1.1 플레이북 기본형

---
- name: Test
	hosts: all
	tasks:

2.1.2 플레이

2.1.3 실행

ansible-playbook -i (inventory_name) (playbook_name)

2.1.4 관리자 권한 실행

hosts 밑에 다음을 추가

become : true

2.1.5 태스트 작성 방법

- name: <Task를 알기 쉽게 정한 이름>
	<module name>:
		<module arg1>: <arg value1>
		<module arg2>: <arg value2>
		
	<task directive2>: <directive value2>

2.2 자주 사용하는 모듈

2.2.1 파일 작업

File - 파일과 디렉터리 상태 작업

- name: ~~~~~
	file:
		path: /tmp/dir1
		state: directory

state에 가능한 설정 값

Copy - 파일을 작업 대상에게 전송

앤서블 운용 서버에 존재하는 파일을 작업 대상 서버에 전송 가능

- name: 파일을 복사하는 샘플 플레이
	hosts: all
	tasks:
		- name: 운용 서버의 파일을 원격으로 복사
		  copy:
			src: original_file
			dest: ~/copied_file

lineinfile - 기존 파일을 행 단위로 수정

tasks:
	- name: root가 패스워드로 ssh 로그인 금지
	  lineinfile:
	  	dest: /etc/ssh/sshd_config
	  	regexp: '^PermitRootLogin\s+'
	  	line: PermitRootLogin without-password
	  	validate: sshd -t -f %s
	  notify:
	  	- sshd 재시작
handler:
	- name: sshd 재시작
	  service:
	  	name: sshd
	  	state: restarted

2.2.2 명령어 실행 모듈

command - 임의의 명령 실행

- name: ssh 생성 플레이
  hosts: all
  tasks:
  	- name: ssh 키 생성
  	  command: "/usr/bin/ssh-keygen -b 2048 -t rsa -N '' -f /tmp/new-id-rsa"
  	  args:
  	  	creates: /tmp/new-id-rsa

추가로 옵션을 설정해야 할 때는 args 지시자 안에 일반적이 모듈과 같이 명명된 인수 정의 가능

command 모듈 사용 주의점

raw - 파이썬을 거치지 않는 명령을 저레벨로 실행

앤서블 모듈은 파이썬을 거쳐서 실행되지만, raw 모듈을 사용하면 파이썬이 설치되지 않은 환경에서도 SSH를 통해 명령어를 직접 실행 가능

- name: ~~~~
  gather_facts: false
  hosts: all
  become: true
  tasks:
  	- name: ~~~~
  	  raw: yum -y install python-simplejson  

3. 앤서블 상세 기능

3.1 인벤토리

3.1.1 정적 인벤토리 파일 작성

[app]
app1 ansible_host=some.app.host
app2 ansible_host=another.app.host

[db]
db1 ansible_host=db.1.host
db2 ansible_host=db.2.host

그룹 변수 정의

[그룹이름:vars] 형식으로 그룹 변수 전용 섹션 사용

[app]
app1 ansible_host=some.app.host
app2 ansible_host=another.app.host

[db]
db1 ansible_host=db.1.host
db2 ansible_host=db.2.host

[app:vars]
admin_username=app_user
admin_uid=1001

[db:vars]
admin_username=db_user
admin_uid=1002

호스트를 여러 그룹에 할당

[app]
app1 ansible_host=some.app.host
app2 ansible_host=another.app.host

[db]
db1 ansible_host=db.1.host
db2 ansible_host=db.2.host

[koreaeast]
app1
db1

[koreawest]
app2
db2

3.1.2 인벤토리 변수를 YAML 파일에 정의

인벤토리 변수는 전용 YAML 파일에 정의 가능

변수를 정의하는 파일 이름의 규칙

인벤토리 변수 우선순위

3.1.3 플레이북에서 인벤토리 작업

add_host - 호스트 정보 추가

- name: 새로 작성된 app용 호스트 정보를 인벤토리에 추가
  add_host:
  	name: created-host
  	groups: created,app3
  	ansible_host: ""
  	ansible_port: 22

add_host로 등록된 호스트 정보를 사용할 수 있는 것은 호스트를 추가한 이후의 플레이부터 가능.

group by - 등록된 호스트를 새로 그룹화

해당 모듈을 사용하면 setup 모듈이 자동으로 OS 정보 변수를 확인하고, 그것을 기준으로 OS별로 호스트 그룹화 가능

- name: OS 별로 그룹화
  hosts: all
  tasks:
  	- name: ~~
  	  group_by:
  	  	key: ""
  	  	
- name: 레드햇 계열 업데이트용 플레이
  hosts: Red Hat
  ...
  
- name: 데비안 계열 업데이트용 플레이
  hosts: Debian
  ...

2. 변수

2-1. 변수 정의 방법

앤서블을 실행할 때 변수를 정의하는 옵션

–extra-vars(-e) 를 사용하면 띄어쓰기로 구별한 key=value 형식으로 변수 전달 가능

ansible-playbook -i hosts -e ‘nginx_version=1.10.2 nginx_user=nginx’ site.yml

플레이북에서 변수 정의

---
- name: 포트 번호를 사용하는 플레이
  hosts: all
  vars:
  	nginx_http_port:80
  	mysql_port: 3306
vars_files:
	- some_vars.yml
	- another_vars.yml

2-2. 변수 우선순위