And Brain said,

Ansible, 내가 나를 지배한다 (IT Automation) - 개요 본문

IT/Ansible

Ansible, 내가 나를 지배한다 (IT Automation) - 개요

The Man 2023. 11. 2. 12:13
반응형

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, 가상 환경의 유목민

Vagrant는 HashiCorp에서 개발한 오픈소스 소프트웨어로, 개발 환경의 일관성과 재현성을 향상시키기 위한 도구로, 개발자와 운영팀 간의 "내 로컬에서는 잘 돌아갔는데..."라는 문제를 해결하기 위

theworldaswillandidea.tistory.com

 
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의 간결한 구성과 명령어 기반 실행은 서버 구성, 소프트웨어 배포, 작업 순서 조정과 같은 작업들을 빠르고 쉽게 처리할 수 있게 해줍니다. 다음에도, 더 재밌는 인프라 도구들을 가져와보도록 하겠습니다. 그럼 오늘은 여기까지.
 
다시 만날때까지, 안녕~
 

Thanks for watching, Have a nice day.

반응형
Comments