웹사이트 검색

Ansible을 사용하여 Ubuntu 22.04에서 Docker를 설치 및 설정하는 방법


소개

최신 애플리케이션 환경의 일회용 특성으로 인해 이제 서버 자동화는 시스템 관리에서 필수적인 역할을 합니다. Ansible은 일반적으로 새 서버에 대한 표준 절차를 설정하여 서버 설정 자동화 프로세스를 간소화하는 동시에 수동 설정과 관련된 인적 오류를 줄이는 데 사용됩니다.

Ansible은 노드에 특별한 소프트웨어를 설치할 필요가 없는 간단한 아키텍처를 제공합니다. 또한 자동화 스크립트 작성을 용이하게 하는 강력한 기능 세트와 내장 모듈을 제공합니다.

이 가이드는 Ansible을 사용하여 가상 머신과 유사한 방식으로 동작하는 리소스 격리 프로세스인 컨테이너 관리 프로세스를 단순화하는 애플리케이션인 Docker 가이드에 포함된 단계를 자동화하는 방법을 설명합니다. 휴대성이 뛰어나고 자원 친화적이며 호스트 운영 체제에 더 많이 의존합니다.

전제 조건

이 가이드의 플레이북에서 제공하는 자동 설정을 실행하려면 다음이 필요합니다.

  • 하나의 Ansible 제어 노드: Ansible이 설치되고 SSH 키를 사용하여 Ansible 호스트에 연결하도록 구성된 Ubuntu 22.04 시스템. Ubuntu 22.04에서 Ansible을 설치 및 구성하는 방법에 설명된 대로 제어 노드에 sudo 권한이 있고 방화벽이 활성화된 일반 사용자가 있는지 확인하십시오.
  • 하나 이상의 Ansible 호스트: Ubuntu 22.04에서 Ansible을 사용하여 초기 서버 설정을 자동화하는 방법에 대한 가이드에 따라 이전에 설정된 하나 이상의 원격 Ubuntu 22.04 서버.

진행하기 전에 먼저 Ansible 제어 노드가 Ansible 호스트에 연결하고 명령을 실행할 수 있는지 확인해야 합니다. 연결 테스트는 Ubuntu 22.04에서 Ansible을 설치하고 구성하는 방법의 3단계를 확인하세요.

이 플레이북은 무엇을 합니까?

이 Ansible 플레이북은 Ubuntu 22.04에서 Docker를 설치 및 사용하는 방법 가이드에 설명된 절차를 통해 수동으로 실행하는 대안을 제공합니다. 플레이북을 한 번 설정하고 이후 모든 설치에 사용하십시오.

이 플레이북을 실행하면 Ansible 호스트에서 다음 작업이 수행됩니다.

  1. apt 패키지 관리자의 대안으로 Ansible에서 선호하는 aptitude를 설치합니다.
  2. 필요한 시스템 패키지를 설치합니다.
  3. Docker GPG APT 키를 설치합니다.
  4. apt 소스에 공식 Docker 저장소를 추가합니다.
  5. 도커를 설치합니다.
  6. pip를 통해 Python Docker 모듈을 설치합니다.
  7. Docker 허브에서 default_container_image로 지정된 기본 이미지를 가져옵니다.
  8. 각각 default_container_image로 정의된 이미지를 사용하여 container_count 변수로 정의된 컨테이너 수를 생성하고 default_container_command에 정의된 명령을 실행합니다. 각 새 컨테이너에.

플레이북 실행이 완료되면 구성 변수 내에서 정의한 옵션을 기반으로 여러 컨테이너가 생성됩니다.

시작하려면 Ansible 제어 노드 서버에서 sudo 활성화 사용자로 로그인합니다.

1단계 - 플레이북 준비

playbook.yml 파일은 모든 작업이 정의되는 곳입니다. 작업은 Ansible 플레이북을 사용하여 자동화할 수 있는 가장 작은 작업 단위입니다. 그러나 먼저 원하는 텍스트 편집기를 사용하여 플레이북 파일을 만듭니다.

  1. nano playbook.yml

빈 YAML 파일이 열립니다. 플레이북에 작업을 추가하기 전에 먼저 다음을 추가하세요.

---
- hosts: all
  become: true
  vars:
    container_count: 4
    default_container_name: docker
    default_container_image: ubuntu
    default_container_command: sleep 1

접하는 거의 모든 플레이북은 이와 유사한 선언으로 시작합니다. hosts는 Ansible 제어 노드가 이 플레이북으로 대상으로 삼을 서버를 선언합니다. become은 에스컬레이션된 루트 권한으로 모든 명령을 수행할지 여부를 나타냅니다.

vars를 사용하면 변수에 데이터를 저장할 수 있습니다. 나중에 이를 변경하기로 결정한 경우 파일에서 이 한 줄만 편집하면 됩니다. 다음은 각 변수에 대한 간략한 설명입니다.

  • container_count: 생성할 컨테이너 수입니다.
  • default_container_name: 기본 컨테이너 이름입니다.
  • default_container_image: 컨테이너를 생성할 때 사용할 기본 Docker 이미지입니다.
  • default_container_command: 새 컨테이너에서 실행할 기본 명령입니다.

참고: 최종 완료 상태의 플레이북 파일을 보려면 5단계로 이동하세요. YAML 파일은 들여쓰기 구조가 특정할 수 있으므로 모든 작업을 추가한 후 플레이북을 다시 확인하는 것이 좋습니다.

2단계 - 플레이북에 패키지 설치 작업 추가

기본적으로 작업은 플레이북의 위에서 아래로 순서대로 Ansible에 의해 동기식으로 실행됩니다. 즉, 작업 순서 지정이 중요하며 다음 작업이 시작되기 전에 하나의 작업 실행이 완료된다고 안전하게 가정할 수 있습니다.

이 플레이북의 모든 작업은 단독으로 사용할 수 있으며 다른 플레이북에서 재사용할 수 있습니다.

Linux 패키지 관리자와 인터페이스하기 위한 도구인 aptitude를 설치하고 필요한 시스템 패키지를 설치하는 첫 번째 작업을 추가합니다. Ansible은 이러한 패키지가 항상 서버에 설치되도록 합니다.

  tasks:
    - name: Install aptitude
      apt:
        name: aptitude
        state: latest
        update_cache: true

    - name: Install required system packages
      apt:
        pkg:
          - apt-transport-https
          - ca-certificates
          - curl
          - software-properties-common
          - python3-pip
          - virtualenv
          - python3-setuptools
        state: latest
        update_cache: true

여기서 apt Ansible 내장 모듈을 사용하여 Ansible이 패키지를 설치하도록 지시합니다. Ansible의 모듈은 원시 bash 명령으로 실행해야 하는 작업을 실행하기 위한 바로 가기입니다. Ansible은 aptitude를 사용할 수 없는 경우 패키지 설치를 위해 안전하게 apt로 대체되지만 Ansible은 역사적으로 aptitude를 선호했습니다.

원하는 대로 패키지를 추가하거나 제거할 수 있습니다. 이렇게 하면 모든 패키지가 최신 버전에 있을 뿐만 아니라 apt를 사용한 업데이트가 호출된 후 완료됩니다.

3단계 - 플레이북에 Docker 설치 작업 추가

작업은 공식 리포지토리에서 최신 버전의 Docker를 설치합니다. 다운로드 확인을 위해 Docker GPG 키가 추가되고 공식 리포지토리가 새 패키지 소스로 추가되며 Docker가 설치됩니다. 또한 Python용 Docker 모듈도 설치됩니다.

    - name: Add Docker GPG apt Key
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
        state: present

    - name: Add Docker Repository
      apt_repository:
        repo: deb https://download.docker.com/linux/ubuntu jammy stable
        state: present

    - name: Update apt and install docker-ce
      apt:
        name: docker-ce
        state: latest
        update_cache: true

    - name: Install Docker Module for Python
      pip:
        name: docker

apt_keyapt_repository 내장 Ansible 모듈이 먼저 올바른 URL을 가리키는지 확인한 다음 URL이 있는지 확인하는 작업을 수행합니다. 이렇게 하면 최신 버전의 Docker를 설치할 수 있으며 pip를 사용하여 Python용 모듈을 설치할 수 있습니다.

4단계 - 플레이북에 Docker 이미지 및 컨테이너 작업 추가

Docker 컨테이너의 실제 생성은 여기에서 원하는 Docker 이미지를 가져오는 것으로 시작됩니다. 기본적으로 이러한 이미지는 공식 Docker Hub에서 가져옵니다. 이 이미지를 사용하면 플레이북 상단에 선언된 변수에 의해 배치된 사양에 따라 컨테이너가 생성됩니다.

    - name: Pull default Docker image
      community.docker.docker_image:
        name: "{{ default_container_image }}"
        source: pull

    - name: Create default containers
      community.docker.docker_container:
        name: "{{ default_container_name }}{{ item }}"
        image: "{{ default_container_image }}"
        command: "{{ default_container_command }}"
        state: present
      with_sequence: count={{ container_count }}

docker_image는 컨테이너의 기반으로 사용하려는 Docker 이미지를 가져오는 데 사용됩니다. docker_container를 사용하면 전달하려는 명령과 함께 생성한 컨테이너의 세부 사항을 지정할 수 있습니다.

with_sequence는 루프를 생성하는 Ansible 방법이며, 이 경우 지정한 개수에 따라 컨테이너 생성을 반복합니다. 이것은 기본 카운트 루프이므로 여기서 item 변수는 현재 루프 반복을 나타내는 숫자를 제공합니다. 이 번호는 여기에서 컨테이너의 이름을 지정하는 데 사용됩니다.

5단계 - 전체 플레이북 검토

플레이북은 사용자 정의에 따라 약간의 차이가 있지만 대략 다음과 같아야 합니다.

---
- hosts: all
  become: true
  vars:
    container_count: 4
    default_container_name: docker
    default_container_image: ubuntu
    default_container_command: sleep 1d

  tasks:
    - name: Install aptitude
      apt:
        name: aptitude
        state: latest
        update_cache: true

    - name: Install required system packages
      apt:
        pkg:
          - apt-transport-https
          - ca-certificates
          - curl
          - software-properties-common
          - python3-pip
          - virtualenv
          - python3-setuptools
        state: latest
        update_cache: true

    - name: Add Docker GPG apt Key
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
        state: present

    - name: Add Docker Repository
      apt_repository:
        repo: deb https://download.docker.com/linux/ubuntu jammy stable
        state: present

    - name: Update apt and install docker-ce
      apt:
        name: docker-ce
        state: latest
        update_cache: true

    - name: Install Docker Module for Python
      pip:
        name: docker

    - name: Pull default Docker image
      community.docker.docker_image:
        name: "{{ default_container_image }}"
        source: pull

    - name: Create default containers
      community.docker.docker_container:
        name: "{{ default_container_name }}{{ item }}"
        image: "{{ default_container_image }}"
        command: "{{ default_container_command }}"
        state: present
      with_sequence: count={{ container_count }}

자신의 워크플로우 내에서 개별 요구 사항에 가장 적합하도록 이 플레이북을 자유롭게 수정하십시오. 예를 들어 docker_container 모듈을 사용하여 컨테이너 네트워크를 설정할 수 있습니다.

참고: 이것은 들여쓰기에 주의하라는 부드러운 알림입니다. 오류가 발생하면 이것이 범인일 가능성이 큽니다. YAML은 이 예제에서와 같이 들여쓰기로 2개의 공백을 사용할 것을 제안합니다.

플레이북에 만족하면 텍스트 편집기를 종료하고 저장할 수 있습니다.

6단계 - 플레이북 실행

이제 하나 이상의 서버에서 이 플레이북을 실행할 준비가 되었습니다. 대부분의 플레이북은 기본적으로 인벤토리의 모든 서버에서 실행되도록 구성되지만 이번에는 서버를 지정합니다.

플레이북을 server1에서만 실행하고 sammy로 연결하려면 다음 명령을 사용할 수 있습니다.

  1. ansible-playbook playbook.yml -l server1 -u sammy

-l 플래그는 서버를 지정하고 -u 플래그는 원격 서버에 로그인할 사용자를 지정합니다. 다음과 유사한 출력이 표시됩니다.

Output
. . . changed: [server1] TASK [Create default containers] ***************************************************************************************************************** changed: [server1] => (item=1) changed: [server1] => (item=2) changed: [server1] => (item=3) changed: [server1] => (item=4) PLAY RECAP *************************************************************************************************************************************** server1 : ok=9 changed=8 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

참고: Ansible 플레이북을 실행하는 방법에 대한 자세한 내용은 Ansible Cheat Sheet Guide를 확인하십시오.

이는 서버 설정이 완료되었음을 나타냅니다! 출력이 정확히 동일할 필요는 없지만 오류가 전혀 없는 것이 중요합니다.

플레이북 실행이 완료되면 SSH를 통해 Ansible에서 프로비저닝한 서버에 로그인하여 컨테이너가 성공적으로 생성되었는지 확인합니다.

다음을 사용하여 원격 서버에 로그인합니다.

  1. ssh sammy@your_remote_server_ip

그리고 원격 서버에 있는 Docker 컨테이너를 나열합니다.

  1. sudo docker ps -a

다음과 유사한 출력이 표시되어야 합니다.

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a3fe9bfb89cf ubuntu "sleep 1d" 5 minutes ago Created docker4 8799c16cde1e ubuntu "sleep 1d" 5 minutes ago Created docker3 ad0c2123b183 ubuntu "sleep 1d" 5 minutes ago Created docker2 b9350916ffd8 ubuntu "sleep 1d" 5 minutes ago Created docker1

이는 플레이북에 정의된 컨테이너가 성공적으로 생성되었음을 의미합니다. 이것이 플레이북의 마지막 작업이었기 때문에 플레이북이 이 서버에서 완전히 실행되었음을 확인합니다.

결론

인프라 설정을 자동화하면 시간을 절약할 수 있을 뿐만 아니라 서버가 필요에 따라 사용자 정의할 수 있는 표준 구성을 따르도록 할 수 있습니다. 최신 애플리케이션의 분산 특성과 서로 다른 스테이징 환경 간의 일관성 필요성으로 인해 이와 같은 자동화는 많은 팀의 개발 프로세스에서 핵심 구성 요소가 되었습니다.

이 가이드에서는 Ansible을 사용하여 원격 서버에서 Docker를 설치하고 설정하는 프로세스를 자동화하는 방법을 보여주었습니다. 컨테이너로 작업할 때 일반적으로 개인마다 요구 사항이 다르기 때문에 docker_container Ansible 모듈에 대한 자세한 내용과 사용 사례는 공식 Ansible 설명서를 확인하는 것이 좋습니다.

초기 서버 설정을 추가로 사용자 지정하기 위해 이 플레이북에 다른 작업을 포함하려면 Ansible 소개 가이드 구성 관리 101: Ansible 플레이북 작성을 참조하십시오.