And Brain said,
Ansible, 내가 나를 지배한다 (IT Automation) - 개요 본문
Ansible
Ansible은 agentless로 별도의 agent 설치가 필요없이 동작하는 IT 자동화 도구로, 주로 서버 구성 관리, 애플리케이션 배포, 네트워크 장비 설정 및 일련의 IT 태스크 자동화에 사용됩니다.
일단 서로 다른 노드 4개 정도가 필요합니다. 하나는 Controller가 될 것이고, 나머지 세 개는 Target이 될 것입니다. VirtualBox 같은 가상머신을 사용하여 가볍게 진행해보시길 바랍니다.
먼저, Ansible을 설치하셔야 합니다. Ansible은 Controller에만 설치되면 됩니다.(Cent OS를 기준으로 하지만, Ubuntu 라고 크게 다를 것은 없습니다.)
yum install ansible -y
설치가 끝나셨다면, 아래 명령어를 통해 각각의 ping 을 날려주겠다고 한 번 입력해줍니다. Ansible은 ssh 통신을 하기에 -k 옵션을 넣어주어 비밀번호를 입력해야하지만, 일단은 -k 옵션을 빼서 보냅니다. 옵션없이 아래 명령어를 입력 시에,
ansible Node01 -m ping
ansible Node02 -m ping
ansible Node03 -m ping
SSH 최초 접속 시에 fingerprint 로 확인 여부가 나옵니다. 각각의 타겟 노드 세 개에 각각 지문등록 해줍시다.
이제, ansible에 hosts를 등록해줍니다.
vi /etc/ansible/hosts
--- (기존 설정들) ---
[nginx]
Node01_IP
Node02_IP
Node03_IP
설정파일 최하단에, 위와 같이 IP들을 입력해주고 저장.
아래와 같이 ping 테스트가 성공적으로 이뤄지는 것을 확인하시면 됩니다.
이제, Playbook을 작성해봅시다. Ansible의 Playbook은 Ansible을 사용하여 태스크를 자동화할 때 사용되는 YAML파일로, 하나 이상의 'play'로 구성됩니다. Playbook 내부에는 변수, 태스크, 핸들러, 템플릿, 파일 등 여러 구성 요소가 포함될 수 있습니다.
그럼 간단하게, 작성해봅시다. vi 명령어를 통해 아래와 같이 작성해주고 저장해준 뒤,
vi nginx.yml
---
- hosts: nginx
remote_user: root
tasks:
- name: install epel-release
yum: name=epel-release state=latest
- name: install nginx web serer
yum: name=nginx state=present
- name: Upload default index.html for web server
copy: src=index.html dest=/usr/share/nginx/html/ mode=0644
- name: Start nginx web server
service: name=nginx state=started
아래와 같은 명령어를 통해 playbook을 적용합니다.
ansible-playbook nginx.yml -k
완료되었다면, 여러분의 각각의 Node IP로 접속해보시면, 환경에 맞는 페이지가 나올 것입니다. 접속이 되는지만 테스트해보시면 됩니다.
이제 애써 만든 가상 머신들을 전부 지워줍시다. 그럼 Vagrant와 함께 본격적으로 Ansible을 다뤄보도록 합시다.
https://theworldaswillandidea.tistory.com/215
Vagrant는 위 포스팅을 참조해주시길 바랍니다.
Ansible을 위해 아래의 파일들을 각각 작성해줍시다.
먼저, Vagrant 파일. IP는 여러분들의 네트워크 IP를 사용하시면 됩니다.
# Vagrant 파일입니다.
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant_API_Version = "2"
Vagrant.configure(Vagrant_API_Version) do |config|
config.vm.box = "centos/7"
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.provider "virtualbox" do |vb|
vb.check_guest_additions = false
vb.functional_vboxsf = false
end
# Define a common setup for all VMs
VMs = ["ansible-node01", "ansible-node02", "ansible-server"]
VMs.each_with_index do |hostname, index|
config.vm.define hostname do |node|
node.vm.hostname = hostname
node.vm.provider "virtualbox" do |vb|
vb.name = hostname
end
node.vm.network "public_network", ip: "192.168.33.#{111 + index}"
node.vm.network "forwarded_port", guest: 22, host: 19212 + index, auto_correct: true
node.vm.provision "shell", inline: <<-SHELL
sudo sed -i 's/^#\\?PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
sudo systemctl restart sshd
SHELL
# Provisioning steps specific for ansible-server
if hostname == "ansible-server"
node.vm.provision "file", source: "./setup_environment.yml", destination: "/home/vagrant/setup_environment.yml"
node.vm.provision "shell", inline: <<-SHELL
sudo yum install -y epel-release
sudo yum install -y ansible
echo "[defaults]" > /home/vagrant/ansible.cfg
echo "inventory = /etc/ansible/hosts" >> /home/vagrant/ansible.cfg
echo "[CentOS]" > /etc/ansible/hosts
echo "ansible-node01 ansible_host=192.168.33.111 ansible_user=vagrant" >> /etc/ansible/hosts
echo "ansible-node02 ansible_host=192.168.33.112 ansible_user=vagrant" >> /etc/ansible/hosts
ansible-playbook /home/vagrant/setup_environment.yml --connection=local
ssh-keyscan 192.168.33.111 >> /home/vagrant/.ssh/known_hosts
ssh-keyscan 192.168.33.112 >> /home/vagrant/.ssh/known_hosts
SHELL
end
end
end
end
다음으로, setup_environment.yml 파일을 작성해줍니다.
--- setup_environment.yml 파일입니다. ---
---
- name: Setup Ansible Environment, SSH Config, and SSH Key Distribution
hosts: all
gather_facts: no
tasks:
- name: Install sshpass for non-interactive SSH access (if needed)
yum:
name: sshpass
state: present
- name: Configure .bashrc with handy aliases for Ansible commands
lineinfile:
path: /home/vagrant/.bashrc
line: "{{ item }}"
loop:
- "alias ans='ansible'"
- "alias anp='ansible-playbook'"
- name: Restart sshd service to apply config changes
service:
name: sshd
state: restarted
- name: Generate SSH keys for Vagrant user (if not present)
user:
name: vagrant
generate_ssh_key: yes
ssh_key_bits: 2048
ssh_key_file: .ssh/id_rsa
become: true
- name: Install sshpass on the control machine (if needed)
delegate_to: localhost
yum:
name: sshpass
state: present
- name: Copy SSH keys to ansible-node01
command: sshpass -p 'vagrant' ssh-copy-id -o StrictHostKeyChecking=no -i /home/vagrant/.ssh/id_rsa.pub vagrant@192.168.33.111
delegate_to: localhost
- name: Copy SSH keys to ansible-node02
command: sshpass -p 'vagrant' ssh-copy-id -o StrictHostKeyChecking=no -i /home/vagrant/.ssh/id_rsa.pub vagrant@192.168.33.112
delegate_to: localhost
vagrant init 을 실행시킨 디렉토리에 이 파일들의 작성을 마쳤다면, vagrant up 명령어를 통해 가상머신 노드들을 생성해줍시다.
모두 생성이 완료됐다면, 다시 터미널 창에서, 아래의 명령어를 각각 입력해줍니다.
vagrant ssh ansible-server
ans all -m ping -k
// 암호는 vagrant
성공적으로 Ansible Node들과 통신이 가능하다는 것을 확인할 수 있다.
이렇게 우리는 오늘 스크립트와 함께 명령어 하나만으로 IT 인프라를 자동화시키는 방법을 배워보았습니다. Ansible의 간결한 구성과 명령어 기반 실행은 서버 구성, 소프트웨어 배포, 작업 순서 조정과 같은 작업들을 빠르고 쉽게 처리할 수 있게 해줍니다. 다음에도, 더 재밌는 인프라 도구들을 가져와보도록 하겠습니다. 그럼 오늘은 여기까지.
다시 만날때까지, 안녕~