Ansible은 Python Module 및 SSH를 사용하여 원격 호스트에 명령을 수행할 수 있도록 해주는 CM(Configuration Management) 도구이다.
별도의 Agent를 설치하지 않아도 되며 단순히 SSH 접속이 가능하면 편리하게 사용할 수 있다.
(내부적으로 Python을 사용하게 되는데 대부분의 Linux에는 Python이 기본적으로 설치가 되어 있다.)
나는 Ansible을 사용하여 원격 Node에 명령어를 수행하기 전에 다음의 과정을 거친다.
1. ansible.cfg 파일 설정 및 확인
2. inventory 파일 생성 및 Group 변수, Host 변수 등 설정
3. ansible-inventory 명령어를 사용하여 정상적으로 호스트 및 그룹 등록이 완료되었는지 확인
4. ansible -m ping {{group or host}} 명령어로 Master 노드에서 원격 노드로 ping 모듈이 성공하는지 확인
5. Playbook 작성
6. Playbook 테스트
1) Syntax Check
2) --list-hosts, --list-tasks 확인
3) --check 옵션으로 Dry run 수행
...
등의 과정을 거치는 편이다.
Inventory 파일의 보안을 위해서 ansible-vault 명령어를 활용하여 Encrypted 할 수도 있다.
(ansible-playbook 등 명령어를 할 때 자동으로 vault password를 물어보게 하려면 ansible.cfg에서 설정값을 수정하면 된다.)
Inventory 파일
- 특정 변수를 Host, Groups 별로 설정이 가능
- inventory 파일에서 Host 변수 및 Group 변수를 설정할 수도 있지만 각 File 별로 찢어놓을 수도 있음
[web-servers]
host1 http_port=80 maxRequestPerChild=888
host2 http_port=443 maxRequestPerChild=400
[web-servers:vars]
ntp_server=centos7.org
proxy=bastion.com
...
변수 값들을 Inventory 파일에 넣지 않고 별도 파일에 저장하기
: 변수 파일의 형식은 YAML이다.
Host vars와 Group vars 모두 yml 포맷으로 생성하면 되며, 각각 host_vars 디렉터리, group_vars 디렉터리에 생성할 수 있다.
# Host vars
http_port: 80
maxRequestPerChild: 500
# Group vars
ntp_server: centos7.org
proxy: basation.com
Inventory Parameters
ansible_ssh_host: 접속할 SSH Host 명
ansible_ssh_user : SSH User name
ansible_ssh_pass : 패스워드로 접속할 때 사용
ansible_ssh_private_key_file : SSH Private key 파일
ansible_python_interpreter : Target host의 Python path
- 테스트용 Playbook
- setup (gather_facts)
- Test
- Display pwd output
- gather_facts의 default 값은 yes이기 때문에 Task는 총 3개가 돌 것이다.
❯ cat playbooks/test.yml
---
- name: Ansible Test
hosts: centos7_hosts
tasks:
- name: Test
shell: pwd
register: result
- name: Display pwd output
debug:
msg: "{{ result }}"
- Syntax 확인
❯ ansible-playbook --syntax-check playbooks/test.yml
playbook: playbooks/test.yml
- 실행될 Hosts 확인
❯ ansible-playbook --list-hosts playbooks/test.yml
playbook: playbooks/test.yml
play #1 (centos7_hosts): Ansible Test TAGS: []
pattern: ['centos7_hosts']
hosts (2):
centos7-01
centos7-02
- 실행될 Tasks 확인
❯ ansible-playbook --list-tasks playbooks/test.yml
playbook: playbooks/test.yml
play #1 (centos7_hosts): Ansible Test TAGS: []
tasks:
Test TAGS: []
Display pwd output TAGS: []
추가로 -v 옵션도 가능하니 Debug 할 경우 유용하게 사용될 수 있다.
- 모의로 실행해보기 (Dry run)Gather_facts 결과 (setup 모듈이며, gather_facts 또한 TASK에 속하게 됨)
- TEST란 Task가 수행되고 Display pwd output이란 Task가 수행된 것을 확인할 수 있다.
- 맨 처음에 지정해놓은 Playbook 이름,
❯ ansible-playbook playbooks/test.yml --check
PLAY [Ansible Test] **********************************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************************************
ok: [centos7-02]
ok: [centos7-01]
TASK [Test] ******************************************************************************************************************************************************
skipping: [centos7-01]
skipping: [centos7-02]
TASK [Display pwd output] ****************************************************************************************************************************************
ok: [centos7-01] => {
"msg": {
"changed": false,
"failed": false,
"msg": "skipped, running in check mode",
"skipped": true
}
}
ok: [centos7-02] => {
"msg": {
"changed": false,
"failed": false,
"msg": "skipped, running in check mode",
"skipped": true
}
}
PLAY RECAP *******************************************************************************************************************************************************
centos7-01 : ok=2 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
centos7-02 : ok=2 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
주요 Module들
copy 모듈
ansible web-servers -m copy -a "src=/etc/hosts dest=/tmp/hosts"
file 모듈
ansible web-servers -m file -a "dest=/path/to/c mode=755 owner=ec2-user group=admin state=directory"
yum, apt 모듈
ansible web-servers -m yum -a "name=httpd state=present"
user 모듈
ansible all -m user -a "name=foo password=<crypted password here>"
ansible all -m user -a "name=foo state=absent"
Ansible에서 변수를 사용할 때 우선순위가 있다. 우선 순위 중 하나가 걸리면 그 후순위는 무시하게 된다.
변수 종류
- 환경 변수 ( -e )
- 플레이북 변수 ( var_files, vars )
- 인벤터리 변수
- 호스트 변수, 그룹 변수
- Facts
우선 순위
- Extra vars
- Task vars
- Block vars
- Role and Include vars
- set_facts
- registered vars
- playbook var_files
- playbook vars_prompt
- playbook vars
- host facts
- playbook host_vars
- playbook group_vars
- inventory host_vars
- inventory group_vars
- inventory vars
- role defaults
변수 종류와 Overriding
Group / Host variables
- 모든 Group에 해당하는 변수는 group_vars/all 에 저장하면 된다.
- 특정 그룹에 해당하는 변수는 group_vars/a_group 등과 같이 저장이 가능하다.
변수 사용하기
변수는 inventory에 저장할 수도 있고 group_vars 혹은 host_vars, var_files 등을 통해 가져올 수도 있다.
../vars/users.yml
외부 파일에 생성할 유저와 패스워드, Group 명을 지정하였다.
❯ cat vars/users.yml
users:
- name: james
password: dkagh1.
group: wheel
- name: gildong
password: passw0rd1!
group: wheel
- name: hodong
password: hodong1!
group: wheel
Playbook
vars_files로 변수 파일의 위치를 지정해주고
with_items로 users란 리스트 변수를 반복문으로 접근하도록 하였다.
---
- name: Create multiple users with wheel group
hosts: centos7_hosts
gather_facts: no
vars_files:
- ../vars/users.yml
tasks:
# name, password, group
- name: Create user {{ item.name }}
user:
name: "{{ item.name }}"
create_home: yes
password: "{{ 'item.password' | password_hash('sha512') }}"
update_password: on_create
groups: "{{ item.group }}"
with_items: "{{ users }}"
- name: Get wheel group`s users
shell: cat /etc/group | grep wheel
register: result
- name: Cat above task result
debug:
var=result
Test
syntax 검사와 실행될 hosts들이 무엇인지, 어떤 Tasks들이 수행될지, Dry run까지 테스트
❯ ansible-playbook --syntax-check playbooks/create_user.yml
playbook: playbooks/create_user.yml
❯ ansible-playbook --list-hosts playbooks/create_user.yml
playbook: playbooks/create_user.yml
play #1 (centos7_hosts): Create multiple users with wheel group TAGS: []
pattern: ['centos7_hosts']
hosts (2):
centos7-01
centos7-02
❯ ansible-playbook --list-tasks playbooks/create_user.yml
playbook: playbooks/create_user.yml
play #1 (centos7_hosts): Create multiple users with wheel group TAGS: []
tasks:
Create user {{ item.name }} TAGS: []
Cat wheel group users at /etc/group TAGS: []
❯ ansible-playbook --check playbooks/create_user.yml
PLAY [Create multiple users with wheel group] ****************************************************************************************************
TASK [Create user {{ item.name }}] ***************************************************************************************************************
changed: [centos7-01] => (item={'name': 'james', 'password': 'dkagh1.', 'group': 'wheel'})
changed: [centos7-01] => (item={'name': 'gildong', 'password': 'passw0rd1!', 'group': 'wheel'})
changed: [centos7-01] => (item={'name': 'hodong', 'password': 'hodong1!', 'group': 'wheel'})
changed: [centos7-02] => (item={'name': 'james', 'password': 'dkagh1.', 'group': 'wheel'})
changed: [centos7-02] => (item={'name': 'gildong', 'password': 'passw0rd1!', 'group': 'wheel'})
changed: [centos7-02] => (item={'name': 'hodong', 'password': 'hodong1!', 'group': 'wheel'})
TASK [Cat wheel group users at /etc/group] *******************************************************************************************************
skipping: [centos7-01]
skipping: [centos7-02]
PLAY RECAP ***************************************************************************************************************************************
centos7-01 : ok=1 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
centos7-02 : ok=1 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
만약 hodong 유저에는 어떠한 Group도 지정하고 싶지 않을 경우에는 어떻게 할까?
공백으로 만들어놓기
❯ cat vars/users.yml
users:
- name: james
password: dkagh1.
group: wheel
- name: gildong
password: passw0rd1!
group: wheel
- name: hodong
password: hodong1!
group:
hodong 유저는 wheel 그룹에 할당되지 않은 것으로 확인할 수 있다.
'DevOps' 카테고리의 다른 글
[Github Action] Self hosted runner에서 Gradle, Docker image cache #1 - EBS, PVC로 캐시하기 (2) | 2022.12.17 |
---|---|
[Istio] EKS에서 Okta와 AWS ALB, Istio를 활용하여 인증, 인가 처리하기 (0) | 2022.11.06 |
[Envoy] Envoy Proxy Architecture (0) | 2022.06.25 |
[Terraform] Atlantis를 통한 Git 협업 #1 - Demo (0) | 2022.05.14 |
[Terraform] terraform state mv 명령어 알아보기 및 활용법 (0) | 2021.12.18 |