becool

20210726 (월) ansible 설치 본문

ansible

20210726 (월) ansible 설치

gusalstm 2021. 7. 26. 16:50
반응형

IaC (Infrastructure as Code)

 코드형 인프라스트럭쳐

 인프라 관리시 시스템이 읽을 수 있는 코드의 형태로 관리 YAML

 정의된 하나의 인프라 설정파일로 여러번 재사용이 가능하다 : 여러 호스트에 일괄 적용 가능

 AWS cloud formation, 하시코프 terraform 등을 활용하여 가상머신의 인스턴스 생성작업까지 가능

 

IaC 장점

 비용 절감

 빠른 속도

 높은 안정성 (휴먼 에러의 감소)

 + ansible : 멱등성 - 여러번 적용해도 결과는 같음. (idempotence) 

 인프라를 코드화 함으로써 전체 인프라에 대한 이해 및 버전관리가 쉬워짐

 재사용성

 

IaC 도구 구분

 

1) 구성 관리 (Configuration Management)

 - Ansible, Chef, Puppet, SaltStack 등

2) 배포 (Provisioning)

 - AWS Cloudformation, Openstack Heat, Terraform 등

3)  가변 인프라 / 불편 인프라

4)  절차적 언어 : 원하는 최종 상태에 도달하기 위해서 코드가 단계별로 정의, 실행 되는 언어 (Ansible, Chef)

    선언적 언어 : 원하는 최종 형태만 정의하면 구성에 필요한 세부 절차는 알아서 실행되는 언어

            (AWS Cloudformation, Pupet, SaltStack, Terraform 등)

5) 마스터 및 에이전트 유무 (agent, agentless)

    마스터 : 인프라의 정보, 구성관리 및 배포를 위한 정보를 가진 서버

    에이전트 : 서버로부터 명령을 전달받아 수행하기 위한 프로그램

    에이전트가 실행된 상태여야하므로, 리소스를 차지하고, 호스트에 일정부분 부하가 발생

    - 마스터가 적용된 도구 : Chef, Pupet, SaltStack (없이 구성가능함)

    - 에이전트가 적용된 도구 : Chef, Pepet, SaltStack

 

Ansible (agentless)  애플리케이션 및IT 인프라 관리를 자동화 할 수 있는 IaC 도구
 host구성
 프로그램 언어에 익숙하지 않은 사용자도 충분히 사용할 수 있음
 소규모 부터 엔터프라이즈 급 까지 다양한 환경에서 사용이 가능함
 별도의 에이전트 없이 호스트들을 관리함. (open ssh)
제어 노드 (Control Node)  Ansible로 관리노드 (Managed node) 를 관리하기 위한 호스트
 Ansible이 설치되며 ansible 명령을 통해 각 관리노드를 관리
 Linuxm Windows 등의 운영체제가 설치된 호스트를 관리할 수 있음 (단, 제어노드는 반드시 Linux 호스트여야함)
관리 노드 (Managed Node)  Ansible 제어 노드에 의해 관리되는 호스트
 Linux, Windows 운영체제를 관리할 수 있음
 관리 노드(Managed node)에는 별도로 에이전트가 설치되지 않음
 Windows가 설치된 관리 노드는 WinRM 도구 설치필요 (Linux는 open ssh)
인벤토리 (Inventory)  관리노드(Managed node)의 목록이 담긴 파일
플러그인(Plugin)  Ansible의 핵심 기능을 확장하기 위한 프로그램
모듈 (Module)  Ansible을 실행하는 Python 코드 단위
 호스트에 패키지 설치/업데이트/제거
 시스템 명령어 실행, 파일 복사, 파일 내용 변경 등의 작업이 가능함
작업 (Task)  Ansible 의 실행단위
Ad-hoc 명령  Ansbile 명령을 이용하여 단일성 작업을 실행하는 명령
플레이(Play)  특정 관리 노드 (Managed node)를 대상으로한 순서가 있는 작업의 목록
플레이북(Playbook)  하나 이상의 플레이를 담고 있는 파일 (YAML) ( ansible-playbook 명령어로 실행 )

 

설치

 각 노드 키값이 같음 (vm 복사로 인하여) : SSH Host Key 갱신 필요 

 → rm /etc/ssh/ssh_host* 해서 관련 파일들을 지우고

    systemctl restart sshd 서비스 재시작하면 노드별로 고유의 관련 파일들이 생성 될 것.

 

인벤토리

그룹의 종류

 

Ansible 구성 파일 (ansible.cfg)

  구성 파일 우선 순위

    1) ANSIBLE_CONFIG 환경 변수로 지정한 경로

    2) (현재) 작업디렉터리에 있는 ansible.cfg

    3) ~/.ansible/ansible.cfg

    4) /etc/ansible/ansible.cfg

  섹션

    [defaults] : Ansible 실행에 필요한 기본 환경변수 정의

      inventory : inventory 경로 지정

      remote_user : Ansible로 Managed node 접속 시 사용할 사용자(사용자 권한 설정)

      ask_pass : SSH 접속 시 인증 방식을 패스워드기반(yes) / 키기반 인증 (no) 택1

    [privilege_escalation] : 권한 상승 (사용자 전환) 에 필요한 환경 변수 정의

      become : 권한 상승(사용자 전환) 여부 결정. true (상승) / false (상승사용하지 않음)

      become_method : 권한 상승 (사용자 전환) 방식 정의 (기본값 : sudo)

      become_user : 권한 상승 (사용자 전환)을 수행할 대상 사용자 (일반적으로 root)

      become_ask_pass : become pass설정 (권한상승 대상 패스워드 물어볼지 여부)

 

###설치 ###

yum install -y ansible (설치 안되면 epel-release 설치 후 재시도)

[root@ansible-server ~]# which ansible
/usr/bin/ansible

 

###인벤토리 확인 ###

[user@ansible-server work]$ ansible web -i inventory/hosts --list-hosts
  hosts (3):
    www1.example.com
    www2.example.com
    192.168.56.11
[user@ansible-server work]$ ansible db  -i inventory/hosts --list-hosts
  hosts (3):
    db1.example.com
    db2.example.com
    192.168.56.12

[user@ansible-server work]$ ansible all  -i inventory/hosts --list-hosts

[user@ansible-server work]$ ansible ungrouped  -i inventory/hosts --list-hosts

[west]
10.0.10.1
foo.example.com

[east]
20.0.10.1
one.example.com
two.example.com

[prod:children]
east

[test:children]
west
[user@ansible-server work]$ ansible prod -i inventory/hosts3 --list
  hosts (3):
    20.0.10.1
    one.example.com
    two.example.com
[user@ansible-server work]$ ansible test -i inventory/hosts3 --list
  hosts (2):
    10.0.10.1
    foo.example.com

[user@ansible-server work]$ cat inventory/host4
192.168.10.11
192.168.10.3
foo.example.com
bar.example.com

[webservers]
web0[1:4].example.com
[user@ansible-server work]$ ansible webservers -i inventory/host4 --list-hosts
  hosts (5):
    web01.example.com → 대괄호 영역이 자동으로 대응됨
    web02.example.com
    web03.example.com
    web04.example.com
[user@ansible-server work]$ ansible web:\&east -i inventory/hosts3 --list-hosts
  hosts (1):
    bar.example.com → [web]과 [east]에 공통(&)으로 속해있는 호스트 검색

[user@ansible-server work]$ ansible db:\!west -i inventory/hosts3 --list-hosts
  hosts (4):
    192.168.56.12  → [db]중에 [west]와 중복(!)되지 않는 호스트만 검색 : not west
    db01.example.com
    db02.example.com
    172.16.55.17

 

###구성파일 ###

현재 작업디렉터리(pwd)에 따른 구성파일 적용의 차이 

[user@ansible-server .ansible]$ ansible --version
ansible 2.9.23
  config file = /etc/ansible/ansible.cfg → 적용중인 구성파일 
  configured module search path = [u'/home/user/.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, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
[user@ansible-server .ansible]$ cd -
/home/user/work
[user@ansible-server work]$ ansible --version
ansible 2.9.23
  config file = /home/user/work/ansible.cfg → 적용중인 구성파일 
  configured module search path = [u'/home/user/.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, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]

 

[defaults]
inventory = ./inventory2/hosts5
remote_user = user
ask_pass = no

 

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = true

 

[user@ansible-server work]$ ansible all -m shell -a "ls -l /etc/cron.d" --become-method sudo --become-user root --ask-become-pass
BECOME password:

 

#### /etc/sudoers 권한 추가

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
user    ALL=(ALL)       NOPASSWD:ALL
ansible_user ALL=(ALL)  NOPASSWD:ALL

[ansible_user@ansible-node01 ~]$ sudo -i → 정상적으로 패스워드 없이 sudo -i 가능

[root@ansible-node01 ~]# 

 

[user@ansible-server work]$ ansible all -m shell -a "whoami" → 설정파일 : become = true
192.168.56.11 | CHANGED | rc=0 >>
root
192.168.56.13 | CHANGED | rc=0 >>
root
192.168.56.12 | CHANGED | rc=0 >>
root
[user@ansible-server work]$ vim ansible.cfg
[user@ansible-server work]$ ansible all -m shell -a "whoami" → 설정파일 : become = false
192.168.56.13 | CHANGED | rc=0 >>
ansible_user
192.168.56.12 | CHANGED | rc=0 >>
ansible_user
192.168.56.11 | CHANGED | rc=0 >>
ansible_user

 

 

 

 

 

728x90
Comments