오픈 소스 IT 자동화 도구로 사용자가 수작업으로 진행하던 프로비저닝, 환경 설정, 애플리케이션 배포 등의 IT 업무를 코드 기반으로 작성하여 여러 환경에 동일하게 적용할 수 있도록 돕는 역할을 수행
No Agent(Agentless)
예전에 많이 사용하던 Puppet이나 Chef는 자동화 관리 대상 서버에 별도의 에이전트를 설치하고 이를 통해 자동화 업무를 수행했는데, 이러한 데몬 형식의 에이전트에 기반한 자동화 도구는 관리를 위한 복잡한 추가 작업이나 운영체제 버전에 따라 추가 패키지나 모듈을 설치하는 등의 작업이 발생한다.
반면, Ansible은 별도의 Agent 설치 없이 SSH로 접속해서 Python Code를 수행한다.
Idempotent(멱등성)
멱등성 : 동일한 연산 또는 작업을 여러 번 수행하더라도 결과가 달라지지 않는 성질
Ansible을 통해 동일한 운영 작업을 여러 번 수행해도 동일한 결과를 만들어 낸다.
쉬운 사용법과 다양한 모듈 제공
자동화 단계는 에디터만 있으면 YAML 문법을 사용하여 쉽게 작성하고 읽을 수 있다. 파일 복사와 같은 일반 시스템 관리 모듈부터 다양한 환경의 퍼블릭 클라우드 관련 모듈 및 컬렉션까지 제공한다. 또한 playbook 샘플을 찾아보기 쉽다.
공식 깃허브 : https://github.com/ansible
공식 문서 : https://docs.ansible.com/ansible/latest/index.html
*Community Ansible과 Red Hat Ansible Automation Platform의 차이는 RDS 유형을 고를 때 Aurora Postgresql과 일반 Postgresql의 차이와 유사하다고 생각하면 된다.
오픈 소스 형태
레드햇 서브스크립션을 이용
# 확인
python --version
# >> Python 3.12.3
sudo apt update
apt install -y ansible
# 또는
yum install -y ansible
# 확인
ansible --version
mkdir /etc/ansible
cd /etc/ansible
자동화 대상 호스트 설정 작업
인벤토리 파일은 텍스트 파일이며 앤서블이 자동화 대상으로 하는 관리 호스트를 지정하기 위해 사용한다.
INI 형식(이름=값) 또는 YAML을 포함한 다양한 형식을 이용해서 작성 가능하다.
192.168.100.5
192.168.100.6
192.168.100.7
192.168.100.5 tnode1.exp.com
192.168.100.6 tnode2.exp.com
192.168.100.7 tnode3.exp.com
역할에 따른 호스트 그룹 설정
[webservers]
web1.example.com
web2.example.com
192.0.2.42
[db-server]
db01.example.com
db02.example.com
[web-servers]
web1.example.com
web2.example.com
192.0.2.42
[db-server]
db01.example.com
db02.example.com
[east-datacenter]
web1.example.com
db1.example.com
[west-datacenter]
web2.example.com
db2.example.com
[development]
192.0.2.42
[web-servers]
web1.example.com
web2.example.com
[db-servers]
wdb1.example.com
db2.example.com
[datacenter.children]
web-servers
db-servers
범위 가능[start:end]
[web-servers]
web[1:2].example.com
[defaults]
192.168.4.[0:255]
[dns]
[a:c].dns.example.com
[ipv6]
2001:db8::[a:f]
EC2의 경우
[컴퓨터이름] ansible_host=[IP(private IP도 가능)] ansible_user=[계정] ansible_ssh_private_key_file=[pem 파일 경로]
인벤토리 작성을 마쳤으면 인벤토리 파일의 내용을 확인해보자.
ansible-inventory -i 파일경로 --list

3-1. SSH 접속을 할 유저 생성하기(생략 가능)
# 유저 생성
sudo adduser [유저이름]
sudo passwd [유저이름]
# 권한 변경
sudo chmod u + w /etc/sudoers
sudo vi /etc/sudoers
# /etc/sudoers에 하단 내용 추가
유저이름 ALL=(ALL:ALL) ALL
# ssh 재시작
sudo service ssh(sshd) restart
이제 생성한 유저를 이용해서 ssh 접속이 가능하다.
하지만 ansible은 비밀번호 입력없이 ssh 접속이 가능해야 한다.

위처럼 ansible의 내장 모듈인 ping을 사용해서 관리 노드가 연결되었는지 확인하려고 하면 SSH 접속을 위한 키 또는 비밀번호가 제공되지 않았기 때문에 인증이 실패했다는 에러가 발생한다.
3-2. 제어노드의 키를 관리노드에 등록하기
# 접속하고자 하는 컴퓨터(제어노드)에서
ssh-keygen
ssh-copy-id [원격서버계정]@[원격서버IP]
ssh-copy-id [원격서버계정]@[원격서버IP]는 어떤 작업을 하는걸까?
ssh-keygen 명령을 통해 생성한 제어 노드의 공개 키(id_rsa.pub)를 읽어서 SSH로 <사용자>@<관리노드>에 접속한 후 그 공개 키를 관리 노드의 ~/.ssh/authorized_keys 파일에 추가하는 작업
=> 그 결과, 제어 노드에서 ssh <사용자>@<관리노드 IP>를 할 때 비밀번호를 입력하지 않고도 접속이 가능해진다.

제어 노드의 공개키를 관리 노드에 등록해줌으로써 제어노드가 관리노드에 비밀번호 없이 접속할 수 있게 되었다.
[EC2의 경우]
EC2의 경우 ssh 접속을 위해 EC2를 생성할 때 지정한 pem 파일이 필요하다. 하지만 pem 파일은 현재 호스트 컴퓨터만에 존재하므로 저장된 pem키를 해당 EC2로 전송해서 사용해야 한다.
sudo scp -i pem파일경로 전송할파일경로 계정@전송할EC2퍼블릭DNS:복사될경로위에서 수행한 ansible -m ping과 같이 ansible에서 제공하는 모듈을 사용하여 인벤토리가 정상적으로 생성되어 제어노드가 관리노드를 잘 관리할 수 있는지 확인해보자.
ansible 모듈 목록 : https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html#
host 접속 가능 여부 확인 : ansible all -m ping
메모리 확인 : ansible all -m shell -a "free -h"
파일 복사 : ansible 인벤토리이름 또는 all -m copy -a "src=복사할파일 dest=복사될경로"
패키지 설치 : ansible 인벤토리이름 또는 all -m apt -a "name=패키지이름 state=present" -b
YAML 포맷으로 작성하고 ansible-playbook 명령으로 실행한다.
# first-playbook.yml
---
- hosts: all
tasks:
- name: Print Message
debug:
msg: Hello Ansible World
문법 검사 : ansible-playbook --syntax-check 파일경로
실행 : ansible-playbook 파일경로
실행 점검: ansible-playbook --check 파일경로
실행 점검을 통해 관리 대상 호스트를 실제로 변경하지 않고 어떤 내용이 변경될지 미리 알 수 있다.
playbook을 통해 관리노드에 작업을 수행해보자.
# restart-service.yml
---
- hosts: itstudy
tasks:
- name: Restart sshd service
ansible.builtin.service:
name: ssh
state: restarted
ssh.service를 재시작하는 과정에서 연결이 끊겨 버렸기 때문에, 재시작이 실패한 것으로 간주되어 에러가 발생한다.
copy 모듈을 사용한다. src는 복사할 파일 경로dest는 복사될 디렉토리owner는 파일의 소유자mode는 파일의 권한- hosts: itstudy
tasks:
- name: copying file with playbook
copy:
src: ~/sample.txt
dest: /tmp
owner: ubuntu
mode: 0644
파일 다운로드
get_url 모듈을 사용한다.url에 다운로드 받을 url을 설정dest에 다운로드 경로를 설정파일 관련 명령
file 모듈을 사용한다.path에 생성할 파일이나 디렉토리를 설정state에 종류를 설정mode에 파일의 접근 권한을 설정become 과 become_user 는 ansible에서 권한을 변경하고자 할 때 사용하는 속성으로 파일 관련 명령과 자주 쓰인다.ex sudo 명령을 사용하고자 하는 경우 become과 become_user를 사용