클라우드 아카이브

[IaC/앤서블] 앤서블 겔럭시를 이용한 서버 패스워드 변경 자동화(1) 본문

Cloud Native Solution/[IaC] ansible

[IaC/앤서블] 앤서블 겔럭시를 이용한 서버 패스워드 변경 자동화(1)

Cloud Engineer 2021. 8. 22. 16:29
반응형

앤서블 공식 이미지 (출처 : https://commons.wikimedia.org/wiki/File:Ansible_logo.svg)

Ansible

  • 코드로서의 인프라 (Infrastructure as Code)를 가능하게 하는 오픈소스 기반 SW 프로비저닝, 구성 관리, 애플리케이션 배포 도구
  • Hashicorp에서 제공하는 오픈소스 기반 IaC 도구이며, 아래와 같은 기능을 제공

Ansible 기능

  • SW 프로버저닝
  • 구성 관리
  • 애플리케이션 배포

2개 기능에 작대기 표 표시를 해둔 이유는 물론 Ansible에서 해당 기능을 제공하지만, 보통 인프라 자동화를 구성할 때 아래와 같은 도구가 더 적합하기 때문입니다.

SW 프로비저닝

  • 온프레미스 : Vagrant
  • 클라우드 : Terraform, AWS CloudFormation애플리케이션 배포 (CI/CD)
    • Jenkins, AWS CodeDeploy, Argo CD 등

Ansible의 기본적인 개념과 기능에 대해 알아봤으니 이제부터 해당 도구를 사용하여 패스워드 변경을 코드로 자동화를 해보겠습니다.

목적

본 포스팅에서는 Docker-compose를 이용한 테스트용 시스템을 구성하고, 해당 시스템에 SSH 통신 환경을 만들 것입니다. 이후 bastion에 ansible을 설치할 것입니다. 다음 포스팅에서는 Role을 기반으로 특정 호스트(노드)에 패스워드 변경을 위한 구성 작업을 코드로 자동화할 것입니다.

유의사항

  • Ansible과 Ansible Galaxy의 개념과 작동 원리를 이해하고 있다는 가정하에 해당 작업을 진행할 예정입니다. 다만, 본 목적을 이루는데 도움을 주는 Ansible의 기본 특성에 대해 간략하게 다루겠습니다.
  • Ansible 도큐먼트를 기반으로 구성관리 코드를 작성할 것입니다.

시스템 구성

작업 환경 구성

Docker Compose를 사용하여 작업 노드를 생성하겠습니다. 3개 노드 중 1개 노드는 bastion 역할을, 나머지 2개 노드는 일반 서버 역할을 수행하며, 해당 노드를 기반으로 SSH 및 Ansible 작업 환경을 구성하겠습니다.

코드

# docker-compose.yml
version: '3.0'
services:
    bastion:
        image: centos:7
        ports:
            - target: 10000
              published: 22
              protocol: tcp
              mode: host        # host | ingress
        privileged: true        # 시스템의 모든 기능과 커널의 대부분의 기능 사용 가능
        command: /usr/sbin/init         # init 프로세스의 pid가 1이 되도록 설정 (systemctl 사용 목적)
        stdin_open: true
        tty: true
    centos1:
        image: centos:7
        expose:
            - "22"
        privileged: true
        command: /usr/sbin/init
        stdin_open: true
        tty: true
    centos2:
        image: centos:7
        expose:
            - "22"
        privileged: true
        command: /usr/sbin/init
        stdin_open: true
        tty: true
expose와 ports의 차이

expose는 호스트 내부 통신을, ports는 외부와의 통신을 목적으로 포트 open
expose : 호스트 내부에서 연결된 컨테이너들에게 포트 open
ports : 외부(다른 호스트)에서 해당 컨테이너에게 접근할 수 있도록 포트 open

출처 : Docker 공식 레퍼런스

 

Centos 노드 구성 및 확인

# 1. 컨테이너 실행
$ docker-compose up -d
Starting ansible-lab_bastion_1 ... done
Starting ansible-lab_centos1_1 ... done
Starting ansible-lab_centos2_1 ... done

# 2. 구성된 컨테이너의 네트워크 드라이버가 브리지 방식으로 되었는지 확인
$ docker network ls
NETWORK ID     NAME                  DRIVER    SCOPE
15698efd9138   ansible-lab_default   bridge    local

# 컨테이너가 정상적으로 실행됬는지 확인
$ docker ps
CONTAINER ID   IMAGE      COMMAND            CREATED         STATUS         PORTS                                     NAMES
58c121a0533c   centos:7   "/usr/sbin/init"   5 minutes ago   Up 5 minutes   0.0.0.0:22->10000/tcp, :::22->10000/tcp   ansible-lab_bastion_1
b3460090ca8c   centos:7   "/usr/sbin/init"   5 minutes ago   Up 5 minutes   22/tcp                                    ansible-lab_centos2_1
7edb2708b166   centos:7   "/usr/sbin/init"   5 minutes ago   Up 5 minutes   22/tcp                                    ansible-lab_centos1_1

centos 노드에 SSH 환경 구성

# centos 노드에 bash 쉘로 터미널 연결
$ docker exec -it ansible-lab_centos_1_1 /bin/bash

# ssh 서버 설치 및 22 포트 open
[root@7edb2708b166 /]# yum install -y openssh-server
[root@7edb2708b166 /]# vi /etc/ssh/sshd_config    # "# port 22"를 "port 22"로 바꿔주기

# ssh 접속에 사용할 유저 생성 및 패스워드 설정
[root@7edb2708b166 /]# useradd node
[root@7edb2708b166 /]# passwd node

bastion 노드에 SSH 환경 & Ansible 구성

# bastion 노드에 bash 쉘로 터미널 연결
$ docker exec -it ansible-lab_bastion_1 /bin/bash

# 네트워크 유틸리티 및 openssh 설치
[root@58c121a0533c /]# yum install -y net-tools
[root@58c121a0533c /]# yum install -y openssh-server openssh-clients

# 퍼블릭/프라이빗 키 생성 & centos 노드에 퍼블릭키 배포
[root@58c121a0533c /]# ssh-keygen
[root@58c121a0533c /]# ssh-copy-id node@172.18.0.4
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '172.18.0.4 (172.18.0.4)' can't be established.
ECDSA key fingerprint is SHA256:hem6FAsY6Im6G4MmLGVXXVAsOJ0VaibdpxOU8jH9N4w.
ECDSA key fingerprint is MD5:90:45:11:99:93:b2:bb:2d:67:d4:3b:71:8c:d5:48:f9.
Are you sure you want to continue connecting (yes/no)? yes
/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
node@172.18.0.4's password: 

Number of key(s) added: 1

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

[root@58c121a0533c /]# ssh node@172.18.0.4
[node@b3460090ca8c ~]$ exit
logout
Connection to 172.18.0.4 closed.
[root@58c121a0533c /]#

# Ansible 설치 및 작업 대상인 호스트 구성
[root@58c121a0533c /]# yum install -y epel-release ansible
[root@117ab98fd1a4 ~]# vi /etc/ansible/hosts

# hosts 파일에 아래 내용 추가
[node]
172.18.0.3        # 1번 노드
172.18.0.4        # 2번 노드

# 작업 디렉토리 생성
[root@117ab98fd1a4 ~]# mkdir workspace
[root@117ab98fd1a4 ~]# cd workspace
[root@117ab98fd1a4 workspace]# mkdir roles
[root@117ab98fd1a4 workspace]# cd roles

# role 생성
[root@117ab98fd1a4 roles]# ansible-galaxy init change_password
- change_password was created successfully
[root@117ab98fd1a4 ~] cd change_password

# role을 구성하는 디렉토리 확인
[root@117ab98fd1a4 change_password]# ls
README.md  defaults  files  handlers  meta  tasks  templates  tests  vars

컨테이너를 브리지 방식으로 구성한 이유는 포트를 이용한 외부와의 통신을 비롯하여 내부 컨테이너 간 SSH 연결을 허용해야되기 때문입니다. 자세한건 '컨테이너 네트워크 방식'을 참조하면 좋을 것 같습니다.

 

이상으로 시스템 및 ansible 작업 환경 구성이 끝났습니다.
다음 포스팅에서는 Ansible 공식 도큐먼트를 기반으로 패스워드 변경을 코드로 자동화하는 작업을 시작하겠습니다.

Comments