Ansible 개요
Ansible
- 작동방식 2가지
- Ad-hoc
- Playbook : YAML 포맷 사용
- Ansible 아키텍쳐
- 설정
- 모듈
- 인벤토리
- Vault : 암호화
- AWX : 웹 인터페이스 즉, Ansible 조작을 웹에서 할 수 있다. 보통은 모니터링을 위해 사용한다.
IaC
Infrastructure as Code : 코드형 인프라, 인프라를 코드로 관리하고 구성하고 배포한다. 인프라 뿐만 아니라 플랫폼이나 소프트웨어도 다룬다. 비교적 최근에 나온 기술이다.
IaC 에서 제일 중요한 것은 멱등성을 가져야 한다는 점이다.
장점
- 비용 절감
- 빠른 속도
- 안정성(사람이 하는 일은 결국 실수를 하기 때문)
- 코드의 재사용성, 버전 관리
구성 관리 / 배포
구성 관리 : Configuration Management
사용자 생성, 파일 시스템 마운트, 패키지 설치, 설정 파일, 파일 복사....
배포 : Provisioning
리소스를 새로 생성, 변경, 삭제를 통틀어서 프로비저닝이라고 한다.
구성 관리 도구 : Ansible , Chef, Puppet, SaltStack
배포 도구 : Teraform, Vagrant, AWS CloudFormation
가변 인프라 / 불변 인프라
가변 인프라 : Mutable, 하나의 리소스를 만든 후 주기적으로 관리해준다.
Ansible
불변 인프라 : Immutable, 이미지를 사용하는 형태로 그 이미지가 리소스가 되고 실행되고 종료될 때 가지 변경되는 것이 없으면 불변 인프라가 된다.
Teraform
워드 프레스 서버를 만들 때 NFS 를 사용하여 배포하는 방식과 워드 프레스가 설치된 인스턴스를 이미지화 해서 배포하는 방식의 차이다.
NFS 를 사용하면 가변 인프라고 이미지를 말았으면 불변 인프라라고 볼 수 있다.
애완동물==가변 vs 소 때(가축)==불변
절차적 / 선언적
절차적 : 순서 O, 반드시 순서를 지켜서 작성을 해야 한다. 프로그램이 실행되면 위에서 아래로 흘러서 실행하기 때문
Ansible
선언적 : 순서 X
Teraform, Kubernetes
마스터 및 에이전트 유무
마스터는 보통 전체 시스템을 통제할 수 있는 서버를 뜻하고 에이전트는 마스터에 의해 제어될 수 있는 서버를 뜻한다.
마스터와 에이전트를 위한 프로그램이 서버에 설치되어야 한다.
둘 다 관리를 위한 프로그램인데 이 관리 프로그램을 관리하는 프로그램이 필요로 하다.
마스터, 에이전트가 필요 : Chef, Puppet, SaltStack 즉, 마스터 서버, 에이전트 서버가 필요로 하고 이를 위한 프로그램이 필요로 하다.
마스터, 에이전트 불필요 : Ansible, Teraform
Ansible 아키텍쳐
구분선으로 그어진 왼쪽편이 컨트롤러 노드이고 오른쪽편(Hosts, Networking)이 관리 노드이다.
여기서는 vagrant 로 배포한 node1, 2 가 관리 노드에 속하고 controller 가 컨트롤러 노드에 속한다.
Ansible Automation Engine 의 모듈이 제일 핵심이다.
사용자가 Ansible 을 사용할 수 있는 방법은 두가지가 있다.
- 직접 다이렉트로 사용하는 방법 ad-hoc
- 사람이 플레이북을 만들어서 플레이북을 실행하는 방법
Ansible 설치
컨트롤러에서 ansible 을 설치한다. 설치 과정은 아래와 같고 sudo yum install centos-release-ansible-29 -y 은 ansible 설치할 레포 리스트를 가져오는 과정이다. 가장 최신 버전인 29를 다운로드 받을 것이다.
실제 설치는 sudo yum install ansible -y 를 통해 이뤄진다.
[vagrant@controller ~]$ sudo yum search ansible
Loaded plugins: fastestmirror
Determining fastest mirrors
* base: mirror.navercorp.com
* extras: mirror.navercorp.com
* updates: mirror.navercorp.com
base | 3.6 kB 00:00
extras | 2.9 kB 00:00
updates | 2.9 kB 00:00
(1/4): base/7/x86_64/group_gz | 153 kB 00:00
(2/4): extras/7/x86_64/primary_db | 246 kB 00:00
(3/4): base/7/x86_64/primary_db | 6.1 MB 00:01
(4/4): updates/7/x86_64/primary_db | 15 MB 00:11
=========================== N/S matched: ansible ===========================
ansible-collection-microsoft-sql.noarch : The Ansible collection for
: Microsoft SQL Server management
centos-release-ansible-27.noarch : Ansible 2.7 packages from the CentOS
: ConfigManagement SIG repository
centos-release-ansible-28.noarch : Ansible 2.8 packages from the CentOS
: ConfigManagement SIG repository
centos-release-ansible-29.noarch : Ansible 2.9 packages from the CentOS
: ConfigManagement SIG repository
centos-release-ansible26.noarch : Ansible 2.6 packages from the CentOS
: ConfigManagement SIG repository
scap-security-guide-rule-playbooks.noarch : Ansible playbooks per each rule.
Name and summary matches only, use "search all" for everything.
[vagrant@controller ~]$ sudo yum install centos-release-ansible-29 -y
[vagrant@controller ~]$ sudo yum install ansible -y
[vagrant@controller ~]$ ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/home/vagrant/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Apr 2 2020, 13:16:51) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
ansible 명령어
[vagrant@controller ~]$ ansible
ansible ansible-doc ansible-playbook-2
ansible-2 ansible-doc-2 ansible-playbook-2.7
ansible-2.7 ansible-doc-2.7 ansible-pull
ansible-config ansible-galaxy ansible-pull-2
ansible-connection ansible-galaxy-2 ansible-pull-2.7
ansible-console ansible-galaxy-2.7 ansible-vault
ansible-console-2 ansible-inventory ansible-vault-2
ansible-console-2.7 ansible-playbook ansible-vault-2.7
그냥 ansible 이 ad-hoc 방식이고, ansible-playbook 이 playbook 방식이다.
인벤토리
인벤토리에 관리 대상이 되는 노드들의 아이피 주소를 적는다.
[vagrant@controller ~]$ vi inventory.ini
[vagrant@controller ~]$ cat inventory.ini
192.168.100.11
192.168.100.12
해당 노드에 접속하기 위해서는 일단 ssh 기반의 키 인증이 되어 있어야 한다.
모듈
모듈 공식 문서 : https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html
앤서블의 핵심은 모듈이다. 모듈은 최소 실행 단위를 나타낸다.
거의 모든 모듈들이 전부 생성되어 있어서 직접 파이썬으로 모듈을 작성할 일은 거의 없다.
Ad-hoc 명령: yum 으로 httpd 패키지 설치
주로 사용하는 모듈들은 거의 정해져있고 yum 에 관련된 모듈들이 있다.
[vagrant@controller ~]$ ansible 192.168.100.11 -i inventory.ini -m yum
-a "name=httpd state=present" -b
- 192.168.100.11 : 관리 노드(인벤토리 파일에 정의 되어 있어야 한다.)
- -i inventory.ini : 인벤토리 이름
- -m yum : 모듈 이름
- -a "name=httpd state=present" : 모듈의 파라미터 지정
- state=present → 상태는 존재해야 한다, 없으면 다운로드 해야 한다.
- -b : become 으로 관리자 권한을 얻는다는 뜻
가변 인프라로 시스템에 패키지가 설치 됐기 때문에..
[vagrant@node1 ssh]$ yum list | grep httpd
httpd.x86_64 2.4.6-97.el7.centos.5 @updates
httpd-tools.x86_64 2.4.6-97.el7.centos.5 @updates
httpd-devel.x86_64 2.4.6-97.el7.centos.5 updates
httpd-manual.noarch 2.4.6-97.el7.centos.5 updates
keycloak-httpd-client-install.noarch 0.8-1.el7 base
libmicrohttpd.i686 0.9.33-2.el7 base
libmicrohttpd.x86_64 0.9.33-2.el7 base
libmicrohttpd-devel.i686 0.9.33-2.el7 base
libmicrohttpd-devel.x86_64 0.9.33-2.el7 base
libmicrohttpd-doc.noarch 0.9.33-2.el7 base
python2-keycloak-httpd-client-install.noarch
[vagrant@node1 ssh]$ systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled;
vendor preset: disabled)
Active: inactive (dead)
Docs: man:httpd(8)
man:apachectl(8)
[vagrant@node1 ssh]$
실제로 node1 에 httpd 패키지가 설치됐다. 물론 서비스를 실행시키지는 않았다.
Ad-hoc 명령: service 모듈로 httpd 서비스 시작
원격으로 서비스의 상태를 변경시킬 수 있는 service 모듈이 있다. (https://docs.ansible.com/ansible/2.9/modules/service_module.html#service-module)
[vagrant@controller ~]$ ansible 192.168.100.11 -i inventory.ini -m service
-a "name=httpd state=started enabled=yes" -b
Ad-hoc 명령으로 똑같은 명령을 내릴 경우
SUCCESS 라고 나온다. 멱등성 때문
[vagrant@controller ~]$ ansible 192.168.100.11 -i inventory.ini -m yum -a "name=httpd state=present" -b
192.168.100.11 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"msg": "",
"rc": 0,
"results": [
"httpd-2.4.6-97.el7.centos.5.x86_64 providing httpd is already installed"
]
}
[vagrant@controller ~]$ ansible 192.168.100.11 -i inventory.ini -m service -a "name=httpd state=started enabled=yes" -b
192.168.100.11 | SUCCESS =>
Playbook
YAML 형태로 파일을 작성한다.
[vagrant@controller ~]$ vi apache_install.yaml
[vagrant@controller ~]$ cat apache_install.yaml
- hosts: 192.168.100.11
tasks:
- yum:
name: httpd
state: present
- service:
name: httpd
enabled: yes
state: started
ansible-playbook 명령어를 사용해서 실행할 수 있다.
[vagrant@controller ~]$ ansible-playbook -i inventory.ini apache_install.yaml -b
PLAY [192.168.100.11] **********************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.100.11]
TASK [yum] *********************************************************************
ok: [192.168.100.11]
TASK [service] *****************************************************************
ok: [192.168.100.11]
PLAY RECAP *********************************************************************
192.168.100.11 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0