티스토리 뷰


1. Vagrant 구성

Ansible을 이해하기 위해서는 실제 LAB을 통해서 체험하는 것이 가장 좋다. 여러 환경에서 테스트할 수 있겠지만 간편하게 테스트 할 수 있는 방법이 Vagrant기반에서 경험해 보는 것을 추천한다.
Vagrant 구성과 개요에 대해서는 블로그에서 다룬 적이 있으므로 상세한 내용을 생략한다.


아래는 CentOS 7기반의 4개의 VM을 구성하기 위한 Vagrant file의 Ruby 구성 내용이다.

Vagrant.configure("2") do |config|


    # All servers will run cent 7
    config.vm.box = "centos/7"
    config.vm.box_check_update = true


    # Create the cent1 Server
    config.vm.define "cent1" do |cent1|
        cent1.vm.hostname = "cent1"
        cent1.vm.network "private_network", ip: "192.168.2.11"
        cent1.vm.provider "virtualbox" do |v|
            v.name = "cent1"
            v.memory = 512
            v.cpus = 1
            v.linked_clone = true
            v.gui = false
        end


        cent1.vm.provision "shell", inline: <<-SHELL
          sudo yum -y update
          sudo yum -y install net-tools
        SHELL
    end


    # Create the cent2 Server
    config.vm.define "cent2" do |cent2|
        cent2.vm.hostname = "cent2"
        cent2.vm.network "private_network", ip: "192.168.2.12"
        cent2.vm.provider "virtualbox" do |v|
            v.name = "cent2"
            v.memory = 512
            v.cpus = 1
            v.linked_clone = true
            v.gui = false
        end


[all:vars]


        cent2.vm.provision "shell", inline: <<-SHELL
          sudo yum -y update
[cent]
          sudo yum -y install net-tools
        SHELL
    end


    # Create the cent3 Server
    config.vm.define "cent3" do |cent3|
        cent3.vm.hostname = "cent3"
        cent3.vm.network "private_network", ip: "192.168.2.13"
        cent3.vm.provider "virtualbox" do |v|
            v.name = "cent3"
            v.memory = 512
            v.cpus = 1
            v.linked_clone = true
            v.gui = false
        end


        cent3.vm.provision "shell", inline: <<-SHELL
          sudo yum -y update
          sudo yum -y install net-tools
        SHELL
    end


    # Create the cent4 Server
    config.vm.define "cent4" do |cent4|
        cent4.vm.hostname = "cent4"
        cent4.vm.network "private_network", ip: "192.168.2.14"
        cent4.vm.provider "virtualbox" do |v|
            v.name = "cent4"
            v.memory = 512
            v.cpus = 1
            v.linked_clone = true
            v.gui = false
        end


        cent4.vm.provision "shell", inline: <<-SHELL
          sudo yum -y update
          sudo yum -y install net-tools
        SHELL
    end


end

Vagrant file이 생성되어 있는 현재 디렉토리에서 CentOS7 을 생성한다.

vagrant up
Bringing machine 'cent1' up with 'virtualbox' provider...
Bringing machine 'cent2' up with 'virtualbox' provider...
Bringing machine 'cent3' up with 'virtualbox' provider...
Bringing machine 'cent4' up with 'virtualbox' provider…
중략..

#CentOS 7 기반의 4개의 VM을 생성한다.

cent7 $ vagrant ssh cent1

# 생성된 각 호스트로 ssh 기반으로 접속한다.


Vagrant와 연동된 Virtual Box에서 보면 , 4개의 CentOS7 이미지가 정상적으로 구동 중인 것을 확인할 수 있다.



2. CentOS7 환경에서 Ansible 구성하기.

Step1. Ansible Master 환경 구성

[vagrant@cent1 ~]$ sudo -s yum -y install ansible

# centos에 ansible을 설치

[vagrant@cent1 ~]$ ansible --version
ansible 2.7.10
  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, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

#ansible Master Server에 정상적으로 ansible이 설치가 되었는지 확인

대상 장비에 Agent를 설치하지 않기 때문에, 데이터센터 또는 IT인프라 담당자들이 상대적으로 거부감이 덜하게 되고, SSH기반으로 대부분 동작하기 때문에 기술적 접근성도 용이하다. 이러한 특징 때문에 기존 IaC 도구들이 주로 한정된 서버 영역에서 국한적으로 제공되었던 반면에, Ansible은 매우 폭넓은 영역에서 사용되는 중요한 계기가 되었다.

Step2. Ansible Master에 Host File 등록 하기

Ansible host 파일 구성의 편의성을 도모하기 위해서 Ansible Master의 Host file에 Ansible Target Host 서버들을 등록한다.

[vagrant@cent1 ~]$ sudo cat /etc/hosts
127.0.0.1    cent1    cent1
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.2.11 cent1
192.168.2.12 cent2
192.168.2.13 cent3
192.168.2.14 cent4
# ansible target host 서버네임 선언.

Step2. Ansible Master/Target Host 에 SSH 환경 설정

Ansible 기반의 자동화 구성시 사용되는 SSH 통신을 위해서 Master Server에서 Key를 생성한다. (Option)

[vagrant@cent1 ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/vagrant/.ssh/id_rsa.
Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:bnoY3+gXAlpPzeklLe4hPYrcyg/itvSO+mXqd3NCYPM vagrant@cent1
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|         o o     |
|      * . * o    |
|     + BS+ +     |
|    . ..E B      |
|    o.+BoB +     |
|   o.O=+X =      |
|  .=B+**o=       |
+----[SHA256]——+

# SSH key 생성

SSH 설정이 되어 있지 않은 경우 설치하고, 적절한 권한 설정을 해 준다.

[vagrant@cent1 ~]$ sudo -s yum install openssh-server openssh-clients openssh-askpass
[vagrant@cent1 ~]$ chmod 700 ~/.ssh
[vagrant@cent1 ~]$ chmod 600 ~/.ssh/id_rsa
[vagrant@cent1 ~]$ chmod 600 ~/.ssh/authorized_keys
[vagrant@cent1 ~]$ sudo systemctl restart sshd

# SSH 패키지 설치와 권한 설정

SSH password 인증 설정을 변경한다.

[vagrant@cent1 ~]$ sudo sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config

Ansible Target Host에도 SSH 환경 설정을 적용해 준다.

[vagrant@cent1 ~]$ sudo -s yum -y install openssh-server openssh-clients openssh-askpass
[vagrant@cent1 ~]$ chmod 700 ~/.ssh
[vagrant@cent1 ~]$ chmod 600 ~/.ssh/authorized_keys
[vagrant@cent1 ~]$ sudo sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
[vagrant@cent1 ~]$ sudo systemctl restart sshd

# SSH 패키지 설치와 권한 설정

Ansible Master Server에서 정상적으로 Target Host에 접속되는 지 확인한다.

[vagrant@cent1 ~]$ ssh vagrant@cent2
vagrant@cent2's password:
There was 1 failed login attempt since the last successful login.
Last login: Tue May  7 16:43:29 2019 from 10.0.2.2
[vagrant@cent2 ~]$

# Ansible Master에서 Ansible Target Host로 SSH 접속확인.

SSH Key 인증을 통해 접속되는지 추가적으로 설정한다. (Option)

[vagrant@cent1 ~]$ ssh-copy-id -i ./.ssh/id_rsa.pub vagrant@cent2
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "./.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
vagrant@cent2's password:

Number of key(s) added: 1


Now try logging into the machine, with:   "ssh 'vagrant@cent2'"
and check to make sure that only the key(s) you wanted were added.

# Ansible Master Server에서 관리대상 Target host에 SSH public Key값을 전송한다.

[vagrant@cent1 ~]$ ssh vagrant@cent2
Last failed login: Tue May  7 17:07:03 UTC 2019 from 192.168.2.11 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Tue May  7 17:01:01 2019 from 192.168.2.11
[vagrant@cent2 ~]$

# Ansible Target Host에 password 인증이외에 SSH key인증이 정상적으로 이뤄지는 지 확인한다.




3. Inventory 구성

Ansible에서는 Master/Controller가 제어하게 되는 Target Host들에 대해서 그룹핑을 정의할 수 있고, 해당 호스트에 대해서 제어 할 때 환경변수등을 정의 할 수 있다.
그 가운데 Inventory는 Target Host들에 대한 정의를 선언하는 것으로 ini 파일 또는 yaml 파일등으로 기록할 수 있다.
특별하게 선언하지 않게 되면, Ansible이 기본 설치되는 환경의  hosts파일에 정의된다. (/etc/ansible/hosts)

CentOS
[vagrant@cent1 ~]$ more /etc/ansible/hosts
[cent]
cent2
cent3
cent4



4.Ansible Ad hoc 

Ansible Controller가 모두 구성되고, Target Host와 연동이 준비가 되면 실제 동작을 확인할 수 있는 좋은 방법이 Ad hoc 모드로 시험하는 것이다.
Ad hoc 모드는 사전적의미 그대로 하나의 결과 실행 또는 정보를 조회하기 위한 방법으로 사용되는 모드이다.
Ad hoc 모드를 일정의 시나리오를 가지고 구성하는 것이 Playbook이라고 이해하면 쉽다.
Ad hoc모드만 사용하더라도 시스템 관리자 입장에서는 여러대의 Target Host들에 배치 작업이나, 결과 조회들을 손쉽게 할 수 있기 때문에 유용하게 사용할 수 있다.

몇가지 간단한 Ansible 실행을 Ad hoc모드를 통해 확인해 본다.
먼저 설치 후에 Target Host들이 정상적으로 연결되었는지 ICMP 프로토콜을 통해 확인을 한다.
이때 Option -m은 ansible module을 의미하는 것으로, python으로 사전에 정의된 수많은 모듈들을 호출해서, inventory에 등록된 서버들에게 실행하는 방식이다.
Option -I 를 통해 inventory위치를 직접 지정하거나, 특정 호스트를 Target으로 할 수도 있고, 만약 선언하지 않으면 자동으로 /etc/ansible/hosts 에 등록된 모든 inventory에 실행한다.

[vagrant@cent1 ~]$ ansible cent -m ping

cent4 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
cent2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
cent3 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

# CentOS1에서 실행한 결과 Target 3대의 모든 서버들이 응답하는 것을 확인 할 수 있다.

[vagrant@cent1 ~]$ ansible cent -m setup | less >> centsvr_gather
[vagrant@cent1 ~]$ more centsvr_gather

cent4 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.2.14",
            "10.0.2.15"
        ],
        "ansible_all_ipv6_addresses": [
            "fe80::a00:27ff:fe7c:3f26",
            "fe80::5054:ff:fe26:1060"
        ],
        "ansible_apparmor": {
            "status": "disabled"
        },
        "ansible_architecture": "x86_64",
        "ansible_bios_date": "12/01/2006",
        "ansible_bios_version": "VirtualBox",
        "ansible_cmdline": {
            "BOOT_IMAGE": "/boot/vmlinuz-3.10.0-957.10.1.el7.x86_64",
            "LANG": "en_US.UTF-8",
            "biosdevname": "0",
            "console": "ttyS0,115200n8",
            "crashkernel": "auto",
            "elevator": "noop",
            "net.ifnames": "0",
            "no_timer_check": true,
            "ro": true,
            "root": "UUID=f52f361a-da1a-4ea0-8c7f-ca2706e86b46"
        },
이하 생략

[vagrant@cent1 ~]$ ansible cent -m setup -a "filter=ansible_default_ipv4*"
cent3 | SUCCESS => {
    "ansible_facts": {
        "ansible_default_ipv4": {
            "address": "10.0.2.15",
            "alias": "eth0",
            "broadcast": "10.0.2.255",
            "gateway": "10.0.2.2",
            "interface": "eth0",
            "macaddress": "52:54:00:26:10:60",
            "mtu": 1500,
            "netmask": "255.255.255.0",
            "network": "10.0.2.0",
            "type": "ether"
        }
    },
    "changed": false
}
cent2 | SUCCESS => {
    "ansible_facts": {
        "ansible_default_ipv4": {
            "address": "10.0.2.15",
            "alias": "eth0",
            "broadcast": "10.0.2.255",
            "gateway": "10.0.2.2",
            "interface": "eth0",
            "macaddress": "52:54:00:26:10:60",
            "mtu": 1500,
            "netmask": "255.255.255.0",
            "network": "10.0.2.0",
            "type": "ether"
        }
    },
    "changed": false
}
cent4 | SUCCESS => {
    "ansible_facts": {
        "ansible_default_ipv4": {
            "address": "10.0.2.15",
            "alias": "eth0",
            "broadcast": "10.0.2.255",
            "gateway": "10.0.2.2",
            "interface": "eth0",
            "macaddress": "52:54:00:26:10:60",
            "mtu": 1500,
            "netmask": "255.255.255.0",
            "network": "10.0.2.0",
            "type": "ether"
        }
    },
    "changed": false
}

#모듈 setup을 활용해서 운영체제의 다양한 정보를 Gathering 할수 있다.
#위에서의 예제는 해당 정보들을 특정 파일에 export를 시키도록 하는 예제이다.


Ad hoc 모드를 잘 사용하더라도 매우 유용하게 사용할 수 있는 배치 Job이나 조회들을 실행 할 수 있다.
빈번하게 사용하거나 유용하다고 판단되는 ad hoc들을 아래 소개한다.

Adansible Ad hoc 명령 타입 소개
Adansible <hosts> [-m <module_name>] -a <"arguments"> -u <username> [—become]

# —m 모듈
# -a Argumens
# -i inventory 파일
# --become 필요에 따라 권한 상승이 필요하다. sudo와 같은 권한이 필요한 경우 정의한다.

시스템 상태 일괄체크 예제
[vagrant@cent1 ~]$ ansible cent -a "uptime"
[vagrant@cent1 ~]$ ansible cent -m ping
[vagrant@cent1 ~]$ ansible cent -m shell -a "df -h /dev/sda1" --become
[vagrant@cent1 ~]$ ansible cent -m shell -a "free -m" --become
[vagrant@cent1 ~]$ ansible cent -m shell -a "cat /proc/meminfo|head -2"
[vagrant@cent1 ~]$ ansible cent -m shell -a "mpstat -P ALL" --become
[vagrant@cent1 ~]$ ansible cent -m shell -a "netstat -plntu" --become
[vagrant@cent1 ~]$ ansible cent -m shell -a “uptime" --become


패키지 설치 및 관리 예제
[vagrant@cent1 ~]$ ansible cent -m shell -a "yum list installed python"
[vagrant@cent1 ~]$ansible cent -m yum -a "name=sysstat state=present” --become
[vagrant@cent1 ~]$ansible cent -m yum -a "name=nmap state=present" --become
[vagrant@cent1 ~]$ansible cent -m yum -a "name=sysstat state=absent” --become
[vagrant@cent1 ~]$ansible cent -m yum -a "name=nmap state=absent” —become
[vagrant@cent1 ~]$ansible cent -m yum -a 'name=* state=latest' --become

데몬의 시작,정지,재구동 예제
[vagrant@cent1 ~]$ ansible cent -m service -a "name=vsftpd state=started enabled=yes” --become
[vagrant@cent1 ~]$ ansible cent -m service -a "name=vsftpd state=stopped" --become
[vagrant@cent1 ~]$ ansible cent -m service -a "name=vsftpd state=restarted" --become

파일 관리 예제
[vagrant@cent1 ~]$ ansible cent -m file -a "path=/home/vagrant/testfile.txt state=touch mode=755"
[vagrant@cent1 ~]$ ansible cent -m copy -a "src=/etc/hosts dest=/tmp/hosts”


계정 관리 예제
[vagrant@cent1 ~]$ ansible cent -m shell -a "cat /etc/passwd|grep -i vagrant” --become
[vagrant@cent1 ~]$ ansible cent -m group -a "name=usergroup state=present” --become
[vagrant@cent1 ~]$ ansible cent -m file -a "path=/home/vagrant/test state=directory mode=755"
[vagrant@cent1 ~]$ ansible cent -m user -a "name=user01 group=usergroup createhome=yes”


시스템 정보 확인
[vagrant@cent1 ~]$ansible cent -m setup | less >> centsvr_gather
[vagrant@cent1 ~]$ansible cent -m setup -a "filter=ansible_default_ipv4*”




'DevOps_Programming > Ansible' 카테고리의 다른 글

Cisco NXOS Ansible 활용 - 유용한 Adhoc 명령  (0) 2019.06.15
Ansible 구조의 이해  (0) 2019.06.14
Ansible 기본 개념 및 설치  (5) 2019.05.07
공지사항