728x90

vagrant란


베이그런트의 장점: 쉬운 프로비저닝

 - 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요 시 시스템을 즉시 사용할 수 있는 상태로 미리 준비함

 

베이그런트 기초 명령어

명령어 설명
vagrant init 프로비저닝을 해주는 예제 스크립트 생성
vagrant up Vagrantfile을 읽어 들여 프로비저닝 진행
vagrant halt 베이그런트에서 다루는 호스트들 종료
vagrant destroy 베이그런트의 호스트들 삭제
vagrant ssh 베이그런트의 호스트에 ssh로 접속
vagrant provision 베이그런트의 호스트의 설정 변경 적용

 

실습 개요


아키텍처

 

 

실습 과정

1. 노트패드 ++ 설치

2. 베이그런트 설치 및 초기화

3. 베이그런트 파일 수정 및 플러그인 설치

4. CentOS 이미지 설치

5. 베이그런트 ssh 접속 후 상태 확인

 


노트패드 ++ 설치


아래 링크로 접속하여 설치 파일 다운로드

https://notepad-plus-plus.org/downloads/

 

 

Downloads | Notepad++

 

notepad-plus-plus.org

 

다운로드한 파일을 실행하여 디폴트 값으로 설치 진행

 


 

베이그런트 설치 및 초기화


베이그런트 역시 마찬가지로 아래 링크로 접속하여 설치 파일을 다운로드하고 설치 진행

https://www.vagrantup.com/

 

Vagrant by HashiCorp

Vagrant enables users to create and configure lightweight, reproducible, and portable development environments.

www.vagrantup.com

 

 

cmd 창에서 vagrant를 입력해 베이그런트가 정상적으로 설치된 것을 확인함

 

 

 

vagrant init: 베이그런트 환경 설정 및 샘플 코드 생성

주의: vagrant 환경 설정 시 경로에 빈 공간이 있으면 정상적으로 실행되지 않으므로 경로 변경 필요

C:\Users\khj78>cd C:\HashiCorp

C:\HashiCorp>vagrant init
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

 


베이그런트 파일 수정 및 플러그인 설치


 

Vagrantfile을 notepadd++로 실행

 

 

 

아래 링크에서 이미지를 다운로드하므로 해당 링크로 접속하여 centos/7을 복사

https://app.vagrantup.com/boxes/search

 

 

옵션 값 변경

# base 를 centos/7으로 변경
config.vm.box = "centos/7"

# 윈도우와 CentOS 간의 공유 디렉토리를 설정하는 부분: 사용하지 않도록 설정
config.vm.synced_folder ".", "/vagrant", disabled: true

 

수정 사항 저장: ctrl + s

 

플러그인 설치

C:\HashiCorp>vagrant plugin install vagrant-vbguest
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Fetching micromachine-3.0.0.gem
Fetching vagrant-vbguest-0.30.0.gem
Installed the plugin 'vagrant-vbguest (0.30.0)'!

 


CentOS 이미지 설치


vagrant up

C:\HashiCorp>vagrant up

# 작업 진행 과정
# centos7 이미지를 다운로드하고 
# 버추얼 박스에 이미지를 삽입 후 설치를 진행함
# 확장 100을 설치함

 


베이그런트 ssh 접속 후 상태 확인


vagrant ssh

생성된 가상 머신에 접속

C:\HashiCorp>vagrant ssh
[vagrant@localhost ~]$

 

728x90
728x90

플레이북이란


- 사용자가 원하는 내용을 미리 정의해둔 것

- 작업 내용을 파일로 만들어 반복 실행하기

- 멱등성 성질을 가짐 (멱등성: 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질)

- YAML 언어를 사용함 (권장 에디터 툴: ATOM, Sublime Text 3)

 

  1) 멱등성이 적용되지 않은 경우

[root@Ansible-Server ~]# echo -e "[user01]\n172.30.1.13" >> /etc/ansible/hosts
[root@Ansible-Server ~]# echo -e "[user01]\n172.30.1.13" >> /etc/ansible/hosts

[root@Ansible-Server ~]# cat /etc/ansible/hosts
## db-[99:101]-node.example.com
...
[user01]
172.30.1.13
[user01]
172.30.1.13

# 실행한 만큼 적용됨

 

  2) 멱등성이 적용된 경우: 플레이북 적용

플레이북 생성

vi jin.yml

---
- name: Ansible_vim					# 파일 이름
  hosts: localhost					# 실행되는 곳

  tasks:							# 작업
    - name: Add ansible hosts		# 작업 이름
      blockinfile:					# 모듈 이름: 특정 블록을 파일이 기록
          path: /etc/ansible/hosts	# 기록할 위치
          block: |					# 블록을 기록할 시작 포인트
            [user01]
            172.30.1.13

 

플레이북 실행

[root@Ansible-Server ~]# ansible-playbook jin.yml

PLAY [Ansible_vim] ***********************************************************************

TASK [Gathering Facts] *******************************************************************
ok: [localhost]

TASK [Add ansible hosts] *****************************************************************
changed: [localhost]

PLAY RECAP *******************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

# 수정 사항이 없다는 내용
[root@Ansible-Server ~]# ansible-playbook jin.yml

PLAY [Ansible_vim] ***********************************************************************

TASK [Gathering Facts] *******************************************************************
ok: [localhost]

TASK [Add ansible hosts] *****************************************************************
ok: [localhost]

PLAY RECAP *******************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 

멱등성 성질 확인: 여러 번 실행되더라도 같은 내용이라면 여러 번 기록되지 않음

[root@Ansible-Server ~]# cat /etc/ansible/hosts
...
## db-[99:101]-node.example.com
...
# BEGIN ANSIBLE MANAGED BLOCK
[user01]
172.30.1.13
# END ANSIBLE MANAGED BLOCK

 


플레이북 환경 설정


vim에 색 넣기


 

vim-plug 설치

웹 브라우저에서 ansible-vim 검색하여 접속 또는 아래 링크로 접속

https://github.com/pearofducks/ansible-vim

 

설치 안내 부분에서 vim-plug 클릭

 

해당 부분의 코드를 복사하여 실행

 

[root@Ansible-Server ~]# curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
>     https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

 

ansible-vim 설치

~/.vimrc 생성

[root@Ansible-Server ~]# vi ~/.vimrc

call plug#begin()
Plug 'pearofducks/ansible-vim'
call plug#end()

 

패키지 설치

[root@Ansible-Server ~]# yum install -y vim-enhanced
[root@Ansible-Server ~]# yum install -y git

 

vim 설정

[root@Ansible-Server ~]# vim

# ansible-vim을 다운로드하여 설치 진행
:PlugInstall

# 설치가 완료되면 종료
:q
:q

 

vi 와 vim 모두 vim 호출되도록 설정

# bash 환경 파일 수정

[root@Ansible-Server ~]# vi ~/.bashrc
...
     14 alias vi='vim'
     
     
# 수정한 bash 파일을 적용하기 위해 환경 설정을 다시 불러옴
[root@Ansible-Server ~]# su -
Last login: Thu Jun  2 02:38:42 EDT 2022 from 172.30.1.46 on pts/0

 

색으로 구분하기 편하게 설정된 것을 확인할 수 있음

 


에러를 읽기 편하게 설정


 

설정 전 에러 확인

 

 

설정 파일 수정

# 주석 제거 후 skippy를 debug로 값 변경

[root@Ansible-Server ~]# vi /etc/ansible/ansible.cfg

 74 stdout_callback = debug

 

정렬된 에러 확인

 

 


플레이북 실습


플레이북을 통해 3대의 노드들에 웹 서비스 설치 및 실행

 

nginx.yml 플레이북 생성 및 실행

[root@Ansible-Server ~]# vi nginx.yml
---
- hosts: nginx
  remote_user: root
  tasks:
    - name: install epel-release
      yum: name=epel-release state=latest
    - name: install nginx web server
      yum: name=nginx state=present
    - name: Start nginx web server
      service: name=nginx state=started

[root@Ansible-Server ~]# ansible-playbook nginx.yml -k
SSH password:

 

방화벽 설정

- 플레이북 실행 후 서비스는 실행되고 있지만 방화벽 설정이 되어있지 않아 웹 브라우저에서 접속이 불가함

[root@Ansible-Server ~]# ansible nginx -m shell -a "systemctl stop firewalld" -k
SSH password:
172.30.1.13 | CHANGED | rc=0 >>

172.30.1.12 | CHANGED | rc=0 >>

172.30.1.11 | CHANGED | rc=0 >>

 

웹 브라우저에서 접속하여 nginx 기본 페이지 확인

172.30.1.11

172.30.1.12

172.30.1.13

 

nginx 기본 페이지 변경

  1) index.html 파일 다운로드

# 변경할 index.html 파일 다운로드
[root@Ansible-Server ~]# curl -o index.html https://www.nginx.com
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  397k    0  397k    0     0   228k      0 --:--:--  0:00:01 --:--:--  228k
[root@Ansible-Server ~]# ls -rlt
total 408
-rw-------. 1 root root   1214 Jun  1 23:45 anaconda-ks.cfg
-rw-r--r--. 1 root root    271 Jun  2 05:00 nginx.yml
-rw-r--r--. 1 root root 406732 Jun  2 05:10 index.html

 

  2) 플레이북 수정

[root@Ansible-Server ~]# vi nginx.yml
---
- hosts: nginx			# nginx 대신 all 사용 가능 (all 사용 시 /etc/ansible/hosts의 호스트를 대상으로 함)
  remote_user: root
  tasks:
    - name: install epel-release
      yum: name=epel-release state=latest
    - name: install nginx web server
      yum: name=nginx state=present
    - name: Upload default index.html for web server
      copy: src=index.html dest=/usr/share/nginx/html/ mode=0644	# mode: 보안을 위한 설정
    - name: Start nginx web server
      service: name=nginx state=started

 

  3) 플레이북 실행

[root@Ansible-Server ~]# ansible-playbook nginx.yml -k

 

변경된 nginx 페이지 확인

 

172.30.1.11 접속

 

172.30.1.12 접속

 

172.30.1.13 접속

 

 

 

728x90
728x90

한 번의 명령어로 다수의 시스템에 작업하기


 

uptime 확인

[root@Ansible-Server ~]# ansible all -m shell -a "uptime" -k
SSH password:
172.30.1.13 | CHANGED | rc=0 >>
 04:07:56 up  2:57,  2 users,  load average: 0.00, 0.01, 0.04
172.30.1.11 | CHANGED | rc=0 >>
 04:07:56 up  2:57,  2 users,  load average: 0.00, 0.01, 0.03
172.30.1.12 | CHANGED | rc=0 >>
 04:07:57 up  2:57,  2 users,  load average: 0.08, 0.03, 0.05

 

디스크 용량 확인

[root@Ansible-Server ~]# ansible all -m shell -a "df -h"
172.30.1.11 | CHANGED | rc=0 >>
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 484M     0  484M   0% /dev
tmpfs                    496M     0  496M   0% /dev/shm
tmpfs                    496M  6.8M  489M   2% /run
tmpfs                    496M     0  496M   0% /sys/fs/cgroup
/dev/mapper/centos-root   50G  1.3G   49G   3% /
/dev/sda1               1014M  138M  877M  14% /boot
/dev/mapper/centos-home  2.0T   33M  2.0T   1% /home
tmpfs                    100M     0  100M   0% /run/user/0
172.30.1.12 | CHANGED | rc=0 >>
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 484M     0  484M   0% /dev
tmpfs                    496M     0  496M   0% /dev/shm
tmpfs                    496M  6.8M  489M   2% /run
tmpfs                    496M     0  496M   0% /sys/fs/cgroup
/dev/mapper/centos-root   50G  1.3G   49G   3% /
/dev/sda1               1014M  138M  877M  14% /boot
/dev/mapper/centos-home  2.0T   33M  2.0T   1% /home
tmpfs                    100M     0  100M   0% /run/user/0
172.30.1.13 | CHANGED | rc=0 >>
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 484M     0  484M   0% /dev
tmpfs                    496M     0  496M   0% /dev/shm
tmpfs                    496M  6.8M  489M   2% /run
tmpfs                    496M     0  496M   0% /sys/fs/cgroup
/dev/mapper/centos-root   50G  1.3G   49G   3% /
/dev/mapper/centos-home  2.0T   33M  2.0T   1% /home
/dev/sda1               1014M  138M  877M  14% /boot
tmpfs                    100M     0  100M   0% /run/user/0

 

메모리 상태 확인

[root@Ansible-Server ~]# ansible all -m shell -a "free -h" -k
SSH password:
172.30.1.12 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:           990M        165M        706M        6.8M        119M        693M
Swap:          2.0G          0B        2.0G
172.30.1.13 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:           990M        163M        708M        6.8M        119M        694M
Swap:          2.0G          0B        2.0G
172.30.1.11 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:           990M        164M        706M        6.8M        119M        693M
Swap:          2.0G          0B        2.0G

 

새로운 유저 생성

[root@Ansible-Server ~]# ansible all -m user -a "name=user01 password=1234" -k
SSH password:
[WARNING]: The input password appears not to have been hashed. The 'password' argument
must be encrypted for this module to work properly.
172.30.1.12 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "comment": "",
    "create_home": true,
    "group": 1000,
    "home": "/home/user01",
    "name": "user01",
    "password": "NOT_LOGGING_PASSWORD",
    "shell": "/bin/bash",
    "state": "present",
    "system": false,
    "uid": 1000
}
172.30.1.13 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "comment": "",
    "create_home": true,
    "group": 1000,
    "home": "/home/user01",
    "name": "user01",
    "password": "NOT_LOGGING_PASSWORD",
    "shell": "/bin/bash",
    "state": "present",
    "system": false,
    "uid": 1000
}
172.30.1.11 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "comment": "",
    "create_home": true,
    "group": 1000,
    "home": "/home/user01",
    "name": "user01",
    "password": "NOT_LOGGING_PASSWORD",
    "shell": "/bin/bash",
    "state": "present",
    "system": false,
    "uid": 1000
}

 

ansible-node01에 접속하여 user01 사용자가 생성되었는지 확인

[root@Ansible-Server ~]# ssh root@172.30.1.11

[root@ansible-node01 ~]# cat /etc/passwd
...
user01:x:1000:1000::/home/user01:/bin/bash

 

파일 전송

파일을 하나 생성하여 관리되고 있는 노드들에 모두 전송

# 노드들에 전송할 파일 생성: jin.file
[root@Ansible-Server ~]# ls -rlt
total 8
-rw-------. 1 root root 1214 Jun  1 23:45 anaconda-ks.cfg
-rw-r--r--. 1 root root   24 Jun  2 03:43 test
[root@Ansible-Server ~]# touch jin.file
[root@Ansible-Server ~]# ls -rlt
total 8
-rw-------. 1 root root 1214 Jun  1 23:45 anaconda-ks.cfg
-rw-r--r--. 1 root root   24 Jun  2 03:43 test
-rw-r--r--. 1 root root    0 Jun  2 04:15 jin.file

 

# nginx에 속한 노드들의 /tmp 경로로 jin.file을 복사하겠다

[root@Ansible-Server ~]# ansible nginx -m copy -a "src=./jin.file dest=/tmp/" -k
SSH password:
172.30.1.11 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/jin.file",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "secontext": "unconfined_u:object_r:admin_home_t:s0",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1654157890.28-10394-49655578753014/source",
    "state": "file",
    "uid": 0
}
172.30.1.12 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/jin.file",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "secontext": "unconfined_u:object_r:admin_home_t:s0",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1654157890.29-10395-66125307720210/source",
    "state": "file",
    "uid": 0
}
172.30.1.13 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/jin.file",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "secontext": "unconfined_u:object_r:admin_home_t:s0",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1654157890.32-10396-93284678817142/source",
    "state": "file",
    "uid": 0
}

 

전송된 파일 확인

[root@Ansible-Server ~]# ssh root@172.30.1.11
root@172.30.1.11's password:
Last login: Thu Jun  2 04:18:11 2022 from 172.30.1.10
[root@ansible-node01 ~]# ls -rlt /tmp
total 4
...
-rw-r--r--. 1 root root   0 Jun  2 04:18 jin.file

 

서비스 설치

노드들에 아파치를 설치하도록 명령 실행

에러 발생: 각 노드들에 DNS 설정이 되어있지 않기 때문

[root@Ansible-Server ~]# ansible nginx -m yum -a "name=httpd state=present" -k
SSH password:
172.30.1.11 | FAILED! => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "msg": "Failure talking to yum: Cannot find a valid baseurl for repo: base/7/x86_64"
}
172.30.1.13 | FAILED! => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "msg": "Failure talking to yum: Cannot find a valid baseurl for repo: base/7/x86_64"
}
172.30.1.12 | FAILED! => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "msg": "Failure talking to yum: Cannot find a valid baseurl for repo: base/7/x86_64"
}

 

에러 해결: ansible-server에 있는 DNS 설정 파일을 각 노드로 복사

[root@Ansible-Server ~]# ansible nginx -m copy -a "src=/etc/resolv.conf dest=/etc/resolv.conf" -k

 

다시 설치 명령 실행

[root@Ansible-Server ~]# ansible nginx -m yum -a "name=httpd state=present" -k

 

ansible-node01에 접속하여 설치 확인

[root@Ansible-Server ~]# ssh root@172.30.1.11
root@172.30.1.11's password:
Last login: Thu Jun  2 04:26:05 2022 from 172.30.1.10
[root@ansible-node01 ~]# yum list installed | 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

# 설치가 완료되었지만 실행은 되지 않음
[root@ansible-node01 ~]# 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)
728x90
728x90

앤서블 기본 구성 요소


1. /etc/ansible/ansible.cfg

- 환경 설정 파일

 

2. /etc/ansible/hosts

- 앤서블이 접속하는 호스트들에 대한 정보

 

3. 옵션 값

 

옵션 설명
-i (--inventory-file) 적용될 호스트들에 대한 파일
-m (--module-name) 모듈을 선택할 수 있도록
-k (--ask-pass) 패스워드를 물어보도록 설정
-K (--ask-become-pass) 관리자로 권한 상승
--list-hosts 적용되는 호스트들 확인

 

-i : 특정 노드들에 대해 명령어 실행을 원할 경우 자유로운 인벤토리 사용 가능

 1) 임의의 파일: test

# 테스트를 위해 test 파일 생성
[root@Ansible-Server ~]# vi test
      1 172.30.1.11
      2 172.30.1.12
    
# test 파일에 입력한 두 개의 노드에 대해서만 통신    
[root@Ansible-Server ~]# ansible all -i test -m ping -k
SSH password:
172.30.1.11 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
172.30.1.12 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

 

 2) /etc/ansible/hosts 파일

# /etc/ansible/hosts 파일 설정
     43 ## db-[99:101]-node.example.com
     44 [nginx] # 그룹 이름과 같은 역할
     45 172.30.1.11
     46 172.30.1.12
     47 172.30.1.13

# nginx에 해당하는 노드들에 명령어 적용
[root@Ansible-Server ~]# ansible nginx -m ping -k
SSH password:
172.30.1.11 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
172.30.1.12 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
172.30.1.13 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

 

-k: 해당 옵션이 없으면 퍼블릭 키 교환이 이루어지지 않아 로그인을 할 수 없음

[root@Ansible-Server ~]# ansible nginx -m ping
172.30.1.11 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
    "unreachable": true
}
172.30.1.12 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
    "unreachable": true
}
172.30.1.13 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
    "unreachable": true
}

 

-K: 루트 사용자 권한을 가져옴

[root@Ansible-Server ~]# ansible nginx -m ping -k -K
SSH password:
BECOME password[defaults to SSH password]:
172.30.1.11 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
172.30.1.12 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
172.30.1.13 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

 

--list-hosts

# /etc/ansible/hosts 파일에 설정된 호스트
[root@Ansible-Server ~]# ansible nginx -m ping --list-hosts
  hosts (3):
    172.30.1.11
    172.30.1.12
    172.30.1.13

# test 파일에 설정된 호스트
[root@Ansible-Server ~]# ansible all -i test -m ping --list-hosts
  hosts (2):
    172.30.1.11
    172.30.1.12

 


Ansible-Server에 앤서블 코어 설치


ansible 설치

에러 확인: dns 서버가 설정되지 않아 발생

 

[root@Ansible-Server ~]# yum install -y ansible
Loaded plugins: fastestmirror
Determining fastest mirrors
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"


 One of the configured repositories failed (Unknown),
 and yum doesn't have enough cached data to continue. At this point the only
 safe thing yum can do is fail. There are a few ways to work "fix" this:

     1. Contact the upstream for the repository and get them to fix the problem.

     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer
        distribution release than is supported by the repository (and the
        packages for the previous distribution release still work).

     3. Run the command with the repository temporarily disabled
            yum --disablerepo=<repoid> ...

     4. Disable the repository permanently, so yum won't use it by default. Yum
        will then just ignore the repository until you permanently enable it
        again or use --enablerepo for temporary usage:

            yum-config-manager --disable <repoid>
        or
            subscription-manager repos --disable=<repoid>

     5. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nice
        compromise:

            yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true

Cannot find a valid baseurl for repo: base/7/x86_64

 

해결: DNS 서버 설정

 

[root@Ansible-Server ~]# vi /etc/resolv.conf

nameserver 168.126.63.1

 

DNS 서버가 제대로 설정되었는지 확인

[root@Ansible-Server ~]# ping google.com
PING google.com (172.217.175.46) 56(84) bytes of data.
64 bytes from nrt20s19-in-f14.1e100.net (172.217.175.46): icmp_seq=1 ttl=114 time=32.0 ms
64 bytes from nrt20s19-in-f14.1e100.net (172.217.175.46): icmp_seq=2 ttl=114 time=31.9 ms

 

레포지토리 리스트 확인

- 앤서블 설치 패키지가 없기 때문에 앤서블 설치 시 에러 발생

 

[root@Ansible-Server ~]# yum repolist

repo id                             repo name                             status
base/7/x86_64                       CentOS-7 - Base                       10,072
extras/7/x86_64                     CentOS-7 - Extras                        512
updates/7/x86_64                    CentOS-7 - Updates                     3,842
repolist: 14,426

 

앤서블 설치 패키지를 다운로드할 수 있는 공간 설정

# epel 패키지 설치
[root@Ansible-Server ~]# yum install -y epel-release

 

앤서블 설치 패키지 다운로드 및 확인

# ansible 패키지 설치
[root@Ansible-Server ~]# yum install -y ansible

# ansible 명령어 확인
[root@Ansible-Server ~]# ansible
usage: ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD]
               [--become-user BECOME_USER] [-K] [-i INVENTORY] [--list-hosts]
               [-l SUBSET] [-P POLL_INTERVAL] [-B SECONDS] [-o] [-t TREE] [-k]
               [--private-key PRIVATE_KEY_FILE] [-u REMOTE_USER]
               [-c CONNECTION] [-T TIMEOUT]
               [--ssh-common-args SSH_COMMON_ARGS]
               [--sftp-extra-args SFTP_EXTRA_ARGS]
               [--scp-extra-args SCP_EXTRA_ARGS]
               [--ssh-extra-args SSH_EXTRA_ARGS] [-C] [--syntax-check] [-D]
               [-e EXTRA_VARS] [--vault-id VAULT_IDS]
               [--ask-vault-pass | --vault-password-file VAULT_PASSWORD_FILES]
               [-f FORKS] [-M MODULE_PATH] [--playbook-dir BASEDIR]
               [-a MODULE_ARGS] [-m MODULE_NAME]
               pattern
ansible: error: too few arguments

 

통신 확인

앤서블 명령어 입력 시 호스트 리스트가 비어있다는 에러 확인

[root@Ansible-Server ~]# ansible all -m ping -k
SSH password:
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

 

/etc/ansible/hosts 파일에 ansible 노드들의 IP 주소 입력

[root@Ansible-Server ~]# vi /etc/ansible/hosts


     43 ## db-[99:101]-node.example.com
     44 [nginx] # 그룹 이름과 같은 역할
     45 172.30.1.11
     46 172.30.1.12
     47 172.30.1.13

 

 

ansible all -m ping 명령어 입력 후 퍼블릭 키 교환을 위해 yes 입력

[root@Ansible-Server ~]# ansible all -m ping

The authenticity of host '172.30.1.12 (172.30.1.12)' can't be established.
ECDSA key fingerprint is SHA256:eh7uTCrpcvLAs0DeHsU/ue9UXGxxjaqudmhQVhg0juI.
ECDSA key fingerprint is MD5:e1:59:5e:93:ba:f3:ef:2a:c6:6b:8a:56:b9:90:62:cd.
Are you sure you want to continue connecting (yes/no)? The authenticity of host '172.30.1.13 (172.30.1.13)' can't be established.
ECDSA key fingerprint is SHA256:eh7uTCrpcvLAs0DeHsU/ue9UXGxxjaqudmhQVhg0juI.
ECDSA key fingerprint is MD5:e1:59:5e:93:ba:f3:ef:2a:c6:6b:8a:56:b9:90:62:cd.
Are you sure you want to continue connecting (yes/no)? The authenticity of host '172.30.1.11 (172.30.1.11)' can't be established.
ECDSA key fingerprint is SHA256:eh7uTCrpcvLAs0DeHsU/ue9UXGxxjaqudmhQVhg0juI.
ECDSA key fingerprint is MD5:e1:59:5e:93:ba:f3:ef:2a:c6:6b:8a:56:b9:90:62:cd.
Are you sure you want to continue connecting (yes/no)? yes
172.30.1.12 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added '172.30.1.12' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
    "unreachable": true
}
yes
172.30.1.13 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added '172.30.1.13' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
    "unreachable": true
}
yes
172.30.1.11 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added '172.30.1.11' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
    "unreachable": true
}

 

퍼블릭 키 교환이 완료되어 노드들과 정상적으로 통신이 되었음을 확인 

[root@Ansible-Server ~]# ansible all -m ping -k
SSH password: #1234
172.30.1.11 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
172.30.1.13 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
172.30.1.12 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

728x90
728x90

실습 환경 구성


아키텍처

 

 

Host Name Ansible-Server Ansible-Node01 Ansible-Node02 Ansible-Node03
IPv4(enp0s3) 172.30.1.10 172.30.1.11 172.30.1.12 172.30.1.13
SubnetMask 255.255.255.0
Gateway 172.30.1.254

 


가상 머신 구성


가상 머신 생성

 

최댓값으로 설정


가상머신 설정

저장소: 이미지 파일 추가

 

네트워크 설정: 브릿지 어댑터로 변경

 


CentOS 7 설치

 

 

KDUMP

KDUMP: 용량 확보를 위해서 꺼줌

 

INSTALLATION DESTINATION

기본 옵션 그대로 사용

 

NETWORK & HOST NAME

호스트 네임 변경: Ansible-Server

 

ROOT PASSWORD

루트 암호: 1234


가상 머신 복제, 호스트 네임 및 IP 설정

IP 확인: ip add

브릿지 어댑터로 설정했기 때문에 IP를 할당받지 않음

 

 

 

가상 머신 종료: poweroff

 

가상 머신 복제(node01, node02, node03)

모든 네트워크 어댑터의 새 MAC 주소 생성: 충돌 방지

완전한 복제: 완전한 복제를 해야 두 개가 분리되어 복제됨

 

 

호스트 네임 설정

# 각 머신에서 호스트 네임설정
hostnamectl set-hostname Ansible-Node01
hostnamectl set-hostname Ansible-Node02
hostnamectl set-hostname Ansible-Node03

 

IP 할당

어댑터에 브릿지: 공유기에서 IP를 바로 할당받음

가상 머신의 네트워크 카드가 브릿지 어댑터로 호스트 PC의 IP 주소 확인 필요

호스트 PC의 IP 확인: 윈도우 키 + R > cmd 창: ipconfig

이더넷 어댑터 이더넷 IP 주소와 이더넷 어댑터 VirtualBox Host-Only Network 주소 확인

 

nmtui 명령어로 네트워크 IP 설정

nmtui > enp0s3 > IPv4 Configuration: Manual > Addresses: 172.30.1.10/24 > Gateway: 172.30.1.254

Automatically connect: 자동으로 연결 설정

 

Ansible-Server
Ansible-Node01
Ansible-Node02
Ansible-Node03

 

IP 설정 확인

# 네트워크 서비스 재시작
systemctl restart network

# 게이트웨이와 통신이 잘되는지 확인
ping 172.30.1.254

# 설정된 IP 주소 확인
ip add

 

728x90

+ Recent posts