[Ansible] Ansible 개요 및 설치

728x90

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 을 사용할 수 있는 방법은 두가지가 있다.

  1. 직접 다이렉트로 사용하는 방법 ad-hoc
  2. 사람이 플레이북을 만들어서 플레이북을 실행하는 방법

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
728x90