728x90

실습 개요


아키텍처

- Ansible-Server (control-node): 1대

- Ansible-Nodes (host-node): 2대

 

 

 

Vagrantfile 구성

1. 앤서블 노드 2개를 CentOS를 이용하여 구성

2. 기존과 동일한 방법으로 구성 파일 작성

  1) 베이그런트에서 인식하는 호스트 이름 지정

  2) 버추얼박스 설정 변경

    - 버추얼박스에서 구분하는 호스트 이름 지정

    - CPU와 메모리를 최소한으로 사용하도록 변경

  3) 가상 머신의 호스트 이름 변경

  4) 호스트 PC와 가상 머신의 공유 디렉토리 사용 X

  5) 인터넷에 연결되는 IP 설정

  6) 호스트 PC의 포트를 IP 주소와 유사하게 변경

  7) 앤서블 서버에서 add_ssh_auth.sh 실행

 

 

Ansible_env_ready.yml 구성

1. /etc/hosts에 서버와 노드 등록2. /etc/ansible/hosts에 앤서블을 통해 관리할 노드 등록3. yum을 통해서 앤서블 서버에 sshpass 설치

 

 

add_ssh_auth.sh 구성

1. sshpass를 이용해 앤서블 서버에 앤서블 노드의 ssh_key 등록2. 해당 파일의 목적: 노드의 ssh 키를 non-host에 등록하기 위함

 


Vagrantfile 구성


# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant_API_Version = "2"

Vagrant.configure(Vagrant_API_Version) do |config|

  # Ansible-Node01
  config.vm.define:"ansible-node01" do |cfg|
		cfg.vm.box = "centos/7"
		cfg.vm.provider:virtualbox do |vb|
			vb.name = "Ansible-Node01"
      vb.customize ["modifyvm", :id, "--cpus",1]
      vb.customize ["modifyvm", :id, "--memory",512]
		end
		cfg.vm.host_name = "ansible-node01"
		cfg.vm.synced_folder ".", "/vagrant", disabled: true
		cfg.vm.network "public_network", ip: "172.30.1.110"
		cfg.vm.network "forwarded_port", guest: 22, host: 19211, auto_correct: false, id: "ssh"
		
	end
  
  # Ansible-Node02
  config.vm.define:"ansible-node02" do |cfg|
		cfg.vm.box = "centos/7"
		cfg.vm.provider:virtualbox do |vb|
			vb.name = "Ansible-Node02"
      vb.customize ["modifyvm", :id, "--cpus",1]
      vb.customize ["modifyvm", :id, "--memory",512]
		end
		cfg.vm.host_name = "ansible-node02"
		cfg.vm.synced_folder ".", "/vagrant", disabled: true
		cfg.vm.network "public_network", ip: "172.30.1.120"
		cfg.vm.network "forwarded_port", guest: 22, host: 19212, auto_correct: false, id: "ssh"
		
	end  
  
  
  
  # Ansible-Server
	config.vm.define:"ansible-server" do |cfg|
		cfg.vm.box = "centos/7"
		cfg.vm.provider:virtualbox do |vb|
			vb.name = "Ansible-Server"
		end
		cfg.vm.host_name = "ansible-server"
		cfg.vm.synced_folder ".", "/vagrant", disabled: true
		cfg.vm.network "public_network", ip: "172.30.1.100"
		cfg.vm.network "forwarded_port", guest: 22, host: 19210, auto_correct: false, id: "ssh"
		cfg.vm.provision "shell", path: "bootstrap.sh"
		cfg.vm.provision "file", source: "Ansible_env_ready.yml", destination: "Ansible_env_ready.yml"
		cfg.vm.provision "shell", inline: "ansible-playbook Ansible_env_ready.yml"
    cfg.vm.provision "shell", path: "add_ssh_auth.sh", privileged: false
	end
  
end

 

 

 

Ansible_env_ready.yml 구성


blockinfile: 블록 단위로 수정, 파이프( | )를 필수로 입력

---
- name: Setup for the Ansible's Environment
  hosts: localhost
  gather_facts: no
  
  tasks:
  
    - name: Add "/etc/hosts"
      blockinfile:  |
        path=/etc/hosts
        content="
          172.30.1.100  server
          172.30.1.110  node01
          172.30.1.120  node02"
          
    - name: Add "/etc/ansible/hosts"
      blockinfile:  |
        path=/etc/ansible/hosts
        content="
          [CentOS]
            node01
            node02"
            
    - name: Install sshpass for Authentication
      yum:
        name: sshpass
        state:  present
          
 
    - name: Install vim-enhanced
      yum:
        name: vim-enhanced
        state: present
        
    - name: Install git
      yum:
        name: git
        state: present

    - name: Download pathogen.vim
      shell: "curl -fLo /home/vagrant/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim"

    - name: Git clone vim-ansible-yaml
      git:
        repo: 'https://github.com/chase/vim-ansible-yaml.git'
        dest: /home/vagrant/.vim/bundle/vim-ansible-yaml

    - name: Configure vimrc
      lineinfile:
        path: /home/vagrant/.vimrc
        line: "{{ item }}"
      with_items:
        - "set number"
        - "execute pathogen#infect()"
        - "syntax on"

    - name: Configure Bashrc
      lineinfile:
        path: /home/vagrant/.bashrc
        line: "{{ item }}"
      with_items:
        - "alias vi='vim'"
        - "alias ans='ansible'"
        - "alias anp='ansible-playbook'"

 

add_ssh_auth.sh 구성


 

StrictHostKeyChecking=no: ssh 접속 시 ssh 키 확인 경고창을 확인하지 않겠다는 옵션

#! /usr/bin/env bash

# ssh key 생성
sshpass -p vagrant ssh -T -o StrictHostKeyChecking=no vagrant@node01
sshpass -p vagrant ssh -T -o StrictHostKeyChecking=no vagrant@node02

 

 

vagrant up


기존의 앤서블 서버 삭제 후 진행

PS C:\HashiCorp\udemy-ansible> vagrant destroy ansible-server
    ansible-server: Are you sure you want to destroy the 'ansible-server' VM? [y/N] y
    
PS C:\HashiCorp\udemy-ansible> vagrant up

 

구성 완료

 

적용 사항 확인

# 노드 정보 확인
[vagrant@ansible-server ~]$ cat .ssh/known_hosts
node01,172.30.1.110 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBP5AG7RgArSxOru587iWE6EpQtq5AnVf/zkMng3s8CqEq8+SSzPTuroQylfCkIIun8tiErQtF5HbCjqqpuWCKV4=
node02,172.30.1.120 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLUjlCIUB5zGlm9CD240edVQUendXDjzjMSdl8sFie6Cy552TVXeBCTVwgGbCVeOEm8XzrdSpj2Tq1G4Hv3JF2E=

# 앤서블에서 관리하는 블록 정보 확인
[vagrant@ansible-server ~]$ cat .ssh/known_hosts
# BEGIN ANSIBLE MANAGED BLOCK

  172.30.1.100  server
  172.30.1.110  node01
  172.30.1.120  node02
# END ANSIBLE MANAGED BLOCK

[vagrant@ansible-server ~]$ cat /etc/ansible/hosts
# BEGIN ANSIBLE MANAGED BLOCK

  [CentOS]
    node01
    node02
# END ANSIBLE MANAGED BLOCK

 

앤서블 서버와 노드 간의 통신 확인

[vagrant@ansible-server ~]$ ans all -m ping -k
SSH password:
node01 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).",
    "unreachable": true
}
node02 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).",
    "unreachable": true

 

728x90
728x90

vim 편집기 설정

[vagrant@control-node ~]$ vi ~/.vimrc
syntax on
autocmd FileType yaml setlocal ts=2 sts=2 sw=2 et ai

 


 

플레이북 실행

인벤토리 파일에 호스트 등록 (/etc/ansible/hosts)

[vagrant@control-node ~]$ sudo vi /etc/ansible/hosts

## [webservers]
## alpha.example.org
## beta.example.org
 192.168.56.110
 192.168.56.120
 192.168.56.130
 192.168.56.140

 

플레이북 생성 (.yaml 파일)

[vagrant@control-node ~]$ cat playbook.yaml

---
- name: first playbook
  hosts: all
  tasks:
    - name: use command module
      command: id

...

 

플레이북 실행 (ansible-playbook)

 

728x90
728x90

플레이북 환경 설정


 

Vagrantfile

1. Ansible_env_ready.yml 파일을 앤서블 서버로 전달

2. Ansible_env_ready.yml 파일을 앤서블 서버에서 실행

 

# -*- mode: ruby -*-
# vi: set ft=ruby :
# API 버전 명시
Vagrant_API_Version = "2"

Vagrant.configure(Vagrant_API_Version) do |config|
	config.vm.define:"ansible-server" do |cfg|
		cfg.vm.box = "centos/7"
		cfg.vm.provider:virtualbox do |vb|
			vb.name = "Ansible-Server"
		end
		cfg.vm.host_name = "ansible-server"
		cfg.vm.synced_folder ".", "/vagrant", disabled: true
		cfg.vm.network "public_network", ip: "172.30.1.100"
		cfg.vm.network "forwarded_port", guest: 22, host: 19210, auto_correct: false, id: "ssh"
		# path 옵션: 해당 파일을 전송하고 실행하는 것을 포함
        cfg.vm.provision "shell", path: "bootstrap.sh"
        # 앤서블 환경 준비 파일을 현재 디렉토리에서 원격지의 디렉토리로 전달
		cfg.vm.provision "file", source: "Ansible_env_ready.yml", destination: "Ansible_env_ready.yml"
		# inline 옵션: 실행만을 포함
        # ansible-playbook Ansible_env_ready.yml 명령어를 호출함
        cfg.vm.provision "shell", inline: "ansible-playbook Ansible_env_ready.yml"
	end
  
end

 

bootstarp.sh

1. vim plugin 관련 파일이 저장될 디렉토리 생성

  - /home/vagrant/.vim/autoload

  - /home/vagrant/.vim/bundle

2. vim과 bash의 환경 설정 파일 생성

 

#! /usr/bin/env bash

# 앤서블 설치
yum install -y epel-release
yum install -y ansible

# 환경 설정 초기 파일 구성 for vagrant only
mkdir -p /home/vagrant/.vim/autoload /home/vagrant/.vim/bundle
touch /home/vagrant/.vimrc
touch /home/vagrant/.bashrc

 

Ansible_env_ready.yml (앤서블 환경 준비 파일)

Ansible_env_ready.yml 파일 생성 후 저장

 

1. yum을 통한 vim-enhanced 설치

2. yum을 통한 git 설치

3. pathogen.vim 다운로드 (https://github.com/tpope/vim-pathogen)

4. vim-ansible-yaml을 git clone을 통해 다운로드

5. vim 환경 설정 수정 (vimrc)

6. Bash 환경 설정 수정 (bashrc)

 

---
- name: Setup for the Ansible's Environment
  hosts: localhost
  gather_facts: no
  
  tasks:
    - name: Install vim-enhanced
      yum:
        name: vim-enhanced
        state: present
        
    - name: Install git
      yum:
        name: git
        state: present

    - name: Download pathogen.vim
      shell: "curl -fLo /home/vagrant/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim"

    - name: Git clone vim-ansible-yaml
      git:
        repo: 'https://github.com/chase/vim-ansible-yaml.git'
        dest: /home/vagrant/.vim/bundle/vim-ansible-yaml

    - name: Configure vimrc
      lineinfile:
        dest: /home/vagrant/.vimrc
        line: "{{ item }}"
      with_items:
        - "set number"
        - "execute pathogen#infect()"
        - "syntax on"

    - name: Configure Bashrc
      lineinfile:
        dest: /home/vagrant/.bashrc
        line: "{{ item }}"
      with_items:
        - "alias vi='vim'"	# 주의: alias vi = 'vim' 과 같이 공백이 있으면 안됨
        - "alias ans='ansible'"
        - "alias anp='ansible-playbook'"

 

vagrant provision

현재 실행 중인 가상 머신에 변경 사항 적용

PS C:\HashiCorp> vagrant provision ansible-server

728x90
728x90

앤서블 인벤토리


정의

- 앤서블에서 관리할 호스트 목록 정의

- 단일 호스트 및 그룹 단위로 관리

- 정적/동적 인벤토리 지원

 

 

정적 인벤토리에 관리 대상 호스트 지정

- 정적 인벤토리 파일은 텍스트 파일로 INI / YAML 형식 등 사용

- 호스트 그룹 사용 시 []로 그룹 이름 지정

- 기본 그룹으로 all / ungrouped 제공

- :children 접미사를 이용해 중첩 그룹 지정 가능

- 범위 지정 방식으로 간편한 구성 가능

- --list-hosts 옵션으로 확인 가능

 

 

인벤토리 위치 재정의

- 기본 경로: /etc/ansible/hosts

- ansible.cfg 파일에서 재정의 가능

- 명령어 사용 시 --inventory / -i 옵션으로 지정 가능

 

 


앤서블 구성 파일


구성 파일 종류

- /etc/ansible/ansible.cfg (가장 낮은 우선 순위)

- ~/.ansible.cfg

- ./ansible.cfg (일반적으로 권장하는 방식)

- ANSIBLE_CONFIG 환경 변수로 구성 파일의 위치 정의 (유연한 관리)

- ansible --version 명령 혹은 명령어 사용 시 -v 옵션으로 확인

 

앤서블 구성

지시문 설명
inventory 인벤토리 파일의 경로 지정
remote_user 관리 호스트에 로그인할 사용자의 이름
ask_pass SSH 암호를 요청하는 메시지 표시 여부
become 관리 호스트에서 자동으로 사용자를 전환할지 여부
become_method 사용자 전환 방식
become_user 관리 호스트에서 전환할 사용자
become_ask_pass become_method의 암호흫 요청하는 메시지 표시 여부

 

연결 구성

1. 해당 관리 호스트와 통신하는 방법을 확인하기 위해 구성 파일 참조

2. 관리 방법 및 사용자 제어

3. 필요한 정보

  1) 관리 호스트 및 호스트 그룹을 나열하는 인벤토리 위치

  2) 관리 호스트와 통신하는 데 사용할 연결 프로토콜

  3) 관리 호스트에서 사용할 원격 사용자

  4) root로의 권한 에스컬레이션 여부

  5) 에스컬레이션 수행 방법

  6) 로그인하거나 권한을 얻기 위해 SSH 암호 또는 sudo 암호를 요청하는 메시지 표시 여부

728x90
728x90

앤서블 개념


정의

- 오픈 소스 IT 자동화 도구

- 시스템 구성 및 소프트웨어 배포 기능 제공

- 지속적인 배포와 다운 타임 없는 롤링 업데이트 지원

- 주요 목적은 단순성과 사용의 용이성

- YAML 언어 사용

- 분산 구조 설계

- Kerberos / LDAP 등 인증 관리 시스템에 연결이 쉬움

 

장점

- SSH를 통한 구성 (에이전트x)

- YAML 언어를 사용해 접근성이 높음

- 쉽고 단순한 구조, 가독성이 높음

- 변수 기능 사용으로 재사용성 증가

- 다른 도구보다 간소화됨

- 다양한 플랫폼 지원

 

단점

- 다른 도구에 비해 덜 강력함

- DSL을 통한 로직 수행으로 수시로 문서 확인 필요

- 변수 등록으로 인한 복잡성

- 변수 값 확인의 어려움

- 입/출력/구성 파일 간의 형식 일관성이 없음

- 성능 속도 저하

 

구성

- YAML 언어로 구성된 텍스트 파일

- 하나 이상의 작업 내용의 집합

 

동작

- 각 작업은 특정 인수와 함께 작은 코드 조각인 모듈 실행

- 시스템의 특정 측면이 특정 상태에 있는지 확인

- 특정 상태가 아닌 경우 해당 상태를 구성하기 위한 작업 실행

- 작업 실패 시 기본적으로 나머지 동작도 모두 중단

- 별도의 에이전트 없이 ssh 또는 WinRM을 이용한 연결 및 제어

 


앤서블 아키텍처


컨트롤 머신 (제어 노드)

- 설치 및 실행

- 원격으로 관리 노드 제어

- 프로젝트 파일의 사본 보관

- Python v2.6 이상 필요

 

관리 대상 호스트 (관리 노드)

- 컨트롤 머신을 통해 모듈 설치 및 작업 실행

- 인벤토리에 나열된 대상

- 단독 혹은 그룹으로 관리 가능

- Python v2.4 이상 ssh 필요

 

아키텍처

 

 


 

실습 환경


 

아키텍처

- 제어 노드(control-node)

- 관리 호스트(host1, host2, host3, host4)

 

 

 

 

앤서블 구성

 

1. vagrant 설치

https://www.vagrantup.com/

 

Vagrant by HashiCorp

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

www.vagrantup.com

 

2. Vagrantfile 다운로드

- 공유 파일

 

3. Vagrantfile 파일 실행

 

  1) 플러그인 설치: vagrant plugin install vagrant-hostmanager

  2) 가상 머신 배포: vagrant up

    - 에러 발생 1: undefined method `old_compare' for nil:NilClass (NoMethodError)

    - 해결

PS C:\HashiCorp\ansible> vagrant.exe plugin uninstall hostmanager
Uninstalling the 'hostmanager' plugin...
Removing hm
Successfully uninstalled hostmanager-1.2.2
Successfully uninstalled rubyhacks-0.1.5

 

- 에러 발생 2: umount: /mnt: not mounted

- 해결

https://www.devopsroles.com/vagrant-no-virtualbox-guest-additions-installation-found-fixed/

PS C:\HashiCorp\ansible> vagrant plugin uninstall vagrant-vbguest
PS C:\HashiCorp\ansible> vagrant plugin install vagrant-vbguest --plugin-version 0.21

 

  3) 실행 중인 가상 머신 확인: vagrant status

 

 

- 에러 발생 3: Vagrantfile에 네트워크 설정을 했음에도 불구하고 static 설정이 되지 않음

- 해결

# 플러그인 버전 확인
# 낮은 버전이라면 업데이트 필요

PS C:\HashiCorp\ansible> vagrant plugin update
Updating installed plugins...
Fetching vagrant-vbguest-0.30.0.gem
Successfully uninstalled vagrant-vbguest-0.21.0
Updated 'vagrant-vbguest' to version '0.30.0'!


PS C:\HashiCorp\ansible> vagrant plugin list
vagrant-hostmanager (1.8.9, global)
  - Version Constraint: > 0
vagrant-vbguest (0.30.0, global)
  - Version Constraint: > 0

 

 

4. 원격 접속

PS C:\HashiCorp\ansible> vagrant ssh control-node
[vagrant@localhost ~]$

 

5. 앤서블 설치

control-node에만 설치하면 됨

[vagrant@control ~]$ sudo yum install -y epel-release
[vagrant@control ~]$ sudo yum install -y ansible

 

6. SSH 설정 (모든 머신에 설정 필요)

기존에는 ssh 키 기반 인증으로 접속하여 패스워드 인증 사용 불가

-> 설정 변경 후에는 패스워드 인증을 사용한 원격 접속 가능

[vagrant@control ~]$ sudo vi /etc/ssh/sshd_config

# no > yes 로 변경
65 PasswordAuthentication yes

[vagrant@control ~]$ sudo systemctl restart sshd

 

7. 호스트 파일 확인

[vagrant@control-node ~]$ sudo cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.1.1 control-node control-node

## vagrant-hostmanager-start
192.168.56.100  control-node

192.168.56.110  host1

192.168.56.120  host2

192.168.56.130  host3

192.168.56.140  host4

## vagrant-hostmanager-end

 

8. 패스워드 없이 원격 접속 설정

# 모든 가상 머신에서 사용자 생성
# 사용자 생성
[vagrant@control ~]$ sudo useradd ansible

# 패스워드 설정
[vagrant@control ~]$ sudo passwd ansible

# 패스워드 입력 없이 원격 접속하도록 설정
# 1. 컨트롤 노드에서 ssh 생성
# 2. 호스트로 복사 (host1, host2, host3, host4)

[vagrant@control-node ~]$ 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:3lhOyiezamELTdrmy5HRbx7pw02DesuW6EcwACqeJhY vagrant@control-node
The key's randomart image is:
+---[RSA 2048]----+
|    ..           |
|   .  .          |
|.E.    .         |
|..o   ..o        |
|.=   =. Soo.     |
|+   o *= Oo.o    |
|     =ooB=O+ .   |
|     .+.oXB..    |
|     .++o+=o     |
+----[SHA256]-----+


# host[1..4] 설정
[vagrant@control-node ~]$ ssh-copy-id ansible@host1
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/vagrant/.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
ansible@host1's password:

Number of key(s) added: 1

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

[vagrant@control-node ~]$ ssh ansible@host1
Last failed login: Tue Jun  7 09:33:07 UTC 2022 from 192.168.56.100 on ssh:notty
There were 25 failed login attempts since the last successful login.
[ansible@host1 ~]$

 

host4에서 에러 발생: ansible 사용자 생성 시 디렉토리가 자동으로 생성되지 않음

[vagrant@control-node ~]$ ssh-copy-id ansible@host4
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/vagrant/.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
ansible@host4's password:
Could not chdir to home directory /home/ansible: No such file or directory
sh: 1: cd: can't cd to /home/ansible
mkdir: cannot create directory ‘.ssh’: Permission denied

vagrant@host4:~$ ls -l /home
total 8
drwxr-xr-x 3 ubuntu  ubuntu  4096 Jun  7 07:36 ubuntu
drwxr-xr-x 4 vagrant vagrant 4096 Jun  7 07:51 vagrant

 

해결: 디렉토리 수동 생성

vagrant@host4:~$ sudo mkdir /home/ansible
vagrant@host4:~$ sudo chown ansible:ansible /home/ansible
vagrant@host4:~$ sudo chmod 755 /home/ansible
vagrant@host4:~$ sudo ls -l /home
total 12
drwxr-xr-x 2 ansible ansible 4096 Jun  7 09:44 ansible
drwxr-xr-x 3 ubuntu  ubuntu  4096 Jun  7 07:36 ubuntu
drwxr-xr-x 4 vagrant vagrant 4096 Jun  7 07:51 vagrant

 

 

8. sudo 설정

패스워드 없이 sudo 명령어 사용 설정

[vagrant@control-node ~]$ sudo ls /etc/sudoers.d
vagrant
[vagrant@control-node ~]$ sudo cat /etc/sudoers.d/vagrant
%vagrant ALL=(ALL) NOPASSWD: ALL
[vagrant@control-node ~]$
[vagrant@control-node ~]$ sudo grep wheel /etc/sudoers
## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL
# %wheel        ALL=(ALL)       NOPASSWD: ALL


# 모든 가상 머신에서 파일 생성
[vagrant@control-node ~]$ sudo vi /etc/sudoers.d/ansible
ansible ALL=(ALL) NOPASSWD: ALL

 

ansible 파일 생성 전

[vagrant@control-node ~]$ ssh ansible@host1 "sudo id"

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

sudo: no tty present and no askpass program specified

 

ansible 파일 생성 후

[vagrant@control-node ~]$ ssh ansible@host1 "sudo id"
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[vagrant@control-node ~]$ ssh ansible@host2 "sudo id"
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[vagrant@control-node ~]$ ssh ansible@host3 "sudo id"
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[vagrant@control-node ~]$ ssh ansible@host4 "sudo id"
uid=0(root) gid=0(root) groups=0(root)
728x90
728x90

IaC 개요


IaC란

- 코드를 통한 인프라 환경 배포 및 관리

- 자동화 언어로 원하는 구성 정의

 

 

기존의 시스템 관리 방식 - 수동 관리

- 명령어 또는 그래픽 도구를 이용한 수동 작업

- 작업 시 오류 발생 가능성이 높음

- 수행 결과에 대한 검증이 제한적

- 여러 시스템의 일관적인 구성이 어려움

- 유지 관리가 어렵고 안정성이 떨어짐

 

 

IaC 특징

 

IaC의 필요성

- 인프라 환경의 규모 확대

- 서비스 방식의 변화

- 반복적인 작업 자동화

- 인프라에 대한 빠른 배포 및 버전 관리 필요

 

IaC 의 장점

- 비용 및 시간 절감

- 버전 관리가 쉬움

- 자동으로 빌드/리빌드 가능

 

 

스크립트와 IaC

 

스크립트의 한계점

- 할 수 있는 일이 제한적

- 구조적 코딩 프로젝트에 비해 스크립트 작성은 느슨하고 약식으로 수행

- 멱등성의 부재

 

IaC의 기능

- 체크인/체크아웃, 리비전, 롤백, 테스트, 배포 등의 기능 제공

- 멱등성을 통한 안정적인 결과 도출

- 인증 정보의 설정도 다룰 수 있음

- 클라우드 환경 및 데브옵스 환경에 적합

- 개발, 테스트, 품질 보증, 스테이징, 릴리스까지 사이클 구성

 

 

IaC 도구 종류

 

[출처] http://www.itdaily.kr/news/articleView.html?idxno=201814

 

 

Infrastructure Templating: 초기 인프라 설정

- 스크립트를 통한 인프라 프로비저닝

 

Manage Infrastructure: 인프라 관리

- 생성된 인프라 수정, 재사용, 인프라 작업 정보 관리

 

Install applications and one time configurations: 인프라 애플리케이션 배포

- 준비된 애플리케이션의 새 버전을 서버에 배포

 

Deploy configuration and changes post install: 배포된 인프라 애플리케이션 관리

 

 

728x90
728x90

Vagrantfile 수정 및 bootstrap.sh 생성


Vagrantfile

1. 베이그런트에서 부르는 호스트 이름 작성

2. 버추얼박스에서 구분하는 호스트 이름 작성

3. 가상 머신의 호스트 이름 변경

4. 호스트 PC와 가상 머신 간에 공유 디렉토리는 사용하지 않음

5. 가상 머신에서 인터넷으로 연결되는 IP 설정

6. 호스트 PC의 포트를 IP 주소와 유사하게 변경

 

 

Vagrant.configure("2") do |config|
	# 1. 베이그런트에서 ssh 연결 시 사용할 호스트 이름
	config.vm.define:"ansible-server" do |cfg|
    	# 가상 머신에 import할 이미지
		cfg.vm.box = "centos/7"
        # 버추얼 박스에서 가상 머신 생성
		cfg.vm.provider:virtualbox do |vb|
        	# 2. 생성할 가상 머신의 이름
			vb.name = "Ansible-Server"
		end
        # 3. hostname 명령어 입력 시 출력되는 값
		cfg.vm.host_name = "ansible-server"
        # 4. 윈도우 호스트와 가상 머신 사이의 공유 디렉토리를 사용하지 않도록 설정
		cfg.vm.synced_folder ".", "/vagrant", disabled: true
        # 5. 인터넷 연결을 위한 설정 (public_network = 브릿지 네트워크, 호스트 PC의 IP 주소 확인 필요)
		cfg.vm.network "public_network", ip: "172.30.1.100"
		cfg.vm.network "forwarded_port", guest: 22, host: 19210, auto_correct: false, id: "ssh"
        # shell을 호출하여 bootstrap.sh 파일을 실행함
		cfg.vm.provision "shell", path: "bootstrap.sh"
	end
  
end

 

bootstrap.sh

1. YUM을 통한 EPEL 설치

2. YUM을 통한 ANSIBLE 설치

 

새 파일 생성

아래 명령어 입력

#! /usr/bin/env bash

yum install -y epel-release
yum install -y ansible

 

"bootstrap.sh" 이름으로 파일 저장

 

 

vagrant up

기존의 가상 머신을 삭제하고 작업 진행

PS C:\HashiCorp> vagrant up

 

에러 발생: umount: /mnt: not mounted

해결

PS C:\HashiCorp> vagrant plugin uninstall vagrant-vbguest
PS C:\HashiCorp> vagrant plugin install vagrant-vbguest --plugin-version 0.21

 

 

vagrant ssh

생성된 가상 머신에 접속

PS C:\HashiCorp> vagrant ssh ansible-server
[vagrant@ansible-server ~]$

 

설정된 IP 확인

[vagrant@ansible-server ~]$ ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:4d:77:d3 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
       valid_lft 86219sec preferred_lft 86219sec
    inet6 fe80::5054:ff:fe4d:77d3/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:f3:77:c3 brd ff:ff:ff:ff:ff:ff
    inet 172.30.1.100/24 brd 172.30.1.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fef3:77c3/64 scope link
       valid_lft forever preferred_lft forever

 

ansible 설치 확인

[vagrant@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

 

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

+ Recent posts