Ansible

jaeyeon ha·2026년 3월 7일

[교육] Kubernetes

목록 보기
1/34

Ansible

Ansible은 개발 환경을 구축할 때 동일한 작업을 반복해야 하는 경우가 빈번히 발생하는 경우를 보완하기 위해 서버의 설정과 인프라 프로비저닝 등을 자동화할 수 있는 오픈소스 도구로, 별도의 Agent 없이 SSH를 통한 스크립트 실행을 지원하며 선언적으로 서버 설정을 정의

▶ 코드 기반으로 인프라 구축 및 관리 데브옵스

설치

앤서블을 pip을 이용하거나, OS 패키지 관리 도구를 이용하여 편리하게 설치 가능

  1. python

    ~# pip install ansible
    ---
    # 특정 버전 설치시, 버전 설정
    ~# pip install ansible=={특정 버전}
  2. CentOS

    ~# yum install -y ansible
  3. Ubuntu

    ~# apt install ansible
  4. MacOS

    ~# brew install ansible

사전 작업(SSH 연결 확인)

앤서블은 ssh로 제어 노드와 매니지드 노드가 연결되어 작동함
앤서블을 이용하여 작업하기 전에 authorized_keys에 키를 추가하여 주는 것을 권장

  1. ssh-keygen으로 키 생성
```bash
~# ssh-keygen -t rsa
```
  1. ssh-copy-id 로 키 추가

    ~# ssh-copy-id {user}@{연결할 호스트|IP}
     ex. ssh-copy-id root@node1.com
  2. ssh 연결

    ~# ssh root@node1.com

실행 가능한지 ping 모듈을 실행하여 동작 확인

  • -m : 모듈 선택
  • -i : 인벤토리 선택
  • -u : 유저명 인벤토리 설정
    모듈을 연결할 서버 정보를 가지고 있는 인벤토리를 우선 설정
    연결에 설정할 서버 정보를 server.ini 파일로 저장
    [server]
    10.1.2.3 # ip주소
    example.com
    모듈 실행server.ini 에 있는 서버 정보로 ping 명령을 실행하여 결과 반환
    # ping 실행
    ansible server -i server.ini -m ping
    
    # 유저명 주고 실행
    ansible server -i server.ini -m ping -u ubuntu
    ansible server -i server.ini -m ping -u deploy

구성

img1.daumcdn.png

  • 제어 노드(control node)
    앤서블을 실행하는 노드
    /usr/bin/ansible 이나 /usr/bin/ansible-playbook 명령을 이용하여 제어 노드에서 관리 노드 관리
  • 매니지드 노드(managed node)
    앤서블로 관리하는 서버로 호스트라고도 함
    해당 노드들에는 앤서블이 설치되지 않음
  • 인벤토리(inventory)
    매니지드 노드 목록
    인벤토리 파일은 호스트 파일이라고도 함
    각 매니지드 노드에 대한 IP 주소, 호스트 정보, 변수와 같은 정보 지정할 수 있음
  • 모듈(module)
    앤서블이 실행하는 코드 단위
    각 모듈은 데이터베이스 처리, 사용자 관리, 네트워크 장치 관리 등 다양한 용도로 사용됨
    단일 모듈을 호출하거나 플레이북에서 여러 모듈 호출 가능
  • 태스크(task)
    앤서블 작업 단위
    애드혹(ad-hoc)명령을 사용하여 단일 작업 한 번 실행 가능
  • 플레이북(playbook)
    순서가 지정된 태스크 목록
    변수와 작업 포함 가능하며 주로 YAML로 작성됨

  1. 인벤토리
    앤서블을 이용하여 작업을 진행할 서버의 정보와 작업에 사용할 변수 정보 저장
    - 설정 방법
    ini 파일과 yaml 파일로 설정
    - ini 파일
            ```
            mail.example.com
            
            [webservers]
            foo.example.com
            bar.example.com
            
            [dbservers]
            one.example.com
            two.example.com
            three.example.com
            ```
            
        - yaml 파일
            
            ```
            all:
              hosts:
              	mail.example.com:
              children:
              	webservers:
              	hosts:
              		foo.example.com:
              		bar.example.com:
              	dbservers:
              	hosts:
              		one.example.com:
              		two.example.com:
              		three.example.com:
            ```
            
    - 사용 방법
        - 파라미터 전달
        `-i` 옵션으로 인벤토리 파일 지정
            
            ```bash
            ansible-playbook -i inventory.yaml
            ```
            
        - cfg 파일 설정
        cfg 파일에 `inventory` 옵션에 파일 경로를 지정
        인벤토리 파일은 콤마를 이용하여 여러 개 지정 가능
            
            ```
            [default]
            inventory = inventory.yaml,common.yaml
            ```
            
    
    ▶ 호스트명 설정
    
    ```
    all:
      hosts:
        webserver-host1:
        webserver-host2:
        dbserver-host[1:10]:
        10.1.3.2:
    
      children:
        webservers:
          hosts:
            webserver-host1:
            webserver-host2:
    
        dbservers:
          hosts:
            dbserver-host[1:10]:
    ```
    
    - all : 모든 호스트의 정보를 추가
    - children : 그룹별 호스트 정보 추가
    ※ 그룹은 작업 단위별로 설정하는 것이 좋음 ▶ db 서버 모음, 웹 서버 모음과 같은
    - `dbserver-host[1:10]` 과 같은 형태로 1 ~ 10번까지의 호스트 설정 가능
    - `10.1.3.2` 와 같은 형태로 IP를 직접적으로 설정하는 것도 가능
    
    ▶ 변수 설정
    
    ```
    all:
      hosts:
        webserver-host1:
        webserver-host2:
        dbserver-host[1:10]:
        10.1.3.2:
    
      children:
        webservers:
          hosts:
            webserver-host1:
    		  host_var: "local_var"
            webserver-host2:
    
        dbservers:
          hosts:
            dbserver-host[1:10]:
    	  vars:
            db_id: "admin"
            db_passwd: "passw@rd"
    
      vars:
        global_var: "server_name"
    ```
    
    - 전역변수 : 모든 서버에서 사용할 수 있는 변수값
    :: global_var
    - 그룹변수 : 그룹에서 사용할 수 있는 변수값
    :: dbservers 그룹에서 사용할 수 있는 변수값(vars: db_id, db_passwd)
    - 호스트변수 : 단일 호스트에서 사용할 수 있는 변수
    :: webserver-host1에서 host_var 사용 가능
    
    ▶ 변수 타입
    
    ```
     vars:
       string_var: "A"
       number_var: 1
       boolean_var: "yes"
       list_var:
         - A
         - B
         - C
       dict_var:
           key_a: "val_a"
           key_b: "val_b"
           key_c: "val_c"
    ```
  2. 모듈
    단일 명령어이자 수행할 작업
    cp, apt, wget 등의 단일 명령어
  3. 태스크
    모듈의 모음으로, 연속된 동작으로 진행할 작업을 정의

예제
file 다운로드 → 압축 해제 → symbolic link 생성

```
- name: download hue file
  get_url:
    url: "<https://cdn.gethue.com/downloads/hue-4.10.0.tgz>"
    dest: /tmp
    mode: '0660'

- name: unarchive hue file
  unarchive:
    src: "/tmp/hue-4.10.0.tgz"
    dest: "/opt"
    remote_src: True
    owner: "hue"
    group: "hue"
  become: True

- name: "create symlink /opt/hue"
  file:
    src: "/opt/hue-4.10.0"
    dest: /opt/hue
    state: link
    owner: "hue"
    group: "hue"
  become: yes

```
  1. 플레이북
    호스트와 태스크를 연결
    호스트는 인벤토리에서 가져오고, 플레이북에서 태스크를 지정하여 작업을 진행
    ```bash
    # inventory.yaml의 호스트로 playbook.yaml을 실행
    ansible-playbook -i inventory.yaml playbook.yaml
    ```
    
    **예제**
    인벤토리에 플레이북에서 사용할 호스트 명(hue) 추가
    
    ```
    ---
    all:
      hosts:
        hue-server:
    
      children:
        hue:
          hosts:
            hue-server:
    
    ```
    
    플레이북은 `hosts`에 명령을 실행할 서버(hue)를 지정하고 태스크(파일 다운로드 → 압축해제 → symbolic link 생성) 실행
    
    ```
    ---
    - hosts: "hue"
    
    - name: download hue file
      get_url:
        url: "<https://cdn.gethue.com/downloads/hue-4.10.0.tgz>"
        dest: /tmp
        mode: '0660'
    
    - name: unarchive hue file
      unarchive:
        src: "/tmp/hue-4.10.0.tgz"
        dest: "/opt"
        remote_src: True
        owner: "hue"
        group: "hue"
      become: True
    
    - name: "create symlink /opt/hue"
      file:
        src: "/opt/hue-4.10.0"
        dest: /opt/hue
        state: link
        owner: "hue"
        group: "hue"
      become: yes
    ```

위키독스 개발자가 앤서블(Ansible) 시작하기

0개의 댓글