일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 백업
- 인프라
- Role
- SHR
- 파일시스템
- 자동화
- 구성관리
- DATA 백업
- 유닉스
- 전체 백업
- backend storage
- hashicorp
- 통합 풀 백업
- 차분 백업
- secret engines
- auth methods
- VIRT
- key/value
- vault agent
- 앤서블
- SSH OTP
- 리눅스
- Secret Engine
- REST API
- 커널 파라미터
- 시스템
- kv
- IAC
- devops
- Vault
- Today
- Total
클라우드 아카이브
[IaC/앤서블] 앤서블 겔럭시를 이용한 서버 패스워드 변경 자동화(1) 본문
[IaC/앤서블] 앤서블 겔럭시를 이용한 서버 패스워드 변경 자동화(1)
Cloud Engineer 2021. 8. 22. 16:29
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 공식 도큐먼트를 기반으로 패스워드 변경을 코드로 자동화하는 작업을 시작하겠습니다.
'Cloud Native Solution > [IaC] ansible' 카테고리의 다른 글
[Ansible] 앤서블 겔럭시를 사용하여 유저/그룹 생성 및 삭제 (0) | 2021.11.03 |
---|---|
[IaC] Ansible Galaxy의 개념과 구성요소 (0) | 2021.10.22 |
[구성관리] Ansible(앤서블) 개념, 배경 그리고 활용 사례 정리 (0) | 2021.09.19 |
[IaC/앤서블] 앤서블 겔럭시를 이용한 서버 패스워드 변경 자동화(2) (0) | 2021.08.22 |
[OS] Windows/Linux/Unix 패스워드 바꾸기 (0) | 2021.08.22 |