Gom3rye

Ansible 본문

현대 오토에버 클라우드 스쿨

Ansible

Gom3rye 2025. 8. 7. 17:45
728x90
반응형

Ansible

  • 오픈 소스 IT 자동화 도구로 사용자가 수작업으로 진행하던 프로비저닝, 환경 설정, 애플리케이션 배포 등의 IT 업무를 코드 기반으로 작성하여 여러 환경에 동일하게 적용할 수 있도록 돕는 역할을 수행한다.

                        Database 설치                                 1개 추가 설치
public cloud → 관리 콘솔에 접속해서 옵션을 선택 → 반복

private cloud → database download 수동으로 설치 → 반복

이때 버전이 달라지면 문제 생길 수 있음 ⇒ IaC, ansible, terraform 등장

  • RedHat이 개발하고 관리한다.

특징

  • No Agent
    • 예전에 많이 사용하던 Puppet이나 Chef는 자동화 관리 대상 서버에 별도의 에이전트를 설치하고 이를 통해 자동화 업무를 수행한다.
      • 이러한 데몬 형식의 에이전트에 기반한 자동화 도구는 관리를 위한 복잡한 추가 작업이나 운영체제 버전에 따라 추가 패키지나 모듈을 설치하는 등의 작업이 발생한다.
    • Ansible은 별도의 Agent 설치 없이 SSH로 접속해서 Python Code를 수행한다.
  • idempotent (멱등성)
    • 멱등성: 동일한 연산 또는 작업을 여러 번 수행하더라도 결과가 달라지지 않는 성질
    • 동일한 운영 작업을 여러 번 수행해도 동일한 결과를 만들어 낸다.
  • 쉬운 사용법과 다양한 모듈 제공
    • 자동화 단계는 에디터만 있으면 YAML 문법을 사용하여 쉽게 작성하고 읽을 수 있다.
    • 파일 복사와 같은 일반 시스템 관리 모듈부터 다양한 환경의 퍼블릭 클라우드 관련 모듈 및 컬렉션까지 제공
    • playbook 샘플을 찾아보기 쉽다.

용도

  • 시스템 환경을 설정
  • 애플리케이션 설치
  • 퍼블릭이나 프라이빗 클라우드 시스템의 가상 서버 생성
  • 매일 점검해야 하는 시스템의 상태 체크
  • 여러 시스템에 동일한 작업을 해야 할 상황에 주로 이용\

사용 가능한 운영체제

  • Linux
  • Mac OS
  • BSD 계열의 유닉스
  • WSL을 지원하는 윈도우

관련 자료

Ansible Architecture

  1. Community Ansible
    • 오픈 소스 형태
    • 제어 노드와 관리 노드라는 두 가지 유형의 시스템으로 구성
    • 앤서블은 제어 노드에 설치되어 실행되고 앤서블이 실행되기 위해서는 python이 기본적으로 설치되어 있어야 한다.
    • 앤서블 안에는 다양한 모듈과 플러그인이 함께 설치되어 있으며 앤서블이 관리하는 노드 정보를 저장하고 있는 인벤토리와 관리 노드에서 수행할 작업 절차가 작성되어 있는 플레이북이 존재한다.
      • 제어 노드
        • 앤서블이 설치되는 노드
        • 리눅스 운영체제가 설치된 컴퓨터라면 제어 노드가 될 수 있다.
        • 앤서블은 파이썬 모듈을 이용하므로 앤서블을 설치하고 실행하려면 파이썬이 설치되어 있어야 한다.
      • 관리 노드
        • 앤서블이 제어하는 원격 시스템 또는 호스트
        • 관리 노드는 리눅스가 설치된 노드일 수도 있고 윈도우가 설치된 노드일 수도 있다.
        • public cloud나 private cloud의 가상 서버도 가능하다.
        • 별도의 에이전트를 설치하지는 않지만 관리 노드는 제어 노드와 SSH 통신이 가능해야 한다.
      • Inventory
        • 제어 노드가 제어하는 관리 노드의 목록을 나열해 놓은 파일
        • 앤서블은 인벤토리에 사전에 정의되어 있는 관리 노드에만 접근이 가능하다.
      • Module
        • 앤서블은 관리 노드의 작업을 수행할 때 SSH를 통해 연결한 후 Ansible Module이라는 스크립트를 push 해서 작동한다.
        • 대부분의 모듈은 원하는 시스템 상태를 설명하는 매개변수를 허용하며 모듈 실행이 완료되면 제거된다.
      • Plugin
        • 앤서블의 핵심 기능을 강화하는 역할을 수행
        • 모듈이 대상 시스템에서 별도의 프로세스로 실행되는 동안 플러그인은 제어 노드에서 실행된다.
        • 앤서블의 핵심 기능 (데이터 변환, 로그 출력, 인벤토리 연결 등)에 대한 옵션 및 확장 기능을 제공한다.
      • Playbook
        • 관리 노드에서 수행할 작업들을 YAML 문법을 이용해서 순서대로 작성해 놓은 파일
        • 앤서블은 플레이북을 활용하여 관리 노드에 SSH로 접근해 작업을 수행한다.
  2. Red Hat Automation Platform
    • 레드햇 서브스크립션을 이용
    • 주요 컴포넌트는 Community Ansible과 동일하다.
    • 커뮤니티 앤서블과 다르게 인벤토리, 제어 노드에 대한 인증 정보, 실행 환경 등을 관리하는 CMDB(Configuration Management Database)가 존재한다.
    • 자원들을 관리하는 관리 웹 UI가 존재하고 REST API도 제공한다.
    • 사용자가 외부에서 작성한 내용을 앤서블 관리 웹 UI를 통해서 가져올 수 있다.
    • 3가지 필수 컴포넌트와 1가지 옵셔널 컴포넌트로 구성
      • 오토메이션 컨트롤러: 앤서블 타워로 불리우던 관리 웹 UI
      • 실행 환경: 앤서블 모듈과 플러그인이 존재하는 컨테이너 기반의 실행 환경
      • PostgreSQL: 인벤토리, 인증 정보, 실행 환경 등의 메타데이터를 관리하는 CMDB
      • 오토메이션 허브(옵션): 레드햇에서 기술 지원을 받을 수 있는 컬렉션 제공 서비스
    • 구성에 따른 아키텍쳐
      • All in One: 하나의 노드에 필수 컴포넌트를 전부 구성한다.
    • AAP using External DB
      • PostgreSQL을 별도의 노드로 그리고 오토메이션 컨트롤러와 실행 환경은 동일한 노드로 구성
    • Private Automation HUB
      • AAP using External DB와 동일한 아키텍쳐에 오토메이션 허브를 내부에서 사용할 수 있도록 별도의 노드로 구성된다.
        • 주로 이건 인터넷이 되지 않는 환경에서 사용한다.

Ansible 설치

제어 노드에 ansible 설치

  • 파이썬이 설치되어 잇는지 확인: python3 --version
  • ansible 설치: sudo apt update, sudo apt install -y ansible
    • 확인: ansible --version
  • 앤서블에 관련된 설정은 /etc/ansible 이라는 디렉토리를 이용한다.
    • 환경 설정 파일: ansible.cfg
    • 인벤토리 설정: hosts
      • 현재는 ls /etc/ansible 치면 아무것도 없다고 나올 테니 미리 만들어두자. mkdir /etc/ansible

Inventory 작성

  • 인벤토리를 이용한 자동화 대상 호스트 설정
    • 인벤토리 파일은 텍스트 파일이며 앤서블이 자동화 대상으로 하는 관리 호스트를 지정한다.
    • INI 형식(이름=값) 또는 YAML을 포함한 다양한 형식을 이용해서 작성 가능하다.
  • IP를 이용해서 인벤토리 파일을 작성
    • 192.168.100.5
    • 192.168.100.6
    • 192.168.100.7
  • 호스트 이름으로 파일 작성
  • 역할에 따른 호스트 그룹 설정
  • Ansible에서는 컨트롤러 노드(예: masternode)가 명령을 내려주고, 실제로 명령이 실행되는 곳은 워커 노드 (
    worker1, worker2등)이기 때문에, sudo권한 설정은 워커 노드 쪽에 반드시 해줘야 한다.
  • SSH 접속 설정 (EC2는 설정 필요 없다.)
    • 유저 생성
      • sudo adduser [유저이름]
        • sudo adduser ansible
      • sudo passwd [유저이름]
      • sudo chmod u+w /etc/sudoers
      • sudo vi /etc/sudoers 명령 후 하단에 추가
      • 유저이름 ALL=(ALL:ALL) ALL
        • 앞으로 계속 root 계정(kyla)로 작업할 예정이라 kyla ALL=(ALL:ALL) ALL 도 작성해주기
        • worker1, worker2에서 해주는 것!!
    • ssh 재시작: sudo service ssh(sshd) restart
      • 유저를 이용해서 ssh 접속이 가능하다.
      • ansible은 비밀번호 입력 없이 ssh 접속이 가능해야 한다.
      • 접속하고자 하는 컴퓨터(제거 노드)에서 ssh-keygen 수행 후 ssh-copy-id [원격서버계정]@[원격서버IP]
        • ssh-copy-id kyla@워커노드의 게스트ip
          • ssh-copy-id kyla@192.168.56.101
          • ssh-copy-id kyla@192.168.56.102
          • 그러면 이제 key값이 복사가 되어서 다음부터는 비밀번호 없이 접속이 가능하다. 
            • 제어 노드(masternode)에서 비밀번호 입력 없이 관리 노드로(workernode1, 2) ssh 접속이 가능해야 한다.

  • 현재 컴퓨터에서 EC2에 파일 전송
    • scp -i pem파일경로 전송할파일경로 계정@EC2퍼블릭DNS:복사할경로 (powershell에서 해야 한다.)
      • 파일 복사하는 것을 해본 거고 사실은 그냥 git에 올려놓고 내려 받아도 된다.
  • EC2 인스턴스를 관리 노드로 설정(/etc/ansible/hosts)
    • [itstudy]
    • worker1 ansible_host=172.31.34.36 ansible_user=ubuntu
    • ansible_ssh_private_key_file=/home/ubuntu/itstudy.pem
    • worker2 ansible_host=172.31.47.228 ansible_user=ubuntu
    • ansible_ssh_private_key_file=/home/ubuntu/itstudy.pem
  • Or EC2 인스턴스가 아닌 노드를 관리 노드로 설정 (/etc/ansible/hosts)
[itstudy]
worker1 ansible_host=192.168.56.101
worker2 ansible_host=192.168.56.102
  • 인벤토리 파일의 내용을 확인
    • ansible-inventory -i 파일경로 --list
      • ansible-inventory -i /etc/ansible/hosts --list
    • ansible-inventory -i /etc/ansible/hosts --graph

모듈을 실행해서 실제 인벤토리가 제대로 만들어졌는지 확인

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 itstudy -m shell -a "free -h"

  • 파일 복사해서 전송해보기
    • ansible 인벤토리이름 -m copy -a "src=복사할파일 dest=복사될경로"
    • ansible itstudy -m copy -a "src=./test.txt dest=/tmp”
      • worker 1, 2에게 모두 다 간다.

  • 패키지 설치
    • ansible 인벤토리이름 또는 all -m apt -a "name=패키지이름 state=present" -b
      • ansible itstudy -m apt -a "name=nginx state=present" -b
        • 이때 아래와 같은 에러가 나오면 -K 옵션 줘서 비밀번호 누르면 된다.
        worker1 | FAILED! => {
            "msg": "Missing sudo password"
        }
        worker2 | FAILED! => {
            "msg": "Missing sudo password"
        }
        
        해결 방법: kyla@masternode:~/ansible$ ansible itstudy -m apt -a "name=nginx state=present" -b -K
        BECOME password: 비밀번호 입력
        • 이때 masternode(명령을 실행한 곳)에서는 nginx 깔리지 않는다. (자기 자신에는 안 깔음)

playbook

작성 방법

  • YAML 포맷으로 작성 (first-playbook.yaml)
---
- hosts: all
  tasks:
    - name: Print Message
      debug:
        msg: Hello Ansible World
        
# 문법 검사
ansible-playbook --syntax-check first-playbook.yaml
## playbook: first-playbook.yaml -> error 없는 것

# 실행 - ansible-playbook 파일 경로
ansible-playbook first-playbook.yaml

  • 실행 점검: --check
    • 관리 대상 호스트는 실제로 변경되지 않고 어떤 내용이 변경될 지만 미리 알 수 있다.
    • ssh 서비스를 재시작하는 yaml파일 작성 (restart-service.yaml)
    ---
    - hosts: itstudy
      tasks:
        - name: Restart ssh service # name은 아무거나 써도 된다.
          ansible.builtin.service:
            name: ssh
            state: restarted
            
    # 문법 체크
    ansible-playbook --syntax-check restart-service.yaml
    # 점검
    ansible-playbook --check restart-service.yaml
    ## 실제 해보지는 않고 test만 해보는 것이다.
    
  • 파일 복사
    • 모듈의 이름은 copy
    • 설정해야 하는 값
      • src는 복사할 파일 경로
      • dest는 복사될 디렉토리
      • owner는 파일의 소유자
      • mode는 파일의 권한
    • yaml 파일 작성 (copy-test.yaml)
    - name: Ansible File Copy
      hosts: itstudy
      tasks:
        - name: copying file with playbook
          copy:
            src: ./sample.txt # 또는 그냥 sample.txt (yaml파일이 있는 곳에 있으니까)
            dest: /tmp
            owner: kyla
            mode: "0644"
    
    # 실행
    ansible-playbook copy-test.yaml
    

파일 다운로드

파일 다운로드

  • get_url 이라는 모듈 사용
    • url에 다운로드 받을 url을 설정하고 dest에 다운로드 경로를 설정하면 된다.

파일 관련 명령

  • file 이라는 모듈 사용
    • path에 생성할 파일이나 디렉토리를 설정하고 state에 종류를 설정하고 mode에 파일의 접근 권한을 설정할 수 있다.
  • become과 become_user는 ansible에서 권한을 변경하고자 할 때 사용하는 속성이다.
    • 일반적으로 sudo 명령을 사용하고자 하는 경우 become과 become_user를 사용한다.
  • /opt/tomcat 이라는 디렉토리에 톰캣 파일을 다운로드
    - hosts: itstudy
      become: yes
      become_user: root
    
      tasks:
        - name: Create /opt/tomcat9 directory
          file:
            path: /opt/tomcat9
            state: directory
            mode: "0755"
    
        - name: Download Tomcat .sha512 file
          get_url:
            url: <https://downloads.apache.org/tomcat/tomcat-9/v9.0.8/bin/apache-tomcat-9.0.8.tar.gz.sha512>
            dest: /opt/tomcat9/apache-tomcat-9.0.8.tar.gz.sha512
    
    • 여기서 자꾸 비밀번호로 에러가 난다면 workernode1, 2의 /etc/sudoers 파일에 kyla ALL=(ALL:ALL) NOPASSWD: ALL 가 설정되어 있는지 확인하자.

  • nginx를 설치하고 설정을 수정하고 메인 페이지를 출력하도록 설정
    • 제어 노드에 메인 페이지로 보여질 페이지를 생성(index.html)
    <html>
            <head>
                    <title>Welcome to Nginx Via Ansible</title>
            </head>
            <body>
                    <h1>Nginx Configured by Ansible</h1>
                    <p>앤서블을 이용해서 NGINX 설정 및 배포</p>
            </body>
    </html> 
    
    • nginx 설정 파일 작성(nginx.conf)
    server{
            listen 80 default_server;
            listen [::]:80 default_server ipv6only=on;
    
            root /usr/share/nginx/html;
            index index.html index.html # 이 디렉토리에 있는 파일이 맨 처음 보여지는 파일이 되겠다.
    
            server_name localhost;
    
            location /{
                    try_files $uri $uri/ =404;
            }
    }
  • playbook 파일 작성(webserver.yaml)
- hosts: itstudy
  become: yes
  become_user: root
  tasks:
    - name: Ensure nginx is installed
      package:
        name: nginx
        update_cache: yes

    - name: Copy Nginx Config File
      copy:
        src: nginx.conf
        dest: /etc/nginx/sites-available/default

    - name: Manage Configuration
      file:
        src: /etc/nginx/sites-available/default
        dest: /etc/nginx/sites-enabled/default
        state: link

    - name: Copy Homepage Template
      template:
        src: index.html
        dest: /usr/share/nginx/html/index.html

    - name: Restart Nginx
      service:
        name: nginx
        state: restarted
        
# 만약 nginx.conf에서 에러 뜬다면
sudo nginx -t # 로 문법 체크 할 수 있다. 

 

 

 

ip 고정하는 방법

→ 제어판\네트워크 및 인터넷\네트워크 연결 → wifi 더블 클릭 → 인터넷 프로토콜 버전 4 → 다음 ip 설정 클릭해서 정보 넣어주기 (이때 필요한 정보들은 ipconfig /all 명령어로 알 수 있다.)

728x90
반응형