본문 바로가기
Virtualization & Cloud/Network Automation

네트워크 자동화 (Network Automation) - (4)

by TwoJun 2024. 8. 11.
728x90
반응형

2024-08-08(THU)

 

 

※ 금일 예정

(1) Configuration Settings(환경 구성)

 

(2) Ad-hoc Mode

 

(3) Playbook

 

(4) Variable, Conditional & Iteration Statement

 

 

 

01. 전일 내용 - Ansible Automation

01-1. 환경 구성

(1) 처음 진행하는 경우 생각보다 오래 걸릴 수 있는 작업

 

(2) 서로 간 IP 주소 대역이 중복되지 않도록 주소를 할당해줘야 한다.

 

(3) 서버 가상화를 위한 환경을 미리 구성해 놓은 상태

 

 

 

01-2. Linux - CentOS 8 : Ansible 설치

(1) 관련 커맨드

- dnf -y install epel-release

- dnf -y install ansible

- ansible --version 

 

 

(2) dnf -y install epel-release

- /etc/yum.repo.d 내부에 repository 정보가 존재한다

- Repository 정보에는 리눅스가 오픈소스이기 때문에 배포 및 변경된 작업에 대한 업데이트 등 패키지 파일, 메타데이터, 및 서명 정보를 포함하여 소프트웨어의 설치, 업데이트, 관리에 필요한 모든 내용이 명시되어 있다.

 

- dnf : 패키지 관리 도구(Red Hat 계열의 리눅스 배포판에서 패키지를 설치, 업데이트, 제거하는 데 사용)

 

 

(3) dnf -y install ansible

 

- ansible이 설치된 위치 : /usr/bin/ansible 

 

 

 

01-3. Ansible 실행 환경

(1) /etc/ansible

- Ansible이 갖고 있는 기본적인 디렉터리

 

(2) /etc/hosts

- 상대방 장비에 대한 등록이 필요함(관리 노드들), 또는 내 장비에 대한 정보들이 포함된 파일

- IP 주소, 호스트명이 명시되어 있다.

 

(3) 리눅스 사용자들은 주로 업무를 위한 엔지니어 또는 관리자들이 주로 사용한다. 실질적으로 운영 환경에서 GUI는 사용되지 않으며 필요한 프로그램들만 운영체제에 올리고 GUI보다 더 가벼운 환경인 CLI 환경에서 커맨드를 통해 운영 및 유지보수가 이루어진다.

 

 

 

 

 

 

1. sudo (superuser do), 인벤토리 확인

(1) sudo

- 해당 명령어는 리눅스 및 유닉스 계열 운영 체제에서 슈퍼유저 권한(root user)을 일시적으로 부여하는 커맨드이다.

 

- # : root user의 권한을 갖고 있는 상태

 

 

(2) Fedora 환경에서  Ansible 설치

sudo dnf install ansible

 

 

(3) Ubuntu 환경에서 Ansible 설치

sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes -update ppa:ansible/ansible
sudo apt install ansible

 

 

 

 

 

01-1. 인벤토리를 통한 자동화 대상 호스트 설정

 

(1) 인벤토리를 통해 앤서블이 자동화 대상으로 하는 관리 노드(호스트)를 지정하게 된다.

- /root/my-ansible

 

 

(2) 인벤토리 내용을 위와 같이 수정한다.

 

 

 

(3) ansible-inventory -i ./inventory --list

- 해당 커맨드로 인벤토리의 정보를 JSON 값으로 확인 가능하다.

 

 

(4) 트리 형태로 인벤토리 정보를 조회할 수 있다.

 

 

(5) tree 명령으로 작업 중인 디렉터리 경로를 트리 구조로 보여준다.

 

 

 

 

01-2. ansible.cfg : Ansible의 설정 파일로, Ansible의 동작 방식을 조정하는 다양한 설정을 포함한다.

 

 

 

(1) gedit 명령으로 ansible.cfg 파일의 내용을 작성한다.

 

(2) ansible-inventory --list 커맨드로 동일하게 JSON 형태로 내용을 확인할 수 있지만 ansible.cfg 설정 파일이 존재하면 -i 옵션을 주지 않아도 설정 파일에 정의된 인베토리의 호스트 정보를 조회할 수 있다.

 

 

 

 

 

 

2. Playbook 작성하기

2-1. playbook configuration settings

(1) 플레이북을 사용하기 위해서 루트 권한으로 실행할 것인지, 호스트 접근 시 SSH 키를 사용할 것인지, 패스워드를 사용할 것인지에 대한 환경설정을 진행해 주어야 한다.

 

 

 

 

2-2. 환경 설정 파일 : default section

 

 

 

- cat 명령으로 정상적으로 명시했는지 재확인

 

 

(1) ansible.cfg 파일은 키, 값 형태로 구성되어 있다.

 

(2) default

- ansible 작업을 위한 기본값을 설정하는 영역

 

(3) inventory

- 인벤토리 파일의 경로를 지정

 

(4) remote user

- 앤서블이 관리 노드에 연결할 때 사용하는 사용자 이름을 지정한다. 만약 지정하지 않으면 현재 사용자 이름으로 지정된다.

 

(5) ask_pass

- SSH 암호를 묻는 메시지 표시 여부를 지정한다.

 

 

 

 

2-3. privilege_escalation 

(1) 보안 및 감사 정책으로 인해 앤서블을 원격 호스트에 권한이 없는 사용자로 연결한 후 관리 액세스 권한을 escalation 하여 루트 사용자로 가져와야 하는 상황도 있다. 해당 경우는 privilege_escalation 에서 설정한다.

 

(2) become

 

(3) become_method

 

(4) become_user

 

(5) become_ask_pass

 

 

 

 

2-4. 앤서블 접근을 위한  SSH 인증 구성

(1) 앤서블은 로컬 사용자에게 ssh 키가 있거나 관리 호스트에서 원격 사용자임을 인증 가능한 키가 구성된 경우 자동으로 로그인이 가능하다.

 

(2) ssh 키 기반의 인증을 구성할 때는 ssh-keygen 커맨드를 통해 생성한다.

 

 

 

(3) ssh-keygen 커맨드를 통해 SSH 키를 생성한다.

 

 

 

(3) ssh-copy-id 커맨드로 생성된 키를 제어 노드로 복사한다.

 

 

 

(4) gedit 명령으로 ansible.cfg를 열어서 위와 같이 수정하고 cat 명령으로도 반영된 부분을 확인한다.

 

 

 

(5) ubuntu는 기본적으로 루트 계정에 대한 로그인 접속을 제한하고 있다. 따라서 ROOT 계정으로 접속할 수 없는 상태이므로 ubuntu 환경에 직접 접속해서 su - root를 통해 루트 계정의 비밀번호를 설정하고 로그인을 진행한다.

 

 

(6) 작업 진행 도중 root 계정으로는 ubuntu 환경에 접속이 어려워서 defaults 영역의 remote_user 필드를 root로 수정했다.

우분투에서 sudo 명령이 먹지 않는 문제가 있어서 root로 수정이 필요했다.

 

 

 

 

 

 

2-5. 첫 번째 플레이북 작성

(1) /root/my-ansible 경로에서 gedit first-playbook.yml 커맨드를 줘서 위와 같이 플레이북을 작성한다.

 

- 모든 인벤토리 내에 존재하는 호스트에게 Print message라는 부분을 수행하도록 스크립트를 작성한 것.

 

 

 

(2) ansible-playbook --syntax-check 플레이북 이름.yml

- 해당 명령으로 작성한 플레이북의 문법 오류를 체크한다.(YAML의 들여쓰기 문법이 엄격히 지켜져야 하는 yml 언어의 특성상 체크해 주는 것이 좋다.)

 

 

 

(3) ansible-playbook [플레이북.yml]

- 해당 명령을 통해 플레이북이 실행되는 과정을 볼 수 있다.

 

 

 

 

2-6. 플레이북 실행 점검

(1) -- check 옵션 사용

- 플레이북 실행 전, 플레이북이 제대로 실행되는지 확인하고 싶다면 위의 옵션을 적용해 본다.

- 해당 명령으로 플레이북의 실행 상태를 미리 점검해 볼 수 있다.

(1) -- check 옵션 사용

 

(2) sshd 서비스를 재시작하는 restart-service.yml 파일을 작성

 

(3) state : 서비스를 어떻게 수행할 건지에 대한 여부

 

(4) --check 옵션을 사용하면 앞으로 어떤 작업이 수행될 것인지만 보여주고 실제 관리 노드에는 영향을 주지 않는다.

 

 

 

(5) 실제로 플레이북을 실행시키면 문법에 문제가 없으므로 위와 같이 tnode1의 sshd 프로세스가 죽고 재실행된다. 

 

 

 

 

 

 

 

3. 변수와 팩트(Variable & Fact) 

(1) 동일한 코드 구문에 입력되는 값에 따라 (동적으로) 동작을 변경해서 반복적인 작업이 가능하도록 설계하기 위해 앤서블 플레이북에서도 변수를 정의하고 사용할 수 있다.

 

(1) 변수 정의 영역에 따라 그룹 변수, 호스트 변수, 플레이 변수, 추가 변수, 작업 변수로 분류된다.

 

 

 

 

3-1. 그룹 변수(Group Variable)

(1) 인벤토리에 정의된 호스트 그룹에 적용하는 변수를 말한다.

 

(2) 리눅스에서 유저를 생성하면 어디에 생성될까? : /home 디렉터리 하위에 유저 이름으로 된 디렉터리가 생성된다.

 

 

 (3) all이라는 그룹에서 user 변수를 사용하기 위해 inventory 영역에 표시된 구문을 추가한다.

 

 

(4) Ansible에서 사용자를 생성하기 위해서는 ansible.builtin.user라는 모듈을 사용한다.

 

(5) 인벤토리에서 선언된 user라는 변수를 겹중괄호 사이에 두면 해당 변수를 플레이북에서 사용할 수 있다.

 

(6) state : present의 경우 간단히 말하면 새로운 것을 생성한다는 의미이지만, 엄밀히 정의하면 새로운 리소스가 존재하도록 설정하는 것을 의미한다.

 

 

(7) 작성한 플레이북을 실행시킨다.

 

 

 

(8) user 변수명이 ansible이므로 유저 네임이 ansible인 계정이 생성되었다.

 

(9) (8)번 과정에서 계정이 생성된 것까지 확인하고, home 경로에서 tail /etc/passwd를 수행했을 때 ansible:x:1001:1001::/home/ansible:/bin/bash라는 문구가 보이면 성공이다.

 

 

 

 

3-2. 호스트 변수(Host Variable)

(1) 호스트 변수는 해당 호스트에서만 사용할 수 있는 변수다.

 

(2) 호스트 변수는 그룹 변수에 비해 우선순위가 높다.

 

- 실습 진행

 

 

(1) 호스트 변수를 쓰기 위해 db 그룹에 있던 tnode3를 또 다른 그룹으로 분리하고 호스트 변수를 선언한다.

 

 

(2) 새로운 터미널을 열고 create-user.yml의 내용을 새로운 create-user1.yml 파일로 복사한다.

 

 

(3) db 그룹에 있는 호스트만 플레이북을 적용시키기 위해 hosts 영역을 위와 같이 수정한다.

 

 

(4) yml 내용을 저장하고 플레이북을 실행시킨다.

 

 

 

 

 

3-3. 플레이 변수(Play Variable)

(1) 플레이북 내에서 선언되는 변수를 말한다.

 

(2) 그룹 변수, 호스트 변수보다 플레이 변수의 우선순위가 높다.

 

(3) cp 커맨드를 통해 create-user1.yml의 내용을 복사해서 새로운 create-user3.yml을 생성하고 모든 호스트에 플레이북 스크립트를 수행하기 위해 hosts를 all로 변경한다.

 

 

(4) 플레이북 내용을 저장하고 스크립트를 실행시킨다.

 

 

(5) 확인 결과 ansible2 계정 정보가 생성된 것을 확인할 수 있다.

 

 

 

 

3-4. 플레이 변수 -  추가 실습

(1) 우선 /root/my-ansible 경로에서 mkdir vars로 새로운 디렉터리를 생성한다.

(2) vars로 접근해서 gedit ./vars/users.yml 커맨드로 users.yml을 생성하고 위와 같이 변수명을 명시한다.

 

 

 

 

 

 

 

 

 

 

3-5. 추가 변수

(1) 추가 변수는 외부에서 ansible-playbook 커맨드 실행 시 파라미터로 넘겨주는 변수를 의미한다.

 

(2) 추가 변수는 앞서 설명된 변수들 중 우선순위가 가장 높다.

 

 

(3) -e 옵션값 : --extra_vars의 약어로 추가 변수를 할당한다는 의미이다.

 

 

 

(4) 계정 정보가 생성된 것을 확인할 수 있다.

 

 

 

 

3-6. 작업 변수

(1) 작업 변수는 플레이북 Task의 수행 결과를 저장한 변수를 의미한다.

 

(2) 특정 작업 수행 후 그 결과를 후속 작업에서 사용하고자 할 때 사용된다.

 

(3) register: result 문구 추가(register: 변수명)

- register 선언 시 Task를 실행한 결과를 register 다음에 나오는 result라는 변수에 저장한다는 의미를 갖는다.

 

 

 

(1) 해당 파일에 register: result 구문을 추가한다. register 선언 시 태스크 실행 결과를  register 다음에 나오는 result라는 변수에 저장한다는 의미를 갖고 있다. result라는 변수에 저장된 결과를 디버그 모듈을 통해 출력하게 된다.

 

 

 

 

(2) 계정 정보가 생성된 것을 확인할 수 있다.

 

 

 

 

3-7. 변수들의 우선순위

- 지금까지 나열한 변수들의 우선순위는 다음과 같다.

 

(1) 추가 변수 → (2) 플레이 변수 → (3) 호스트 변수 → (4) 그룹 변수

 

 

 

 

 

 

 

4. Reference

(1) Ansible로 시작하는 인프라 자동화(Infrastructure Automation)

https://www.hanbit.co.kr/store/books/look.php?p_code=B2465301723

 

앤서블로 시작하는 인프라 자동화

“효율적인 IT 자동화를 위한 도구, 앤서블”

www.hanbit.co.kr

※ 해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.

개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있으며, 이에 대해 댓글로 알려주시면 감사하겠습니다!

728x90
반응형

댓글