쉘 스크립트를 통해 인프라를 관리한다면, 코드의 재사용성을 위해 스크립트 작성시 한가지 리소스에 많은 조건문을 생각하여 구현해야 합니다.
멱등성
: 여러번의 스크립트 실행에도 동일한 결과를 만들기 위해서입니다.
if [ 조건 1 ]; then
동작 1
fi
if [ 조건 2 ]; then
동작 2
fi
else
동작 3
fi
...
형상관리 도구를 사용하여 이러한 복잡한 작업을 단순화하여 인프라를 보다 안전하게 관리 할 수 있습니다.
Ansible은 하나의 워크스페이스에서 여러 서버를 효과적으로 관리할 수 있도록 도와주는 형상 관리 도구입니다.
다음과 같은 특징을 지니고 있습니다.
대상 서버 호스트를 관리하는 파일입니다.
일반적으로 ini 또는 yaml 파일의 형식을 이용해서 작성합니다.
mail.example.com
[webservers]
foo.example.com
bar.example.com
[dbservers]
one.example.com
two.example.com
three.example.com
cli를 이용하여 앤서블을 동작시킬때 사용합니다. 코드를 재사용하기 힘드며, 거의 반복하지 않는 작업에 적합합니다.
$ ansible [pattern] -m [module] -a "[module options]"
각 작업에 정의된 작업을 수행하기 위해 Ansible이 각 관리 노드(필요한 경우)에 복사하고 실행하는 코드 또는 바이너리 입니다. 다양한 모듈이 존재하므로 필요한 모듈을 적시에 잘 찾아서 사용하는것이 중요합니다.
Ansible-playbook은 반복가능하고 재사용 가능하며 간단한 구성 관리 및 다중 배포 시스템을 제공합니다.
yaml 파일로 작성하며 각각의 플레이는 하나의 작업 단위를 나타냅니다.
플레이북은 기본적으로 위에서부터 아래로 순서대로 실행됩니다. 개별 플레이 내에서도 작업이 절차적으로 실행됩니다.
---
- name: Update web servers
hosts: webservers
remote_user: root
tasks:
- name: Ensure apache is at the latest version
ansible.builtin.yum:
name: httpd
state: latest
- name: Write the apache config file
ansible.builtin.template:
src: /srv/httpd.j2
dest: /etc/httpd.conf
- name: Update db servers
hosts: databases
remote_user: root
tasks:
- name: Ensure postgresql is at the latest version
ansible.builtin.yum:
name: postgresql
state: latest
- name: Ensure that postgresql is started
ansible.builtin.service:
name: postgresql
state: started
이벤트 기반으로 동작하는 작업입니다. 예를들어 Nginx 또는 Apache2 설정이 변경되었을때, 이를 감지하여 트리거를 발동하여 재시작할 수 있도록 도와줍니다.
유의할점
핸들러는 나열된 순서가 아니라 Section에 정의된 순서에 따라 실행됩니다.
동일한 핸들러에 여러 notify가 실행될 경우 태스크 수에 상관없이 한번만 동작합니다.
tasks:
- name: Template configuration file
ansible.builtin.template:
src: template.j2
dest: /etc/foo.conf
notify:
- Restart apache
- Restart memcached
handlers:
- name: Restart memcached
ansible.builtin.service:
name: memcached
state: restarted
- name: Restart apache
ansible.builtin.service:
name: apache
state: restarted
앤서블은 Python을 기반으로 동작하기 때문에 Python 키워드 또는 Playbook에 명시된 키워드는 변수로 사용할 수 없습니다.
변수 이름은 밑줄을 이용하여 시작할 수 있습니다.
숫자는 변수로 가능하지만 변수의 제일 첫 문자를 숫자로 시작할 수 없습니다.
아래는 Ansible 에서 제시하는 유효한 변수의 이름과 잘못된 변수의 이름의 예 입니다.
Valid variable names | Not valid |
---|---|
foo | *foo, Python keywords such as async and lambda |
foo_env | playbook keywords such as environment |
foo_port | foo-port, foo port, foo.port |
foo5, _foo | 5foo, 12 |