본문 바로가기
교육

[39일 차] 21.09.13 : Ansible 3(전자 서명 자동 구축, 동적 구성)

by ballena 2021. 9. 13.

1교시

 

 

모듈에 대해서는 https://docs.ansible.com/에서 찾아보자.

 

vagrant up을 실행 시 vagrant VBoxManage.exe 에러가 발생했다면 작업 관리자에서 Virtualbox headless frontend를 종료시킨 후 재실행해보자.

 

Windows는 원격 접속 시 WinRM이라는 프로세스로 진행한다. SSH가 없다는 뜻.

ansible-server에서 ans windows -m ping -k로 접속도 안된다. Windows 노드와의 통신을 위해서는 WindRM 설치가 권장된다.

앤서블 서버와 노드의 통신을 위해서는 

1. 프로토콜

2. 프로토콜이 사용하는 포트

3. 사용자

의 3가지 조건이 필요하다(교재 p. 186 ~ 198).

그래서 3 조건을 생각하면

1. 프로토콜 = WindRM

2. 프로토콜이 사용하는 포트 = 5985

3. 사용자 = vagrant

 

ansible_env_ready.yml 파일을 수정한다.

먼저 Windows 노드의 주소에 위 1, 2, 3번을 작성해준다.

Windows 주소에 조건들 명시

그리고 Windows를 위한 패키지 설치와, (CentOS에서는 안 썼지만) 인증을 위한 sshpass를 설치한다.

Windows를 위한 추가 작성

다시 vagrant ssh ansible-server로 들어가서 ans Windows -m win_ping -k로 접속. 

성공

이후에 Windows로 nginx 설치, nfs 설정 등 이전에 했던 것을 똑같이 해보자.

여기서 chocolatey라는 모듈을 사용하는데, 기억해 놓는 것이 좋을 것이라고 한다.

 

NFS는 따로 해보자. 뒤쳐졌다.


2교시

 

 

교재 5장은 넘어간다.

플레이북의 동적 활용에 대해 배운다.

이전 환경 지우고 다시 구축

 

인프라 구축 시 각 파일이 무슨 역할을 하는지 기억할 것.

 

bash_ssh_conf_4_CentOS.sh

-> 전자 서명 방식일 때는 안썼지만, 이번에는 교재대로 암호 방식을 사용할 것이다.

-> /etc/ssh/sshd_config 파일에서 패스워드 인증 방식 여부를 묻는 PasswordAuthentication의 값을 no에서 yes로 바꾸는 sh 파일.

 

add_ssh_auth.sh

-> 여기에서 자동으로 ssh 키를 등록하던 것을 ansible_env_ready.yml 파일에서

이 부분으로 대체하는 것이다. 그래서 add_ssh_auth 파일은 사용하지 않는다.

 

VM 11개 생성하려니 어질어질하다.


3교시

 

 

기껏 11개 VM 만들었더니 7개만 만들어도 상관없다고 하신다. 끼에에엑

매번 인프라 생성 시마다 시간을 너무 버리는 게 아닌가 싶다.

 

노드의 수만큼 위에서 했던 ssh-keyscan을 해주기엔 번거롭다. /.ssh/known_hosts에 자동으로 등록해보자.

auto_pass.yml

hosts(nodes)들의 정보를 local에서 읽어 들여서 tasks가 서버(local)에서 진행된다.

serial: 1

-> 실행되는 tasks(known_hosts 생성)을 한 개씩 진행하라는 의미.

 

Vagranfile의 Ansible-server에 추가

-> auto_pass.yml을 만들고, 위 구문을 Vagranfile에 추가한 후 ansible_env_ready.yml 파일에 있던 ssh-keyscan 구문들을 삭제한다.

-> 이제 ansible_env_ready.yml 파일에 하나하나 작성할 필요 없다.

 

 

매번 ansible-server에서 다른 노드에 접속할 때, ssh 암호 입력을 위해 마지막에 -k를 사용했다.

그런데 vagrant에서 ansible-server로 접속할 때에는 -k를 안 썼었는데?

-> ansible-server에 있는 .ssh/authorized_keys 파일을 사용한 것이다.

-> 베이그란트를 통해 설치 시에 authorized_keys를 입력해 둔 것.

 

그럼 이제 ansible-server에서 노드들로 접속하기 위한 authorized_keys를 각 노드에 생성해보자.

1. 앤서블 노드에 접속 시도

2. 앤서블 노드의 ~/.ssh/authorized_keys 파일의 존재를 확인하고, 이 파일 안에 공개 키 정보가 존재하는지 확인

3. 개인 키로 authorized_keys에 있는 공개 키를 풀어서 접속

 

 

이제는 전자 서명 방식으로 실행해 보자.

서버에서 만든 개인 키와 연관이 있는 공개 키가 각 노드에 파일로 만들어지는 것이다.

 

교재 p. 345의 코드를 auto_pass.yml에 추가하고, vagrant provision 후 다시 ansible-server에 접속

-> authorized_keys 생성 시 fatal/FAILED가 다수 발생하는데, 'serial: 1' 옵션의 제약으로 발생하는 것이다.

-> 이런 에러가 발생해도 계속 작업을 진행할 수 있도록 'ignore_errors' 옵션 추가

-> 서버에서 ans all -m ping 실행(-k 없이)

-> 성공

 

개인 키와 공개 키

-> 개인 키를 열쇠, 공개 키를 자물쇠로 이해하면 된다.

-> 생성된 자물쇠를 열 수 있는 열쇠가 있다면 접속을 허용

-> 서버에서 생성된 공개 키를 노드의 authorized_keys로 전송하고, 서버가 이미 가지고 있는 개인 키로 노드에 접속해서 자물쇠(공개 키)를 풀어서 접속


4교시

 

 

아키텍처를 이해해야 지금 하는 것이 무엇인지 이해할 수 있다.

 

1. Vagrant 기준

베이그란트라는 큰 틀 안에서 인프라(서버와 노드)를 배포. 각 장비의 개인키와 공개키를 생성하고, 개인 키는 가지고 있고 공개 키를 각 장비의 authorized_key에 전송

-> 이건 Vagrant 기준

 

2. Ansible 기준

여기서는 베이그란트 환경이 아니라서 개인 키와 공개 키는 없다. 그래서 서버에서 노드로 들어가려면?

-> 서버가 노드로 ssh 원격 접속

-> 각 노드가 개인 키와 공개 키를 생성

-> 서버에는 각 장비의 개인 키가 있어야 한다.

-> 각 장비에서 생성한 개인 키를 서버로 전송할 수도 있고

-> 서버에서 개인 키와 공개 키를 만들고, 접속할 사용자 계정으로 공개 키를 전송(이게 정석)해서 각 장비의 authorized_keys에 등록

 

Vagrant 환경은 일시적으로 쓰는 것일 뿐이다. Ansible 기준으로 생각할 것.

 

ssh 패키지를 설치하면 노드별로 공개 키는 생성되긴 한다. 하지만 여기서는 그걸 사용하지 않는다.

auto_pass.yml의 역할은 노드별로 개인키와 공개키를 만들고, 만든 공개 키 정보를 keyscan이라는 변수에 넣고, keyscan.stdout_lines라는 공개 키 값을 뽑아내서 각 노드의 ~/.ssh/known_hosts에 추가하는 것이다(""{{ item }}").

 

============================================

ssh 원격 접속은 인증 방식과 암호화 방식으로 나누어지는 것이다.

ssh는 기본적으로 클라이언트와 서버의 안전한 통신을 위한 것이다. 

1. 인증

-> 패스워드 인증 : known_hosts 파일에 서버에서 받은 핫 키(hosts_key)를 저장

-> 전사 서명 인증 : 클라이언트가 개인키/공개키를 만들고, 송신 측의 공개 키를 저장하기 위해 사용하는 파일이 authorized_keys 파일

2. 암호화

============================================

우리가 언제까지나 Vagrant 환경을 쓰지는 않을 테니 전자서명 방식으로 이용하자는 것이 교재의 설명.

 

 

교재 352 페이지까지의 내용이 전자 서명 방식으로의 전환 내용이다.

 

-k 옵션 없이 ping이 작동하는 것이 확인되었다면, 이제 Vagranfile에서 bash_ssh_conf_4_CentOS.sh는 필요 없다.

 

교재 341 ~ 343 페이지의 변수 부분은 반드시 기억할 것.

 

 

이러나저러나 Ansible에서의 SSH의 구동 과정을 이해하는 것이 최우선이다.


5교시

 

 

플레이북의 동적 구성

-> 애초에 앤서블은 자동으로 구성하려고 사용하는 것이다.

-> 실행 대상에 따라 다른 수행이 가능하도록 해보자.

-> CentOS면 yum을 쓰고, Ubuntu면 apt를 사용하는 것처럼

 

gather_facts

-> facts란 무엇인가 : 앤서블 노드들에 대한 다양한 정보를 미리 정의해둔 변수(= 노드 쪽 정보)

-> 대상자(앤서블 서버와 노드들)에 대한 동적 변수다. 기본값은 yes

(앞에서 본 매직 변수는 실행자, 즉 앤서블 서버의 입장에서 동적 변수다)

시스템에서 $PATH 이렇게 쓰던 변수를 앤서블에서는 {{ ansible_host }} 이렇게 쓴다.

 

교재의 facts.yml로 facts 정보 값을 수집하는 예시를 볼 수 있다. facts 중 ansible_eth0의 ipv4의 address라는 정보를 가져오는 것을 볼 수 있다.

전체 facts를 뽑아오는 예시가 359페이지에 있는데, 앤서블의 setup 모듈로 뽑아올 수 있다.

 

ans nodes -m setup > facts.txt

-> 전체 nodes의 facts 값을 저장

 

노드별로 따로 저장하려면

-> ans nodes -m setup --tree /tmp/facts > /dev/null

 

 

 

when 조건

-> 노드의 특정 facts 정보에 따라 다른 task를 수행 : 동적 코드 작성

-> 운영체제에 따라 다른 모듈을 사용해야 할 경우 + 각 노드의 운영체제를 모를 경우

운영체제에 맞는 패키지 관리자를 사용한다거나?

-> 교재 364 페이지


6교시

 

 

아까 만들었던 각 노드의 facts 정보 텍스트 파일(ansible_node101~)을 보면

ansible_distribution에 노드가 사용하는 OS가, ansible_pkg_mgr에 해당 OS가 사용하는 패키지 관리자가 적혀 있다.

 

어쨌거나 nginx_install/remove_w_when.yml을 실행해 보면, 특정 OS에 작업하는 내용은 다른 OS를 사용하는 노드에 작업을 실행하지 않고 skipping으로 넘어간다. 하지만 이런 것이 뜨는 것마저 낭비다. 이 문구가 뜨지 않게 해 보자.

-> 메인 yml 파일 안에 다른 yml 파일을 include 해서 실행

-> include_tasks: CentOS.yml

-> include_tasks: Ubuntu.yml

 

github에서 앤서블 플레이북 관련 파일들을 보면 1개로 이루어져 있는 경우는 거의 없다.

-> 동적 구성을 위해 나누어져 있다

-> 플레이북의 재활용도 이런 맥락.

 

어쨌거나 이렇게 분리해도 skipping은 아직도 있다.

-> if 구문을 사용해서 skipping 하는 task를 없애 보자.

교재  383 ~ 384 페이지

-> vars라는 모듈로 변수를 선언(command의 register로 변수에 저장하는 방식도 사용할 수 있긴 하다)

-> skipping이 하나도 없다!

여기서 이전에 만들었던 CentOS.yml과 Ubuntu.yml을 또 사용했다

-> 재활용의 좋은 예시. Terraform에서는 이런 부분은 모듈이라고 한다.


7교시

 

 

790 페이지, 효율적으로 코드 구성하기

 

NFS 구성

-> 서버와 클라이언트 구성을 분할해서 다른 파일로 만든다.

 

ansible_env.SSH_CLIENT.split()[0]

-> ansible_env라는 변수(딕셔너리)에서, SSH_CLIENT 필드(키)의 0번째 요소

-> 공백으로 구분되는 여러 값들 중 첫 번째(0번째) 요소

 

line: "{{ ansible_user_dir }}/nfs_shared 172.30.1.0/24(rw,sync)"

-> 대역대를 동적으로 작성하려면?

-> 대역대가 기록되어 있는 필드를 작성

-> {{ ansible_eth0.ipv4.network }} 를 작성하면 된다.

 

 

넥서스 스위치 쪽은 네트워크 서버 구성 쪽이다(p. 397 ~ 6장 끝까지)

-> 우선순위 뒤로 밀어 두자


8교시(자습)

 

 

이제 7장. 플레이북의 재사용을 대략 이틀 정도 배울 예정.


1교시에 했던 Windows로 nginx, 시간 설정, nfs 구축 복습

2교시(10:30 ~ 11:00) 각 파일의 의미 설명 다시 듣기

4교시(12:50 ~ 13:15) ssh 설명 다시 듣기

 

어느 정도 진행하니 수업이 정체될 때 뒷부분을 미리 하기 좋다.

전체적인 복습으로, 진행했던 yml 코드들을 따로 작성해 보자.

댓글