이번 포스트는 EC2에 엔서블을 설치하고 앤서블 매니지드 노드에 ssh 설정하는 작업
구성환경
앤서블은 파이썬 환경에서 동작하며 컨트롤러 서버에서는 파이썬을 설치해야함
설치 되지 않았다면 아래와 같이 설치
sudo apt update -y
sudo apt install -y python3
sudo apt install -y pip
python3 -m pip install --user ansible
앤서블은 인벤토리라는 개념을 통해 명령어를 전달, 실행할 대상을 설정합니다. 하지만 클라우드 환경의 경우, 인스턴스가 반려동물이 아니라 가축으로 구성되기 때문에 언제든지 그 대상의 구성이 바뀔 수 있습니다. 따라서 특정 조건에 맞는 대상을 찾고, 해당 대상들로 인벤토리를 구성해야 합니다. 앤서블은 이를 위해 동적 인벤토리(dynamic inventory) 기능을 제공합니다.
출처 : https://always-kimkim.tistory.com/entry/ansible-dynamic-inventory-on-aws-ec2
AWS EC2 환경에서 태그 기반으로 동적 인벤토리를 구성할 수 있도록 AWS 플러그인 설치
우선 동적 인벤토리를 구성 하고 EC2의 상태를 조회 하기위해 controller 서버는 IAM 권한이 필요하며, IAM 에서 AmazonEC2FullAccess 권한을 포함하는 역할을 생성하여 controller 서버에 적용
controller 서버에서 아래 명령어로 AWS 플러그인(ansible-galaxy) 설치
ansible-galaxy collection install amazon.aws
mkdir ansible_demo
cd ansible_demo
ssh-keygen -C "ansible ssh key" -q -f ./ansible_key -t rsa -b 2048 -N ""
위 명령어를 실행할 경우 개인키와 공개키 쌍이 생성되며, 추후에 앤서블을 사용하여 managed 노드(EC2) 생성시 지정한 키페어가 아닌 해당 공개키로 접속 가능
Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0
--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
#cloud-config
cloud_final_modules:
- [users-groups, once]
users:
- name: ansible
groups: [ sudo, adm ]
sudo: [ "ALL=(ALL) NOPASSWD:ALL" ]
shell: /bin/bash
ssh_authorized_keys:
- [ansible_key.pub파일 내용]
plugin: aws_ec2
filters:
instance-state-name: running
keyed_groups:
# tag_Name_Value 형식의 그룹을 생성
- prefix: tag
key: tags
[defaults]
inventory = /home/ubuntu/ansible_demo/target_aws_ec2.yaml
remote_user = ansible
private_key_file = /home/ubuntu/ansible_demo/ansible_key
host_key_checking = False
ansible-inventory --graph
ansible all -m ping
---
- name: user module demo
hosts: tag_Name_managed #매니지드 노드 EC2의 네임태그 지정, EC2 이름을 managed로 설정하여 tag_Name_managed
become: true
tasks:
- name: Create a new user
ansible.builtin.user:
name: test #매니지드 노드에서 사용할 사용자
password: "{{ '1234qwer' | password_hash('sha512') }}" #매니지드 노드에서 사용할 사용자 암호
groups:
- adm
- sudo
state: "present"
shell: "/bin/bash"
system: false
create_home: true
home: "/home/fast"
comment: "Ansible demo user"
- name: Enable SSH password authentication
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config
regexp: '^PasswordAuthentication'
line: PasswordAuthentication yes
- name: Restart sshd service
ansible.builtin.service:
name: sshd
state: restarted
ansible-playbook user_mgmt.yaml
ssh test@[호스트 IP 및 도메인]