본문 바로가기
교육

[38일 차] 21.09.10 : Ansible 2

by ballena 2021. 9. 10.

1교시

 

 

Vagrant 실습 구조

+ vagrant가 각 vm의 개인키, 공개키를 만든다. 이 중 공개키는 각 vm에 전송된다.

그래서 vagrant에서 각 장비에 접속하는 것이 쉽다. 

 

각 머신들로는 SSH 접근은 가능하지만, 전자 서명 방식으로만 접근 가능. 패스워드 접근 불가

 

교재는 패스워드 인증을 yes로 바꾸는 프로비저닝을 node들에만 적용했는데, 수업에서는 server에도 적용했다(p. 135).

 

베이그란트는 각 vm에 접속을 쉽게 할 수 있지만, server가 node들에 접근하려면 known_hosts에 등록하기 위해 ans all -m ping을 실행하고 yes를 입력해줘야 한다. 장비의 수가 늘어난다면 쓰지 못할 방식이다. 

그래서 교재(p. 136)에서는 server에 known_hosts를 자동으로 등록하는 코드를 추가했다.

-> cfg.vm.provision "shell", path: "add_ssh_auth.sh", privileged: false

-> 이 명령이 root 권한으로 실행되지 않도록 한다(privileged: false)

-> 이걸 root 권한으로 실행하면 각 장비로부터 들어오는 공개키를 root의 홈 디렉터리로 받아버린다.

-> 그러니 false로 해서 vagrant 사용자의 홈 디렉터리의 ~/.ssh/known_hosts에 받겠다는 것.

 

베이그란트에서 실행하는 명령어는 기본적으로 root 권한으로 실행하도록 되어 있다.

-> 그러니까 패키지 설치 등이 가능한 것.


2교시

 

 

SSH나 암호화 쪽은 들어도 어렵다.

 

~vagrant/.ssh/known_hosts에 키 자동 등록(p. 136~141)

 

나중에는 전자 서명 방식이 기본값이라 오히려 이런 패스워드 인증 방식이 불편해질 것이다.

베이그란트에서는 원격 접속으로 들어가고, 앤서블 입장에서는 패스워드 인증으로 들어가는 2중 방식이니 번거롭다.

 

전자 서명 방식으로 들어가도록 해보자.

-> ansible-server가 ssh 클라이언트의 입장, ansible-node들이 ssh 서버의 입장.

-> 클라이언트의 공개키를 서버에 보내서 vagrant 사용자의 Authorized key 파일로 저장

-> 베이그란트를 설정했을 때 베이그란트 안에 생성된 개인키, 공개키를 사용할 것이다. 따로 만들 필요 없음.

-> C:\HashiCorp\.vagrant\machines\장비명\virtualbox에 있는 private_key가 각 장비의 개인 키.

-> 공개 키는 각 계정의 ~vagrant/.ssh/authorized_keys 파일에 저장되어 있다.

 

vagrant ssh ansible-server로 접속하면 베이그란트에 있는 개인 키로 서명한 전자 서명으로 접속한다.

그럼 ansible-server가 ansible-node들로 전자 서명 기법을 사용하려면?

-> ansible-server에 각 ansible-node들의 개인 키가 있어야 한다.

ansible-server에서 다른 장비로 전자 서명 방식으로 접속해 보자.

호스트 PC에 있는 각 장비들의 개인 키를 ansible-sever의 vagrant 계정으로 전송할 것이다.

-> 위 경로에 있는 각 장비의 private_key를 Vagrantfile과 같은 경로로 옮겨 놓는다.


3교시

 

 

이번에는 장비별로 개인 키를 옮겨서 번거롭다고 생각할 수 있지만, AWS에서는 인스턴스마다 같은 키를 사용 가능하므로 나중에는 오히려 괜찮을 것이다.

Vagranfile의 Ansible-Server 부분에

cfg.vm.provision "file", source: "node01_private_key", 
  destination: "node01_private_key"
cfg.vm.provision "file", source: "node02_private_key", 
  destination: "node02_private_key"
cfg.vm.provision "file", source: "node03_private_key", 
  destination: "node03_private_key"

를 추가하고, 패스워드 인증 대신 전자 서명 방식을 사용할 것이니까 각 장비의

cfg.vm.provision "shell", path: "bash_ssh_conf_4_CentOS.sh"

부분을 주석 처리한다.

 

cfg.vm.provision "shell", path: "add_ssh_auth.sh", privileged: false

이 부분은 계속 필요하니 유지.

 

이제 vagrant provision 후 ansible-server 접속 후 ansible-node들로 패스워드 없이 접속되는지 확인

ssh -i node01_private_key vagrant@172.30.1.11

-> 실행하면 바로 ansible-node01로 접속된다.

 

더 편해지고 싶다. 접속 기본값을 전자 서명 방식으로 바꿔보자.

 

ans all -m ping -k

ans IP주소 -m ping -k

이러면 -k 옵션으로 패스워드를 입력해야 한다.

 

1. IP 주소를 매번 입력하기 귀찮다. Alias 설정으로 별칭을 붙이자.

node01 ansible_host=172.30.1.11 ansible_private_key_file=/home/vagrant/node01_private_key

node02 ansible_host=172.30.1.13 ansible_private_key_file=/home/vagrant/node02_private_key

node03 ansible_host=172.30.1.14 ansible_private_key_file=/home/vagrant/node03_private_key

-> 호스트로 접속할 때 개인키를 미리 등록

-> ansible_env_ready.yml 파일의 blockinfile 부분에 있던 기존 주소 대신 작성

 

-> 옮기는 개인키들의 권한을 600으로 조정해야 한다.

ansible_env_ready.yml에서 하면

-> - name: chmod 600 private keys
      shell: "chmod 600 node01_private_key node02_private_key node03_private_key node04_private_key node05_private_key node06_private_key"

Vagrantfile에서 하면

-> cfg.vm.provision "shell", inline: "chmod 600 node01_private_key node02_private_key node03_private_key node04_private_key node05_private_key node06_private_key"

ansible-server에서 하면

-> chmod 600 node01_private_key node02_private_key node03_private_key node04_private_key node05_private_key node06_private_key 

 

-> vagrant provision 후 ansible_server로 접속, /etc/ansible/hosts에 작성되어 있던 주소 확인

-> ans all -m ping 해보면 -k 옵션 없이도 정상 작동.

-> ans node01 -m ping 이런 식으로 alias 기능도 잘 작동

 

2. 굳이 핫키를 받을 것을 물어봐야 하나? : add_ssh_auth.sh

-> 자동으로 받아오도록 설정해보자.

-> /etc/ansible/ansible.cfg 파일에 있는 host_key_checking = False의 주석을 해제하면 될 것 같다. 

-> bash_ssh_conf_4_CentOS.sh의

sed -i -e 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config

이 구문을 응용하면 된다.

sed -i -e 's/#host_key_checking = False/host_key_checking = False/g' /etc/ansible/ansible.cfg

이렇게 수정.

굳이 sh 파일을 하나 더 만들지 말고, yaml 파일에 수정 명령을 넣어보자. 

-> ansible_env_ready.yml 파일에 

- name: host_key_checking Disable
      shell: "sed -i -e 's/#host_key_checking = False/host_key_checking = False/g' /etc/ansible/ansible.cfg"

이 구문 추가.

이 파일에서 sshpass 패키지 설치하는 부분과 Vagranfile의 ansible-server 파트에서 add_ssh_auth.sh 부분은 없어도 된다.

-> 저장한 후 vagrant provison, ansible-server에 접속

-> /etc/ansible/ansible.cfg에 주석 해제되었는지 확인 후 .ssh/known_hosts 파일 삭제

-> 이제 ans all -m ping 해보면 예전에는 핫 키를 받을 것인지 물어보는 과정이 있었는데, 이제 아무런 추가 확인 없이 응답이 돌아온다.


4교시

 

 

이제 Windows, CentOS 노드를 관리하는 방법을 배운다.

 

1. Nginx 설치/삭제

-> ansible-server에 실습을 위한 nginx 디렉토리를 만들고, 그 안에 nginx_install.yml 작성

-> 전자 서명 접속 방식으로 바꿨으니, anp로 yml 파일을 실행시킬 때 -k 옵션은 쓸 필요 없다.

-> nginx_remove.yml도 동일.

 

* yml 파일에서 yum 모듈을 사용할 때

yum: name=*** state=***

이런 식으로 사용할 수도 있고,

yum:

  name: ***

  state: ***

이런 식도 괜찮다. 가독성의 차이.

 

+ 각 노드의 페이지를 다르게 해보자.

각 노드의 /usr/share/nginx/html/index.html가 달라야 한다.

yml 파일에서 become은 root로 작업하라는 의미.

수정된 nginx_install.yml

각 tasks의 hosts를 구별하면 된다. 그룹 안의 노드를 지정할 때 뭐 특별할 게 있나 싶었지만 그런 것은 없었다.

수정 후 anp nginx_install.yml 실행해주면 각 웹 페이지가 다르게 나온다.

 

2. 시간대 변경

-> 교재 p. 150 ~ 153

 

4장에서 기억해야 할 것은 다양한 모듈을 다루는 방법이다.


5교시

 

 

 

3. NFS 서버와 클라이언트 구현(p. 154 ~ 162)

nfs.yml

localhost(ansible-server)에서의 작업

-> file 모듈로 nfs에 공유할 디렉터리 생성(shell 모듈로 mkdir 해도 상관없음)

-> 전체 블록에 하지 않고 2번째 task에만 become: yes 하는 이유 = 디렉터리의 소유자/그룹 관련 문제

-> /etc/export 파일에 /home/vagrant/nfs_shared 추가, 허용 네트워크 대역 172.30.1.0/24

-> nfs는 CentOS에 기본적으로 있어서 따로 yum으로 설치하지는 않았다.

 

CentOS(ansible-node01 ~ 03)에서의 작업

-> nfs에 사용할 디렉터리 생성 : file 모듈. 어차피 한 명만 쓸거니 모드는 상관없음

-> mount 모듈로 해당 주소의 해당 디렉터리에 위에서 생성만 디렉터리를 ansible-server의 nfs 디렉터리에 마운트

-> path는 클라이언트(ansible-node01 ~ 03)에서 마운트 할 경로

-> src는 ansible-server에서 마운트할 경로

-> opts는 옵션, nfsvers는 버전 지정, state: mounted로 마운트

구성 확인

확인을 위한 작업

-> /etc/hostname에 있는 호스트의 이름을 받아서 xargs를 통해 touch의 인자로 전달

-> 클라이언트의 /home/vagrant/nfs에 각 호스트의 이름이 기록되도록 한다.

-> 각 노드에 접속해서 똑같이 있는지 확인


6~7교시

 

 

우분투 장비 3개를 새로 배포할 것이다. 기존의 저장된 장비 정보에 혼동이 없게 다 지운 후 다시 up 하자.

-> ansible-server 설치 단계에서 막힌다. 기존의 private key를 모두 삭제했기 때문.

-> ansible-server 이전에 멈추면 만들어진 개인키들을 모두 Vagrantfile과 같은 경로로 옮기고 위에서 했던 대로 전자 서명 방식을 적용한다.

-> 옮겨진 개인키들의 기본 권한이 664인데, 600으로 조정하지 않으면 전자 서명 방식이 작동하지 않는다.


8교시

 

 

우분투를 새로 추가했으니, 이전에 했던 실습을 그대로 해보자.

 

1. Nginx 설치, 삭제

-> 우분투에서는 yum 대신 apt 모듈을 사용한다.

-> 우분투에서는 epel-release를 설치할 필요가 없다.

 

2. timezone 설정

-> 처음 hosts를 all로 설정할 수도 있지만, CentOS와 Ubuntu만 선택할 경우에는

hosts: CentOS:Ubuntu

로 작성하면 된다.

 

3. nfs 설정

-> 동일하다. hosts: CentOS: Ubuntu 이렇게 빈칸 띄우면 에러가 나는데, 이걸 몰라서 헤매었다.

 

 

 

이번에는 Windows 노드. 시간 관계상 다른 노드들은 사용하지 않고 Windows 노드와 CentOS 서버만 사용.

Windows 노드 1개, 서버용 CentOS 서버 1개를 vagrant up 해놓고 수업 끝.


1교시(09:30~10:20) vagrant에서의 접속(개인키, 공개키 등)

2교시(10:30~10:40)

 

좀 걱정이다. 매번 vagrant up 하고 destroy 할 때마다 시간이 너무 오래 걸린다.

댓글