웹사이트 검색

Ubuntu 22.04에서 Ansible을 설치하고 구성하는 방법


이 튜토리얼은 다음 OS 버전에 대해 존재합니다.

  • Ubuntu 22.04(Jammy Jellyfish)
  • Ubuntu 18.04(Bionic Beaver)

이 페이지에서

  1. 전제 조건
  2. 1단계 - Ansible 설치
  3. 2단계 - 인벤토리 파일 설정
    1. 서버를 그룹 및 하위 그룹으로 구성\n

    1. 기존 공개 키를 사용하여 노드에서 SSH 키 설정\n

    1. 디스크 사용량 확인\n
    2. 개별 호스트 및 그룹 대상\n
    3. 모든 서버 업데이트

    Ansible은 많은 수의 서버를 제어하는 프로세스를 간소화하도록 설계된 매우 인기 있는 구성 관리 도구입니다. 단일 명령 또는 파일로 새 서버를 설정하고 응용 프로그램을 설치하는 프로세스를 자동화할 수 있습니다. 단일 노드에서 동시에 많은 서버를 제어하고 서버에서 프로세스를 실행할 수 있습니다. Ansible은 서버 노드에 설치하는 데 필요한 특별한 소프트웨어가 필요하지 않으며 SSH를 통해 이를 제어할 수 있습니다.

    이 가이드에서는 Ubuntu 22.04 서버에서 Ansible을 설치하고 구성하는 방법을 배웁니다.

    전제 조건

    • OpenSSH 서버가 설치된 Ubuntu 22.04를 실행하는 둘 이상의 서버 시스템.\n
    • 서버와 노드 모두 공용 IP 주소를 통해 액세스할 수 있습니다.\n
    • Sudo 권한이 있는 루트가 아닌 사용자는 Ansible 서버에 설정되고 비밀번호가 있는 루트 사용자는 Ansible 클라이언트에 설정됩니다.\n

    1단계 - Ansible 설치

    Ansibles 공식 리포지토리를 사용하여 최신 버전을 설치합니다. 서버에 Ansibles 공식 리포지토리를 추가합니다.

    $ sudo add-apt-repository ppa:ansible/ansible
    

    다행스럽게도 우분투는 우리가 설치할 Ansible 2.9와 함께 제공됩니다. 다음 명령을 실행하여 Ansible을 설치합니다.

    $ sudo apt install ansible -y
    

    다음 명령을 실행하여 설치를 테스트하십시오.

    $ ansible --version
    ansible [core 2.13.3rc1]
      config file = /etc/ansible/ansible.cfg
      configured module search path = ['/home/navjot/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
      ansible python module location = /usr/lib/python3/dist-packages/ansible
      ansible collection location = /home/navjot/.ansible/collections:/usr/share/ansible/collections
      executable location = /usr/bin/ansible
      python version = 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0]
      jinja version = 3.0.3
      libyaml = True
    

    python3-argcomplete 패키지를 설치하고 활성화하여 Ansible bash 완료 지원을 설정합니다.

    $ sudo apt install python3-argcomplete
    $ sudo activate-global-python-argcomplete3
    

    이제 Tab 키를 눌러 bash 셸에 대한 옵션 목록을 얻을 수 있습니다.

    2단계 - 인벤토리 파일 설정

    여러 호스트에 연결할 수 있으려면 노드의 세부 정보를 기록할 파일이 필요합니다. 이 파일을 인벤토리 파일이라고 합니다.

    제어하려는 서버 수에 따라 Ansibles Inventory 파일을 사용하여 그룹 및 하위 그룹으로 서버를 정렬할 수도 있습니다. 지침을 전달하는 동안 추가로 사용할 수 있는 선택 호스트 또는 그룹에 적용 가능한 사용자 지정 변수를 설정할 수도 있습니다.

    Ansible은 /etc/ansible/hosts에서 사용할 수 있는 기본 인벤토리 파일과 함께 제공됩니다. Nano 편집기로 엽니다.

    $ sudo nano /etc/ansible/hosts
    

    파일 맨 아래에 다음 코드를 붙여넣습니다.

    [servers]
    server1 ansible_host=203.0.113.111
    server2 ansible_host=203.0.113.112
    server3 ansible_host=203.0.113.113
    
    [all:vars]
    ansible_python_interpreter=/usr/bin/python3
    

    servers 섹션은 연결할 노드 목록을 정의합니다. 여러 그룹에 서버를 배치하기 위해 그룹을 얼마든지 만들 수 있습니다.

    all:vars 그룹은 인벤토리의 모든 호스트에서 ansible_python_interpreter 매개변수를 설정합니다. Ansible이 최신 Ubuntu 버전에서 제거된 Python 2 대신 Python 3 실행 파일을 사용하는지 확인합니다.

    완료되면 Ctrl + X를 누르고 변경 사항을 확인하라는 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    참고: 원하는 위치에 Inventory 파일을 생성한 다음 Ansible 명령을 실행하는 동안 -i 매개변수를 사용하여 전달할 수 있습니다.

    다음 명령으로 인벤토리 목록을 확인할 수 있습니다.

    $ ansible-inventory --list -y
    all:
      children:
        servers:
          hosts:
            server1:
              ansible_host: 203.0.113.111
              ansible_python_interpreter: /usr/bin/python3
            server2:
              ansible_host: 203.0.113.112
              ansible_python_interpreter: /usr/bin/python3
            server3:
              ansible_host: 203.0.113.113
              ansible_python_interpreter: /usr/bin/python3
        ungrouped: {}
    

    서버를 그룹 및 하위 그룹으로 구성

    특정 기능을 수행하는 일부 서버가 있는 많은 서버가 있는 경우 유용한 팁입니다. 예를 들어 이 방법을 사용하여 웹 서버와 데이터베이스 서버를 별도로 그룹화할 수 있습니다. 호스트를 여러 그룹의 일부로 만들 수도 있습니다. 이를 위해 인벤토리 파일은 다음과 같아야 합니다.

    [webservers]
    203.0.113.111
    203.0.113.112
    
    [dbservers]
    203.0.113.113
    server_hostname
    
    [development]
    203.0.113.111
    203.0.113.113
    
    [production]
    203.0.113.112
    server_hostname
    
    

    3단계 - SSH 키 설정

    Ansible이 서버에 연결할 수 있으려면 Ansible 서버와 인벤토리 파일에 지정된 호스트 간에 SSH 키를 구성해야 합니다. 이는 Ansible 클라이언트에 공개 키가 활성화되어 있지 않고 암호로 활성화된 루트 계정이 있는 경우에만 작동합니다.

    다음 단계를 사용하여 Ansible 및 해당 노드에 대한 SSH 키를 만들고 설정합니다.

    Ansible용 키를 만듭니다.

    $ ssh-keygen -t rsa -b 4096 -C "Ansible key"
    

    공개 키를 원격 서버의 계정에 복사합니다. 이를 위해 ssh-copy-id 명령을 사용합니다.

    $ ssh-copy-id -i $HOME/.ssh/id_rsa.pub 
    $ ssh-copy-id -i $HOME/.ssh/id_rsa.pub 
    $ ssh-copy-id -i $HOME/.ssh/id_rsa.pub 
    

    그게 다야. 이제 Ansible이 서버와 통신할 수 있어야 합니다.

    기존 공개 키를 사용하여 노드에서 SSH 키 설정

    클라이언트에 이미 공개 키가 활성화되어 있으면 특정 추가 단계를 따라야 합니다. 이를 위해서는 모든 노드 서버에서 Ansible에서만 액세스할 수 있는 새 사용자를 생성해야 합니다. 해당 사용자는 암호 없이 액세스할 수 있는 sudo 권한을 가지며 ansible 서버에서만 액세스할 수 있습니다.

    ansible 사용자를 생성하려면 다음 명령을 실행합니다.

    $ sudo adduser ansible
    

    강력한 암호를 선택하고 다른 모든 필드는 비워 둡니다.

    이제 다음 명령을 통해 이 사용자에 대한 암호 없는 sudo 액세스를 구성합니다.

    $ echo "ansible ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ansible
    

    이제 새 사용자를 추가하고 구성했으므로 다음 명령을 사용하여 ansible 서버에서 노드 서버로 SSH 키를 복사할 수 있습니다.

    $ ssh-copy-id 
    

    ansible 사용자의 비밀번호를 묻는 메시지가 표시됩니다. 입력하면 SSH 키가 복사됩니다.

    그런 다음 노드 서버에서 ansible 사용자에 대한 암호 기반 로그인을 비활성화합니다.

    $ sudo usermod -L ansible
    

    이제 노드 서버는 Ansible 서버에서만 액세스할 수 있습니다. 해당 서버에만 공개 키가 있고 비밀번호 로그인이 비활성화되어 있으므로 노드 서버에서 직접 sudo 권한으로 사용할 수 없기 때문입니다.

    각 노드 서버에 대해 이 단계를 반복해야 합니다. 또한 이 자습서에서 root 사용자를 ansible 사용자로 바꿉니다.

    4단계 - 연결 테스트

    인벤토리 파일과 SSH 키를 설정한 후 Ansible이 서버에 연결할 수 있는지 확인해야 합니다.

    다음 명령을 입력하여 연결을 확인하십시오. 이 명령은 인벤토리 파일에서 모든 서버에 대한 연결을 테스트합니다.

    $ ansible all -m ping -u root
    

    이 명령은 Ansibles ping 모듈을 사용하여 모든 서버에서 연결 테스트를 실행합니다. 다음과 같은 출력이 표시되어야 합니다.

    server1 | SUCCESS => {
        "changed": false,
        "ping": "pong"
    }
    server2 | SUCCESS => {
        "changed": false,
        "ping": "pong"
    }
    server3 | SUCCESS => {
        "changed": false,
        "ping": "pong"
    }
    

    Ansible을 처음 사용하는 경우 모든 서버의 신뢰성을 확인하라는 메시지가 표시됩니다. 메시지가 표시되면 yes를 입력하고 ENTER를 눌러 확인합니다.

    5단계 - 일부 기본 명령 실행

    Ansible을 사용하여 서버에서 몇 가지 기본 명령을 실행해 보겠습니다. 서버에서 명령을 실행하려면 다음 형식이 사용됩니다.

    $ ansible all -a "command" -u <username>
    

    디스크 사용량 확인

    먼저 모든 서버의 디스크 사용량을 확인하겠습니다.

    $ ansible all -a "df -h" -u root
    server1 | CHANGED | rc=0 >>
    Filesystem      Size  Used Avail Use% Mounted on
    tmpfs           198M  972K  197M   1% /run
    /dev/sda2        50G  3.9G   44G   9% /
    tmpfs           989M     0  989M   0% /dev/shm
    tmpfs           5.0M     0  5.0M   0% /run/lock
    tmpfs           198M  4.0K  198M   1% /run/user/1000
    
    server2 | CHANGED | rc=0 >>
    Filesystem      Size  Used Avail Use% Mounted on
    tmpfs           198M  922K  197M   1% /run
    /dev/sda2        50G  4.9G   43G  10% /
    tmpfs           989M     0  989M   0% /dev/shm
    tmpfs           5.0M     0  5.0M   0% /run/lock
    tmpfs           198M  4.0K  198M   1% /run/user/1000
    

    개별 호스트 및 그룹 대상 지정

    지금까지 우리는 모든 원격 서버에서 한 번에 명령을 실행했습니다. 그러나 항상 그런 것은 아닙니다. 하나의 서버에서만 명령을 실행하려면 다음 형식을 사용해야 합니다.

    $ ansible server1 -a "uptime" -u root
    server1 | CHANGED | rc=0 >>
     21:38:26 up 11 min,  2 users,  load average: 0.00, 0.20, 0.19
    

    위의 명령은 인벤토리 그룹에서 server1의 가동 시간을 확인합니다.

    다음 형식을 사용하여 여러 서버를 대상으로 지정할 수도 있습니다.

    $ ansible server1:server2 -m ping -u root
    

    인벤토리 파일에서 직접 그룹 또는 하위 그룹을 대상으로 지정할 수도 있습니다.

    $ ansible groupname -m ping -u <username>
    

    모든 서버 업데이트

    이 자습서에서는 모든 원격 서버가 Debian 또는 Ubuntu OS를 실행하고 있다고 가정합니다.

    다음 명령을 실행하여 모든 서버에서 소프트웨어를 업데이트하십시오.

    $ ansible all -m apt -a "update_cache=yes upgrade=yes" -u root
    

    -m 매개변수는 Ansible이 실행할 모듈을 정의합니다. -a 매개변수는 관련 모듈에 대한 인수 또는 명령을 나타냅니다. 여기에서는 마지막 예제에서 ping 모듈을 사용한 것처럼 서버를 업데이트하기 위해 Ansible의 apt 모듈을 사용하고 있습니다. update_cache는 서버의 APT 캐시를 업데이트하고 upgrade=yes는 Ansible에 apt 업그레이드를 실행하도록 지시합니다. 명령.

    위에 설명된 대로 ansible 사용자를 사용하는 경우 상승된 sudo 권한으로 실행되도록 ansible 명령을 수정해야 합니다.

    $ ansible server2 -m apt -a "update_cache=yes upgrade=yes" -K -b -u ansible
    

    여기서 -K는 권한 에스컬레이션 비밀번호를 요청합니다. -bbecome을 사용하여 다른 사용자가 될 수 있는 ansible 작업을 실행합니다. 두 변수를 결합하면 높은 sudo 권한으로 ansible을 실행할 수 있습니다. sudo 권한이 필요한 모든 명령에 이 명령을 사용해야 합니다.

    경우에 따라 이러한 업데이트 명령 중 일부는 재부팅이 필요할 수 있으므로 다음 명령을 실행하여 모든 서버를 재부팅하십시오.

    $ ansible all -a "reboot" -u root
    

    이것은 Ansible을 사용하여 실행할 수 있는 기본 명령 중 일부에 불과합니다.

    6단계 - 플레이북 소개

    위의 명령을 사용하면 일회성 작업을 실행할 수 있지만 여러 서버를 설정하거나 여러 서버에서 동일한 명령 시퀀스를 실행하려면 플레이북을 설정해야 합니다. 플레이북은 YAML로 작성된 파일이며 애플리케이션 및 서비스 설정을 위한 일련의 작업을 자동화하는 지침을 포함합니다.

    이제 Nginx를 설치하고 Ansible 노드에 HTML 페이지를 설정하기 위한 플레이북을 생성합니다. 홈 디렉토리에 Ansible용 디렉토리를 생성합니다.

    $ mkdir ~/ansible
    

    편집을 위해 플레이북 파일을 만들고 엽니다.

    $ cd ~/ansible
    $ nano testplaybook.yml
    

    플레이북은 YAML 형식을 사용하여 하나 이상의 플레이를 정의합니다. 플레이는 프로세스를 자동화하는 방식으로 배열된 일련의 순서가 지정된 작업입니다. 재생은 YAML 목록으로 정의됩니다.

    플레이를 정의하는 첫 번째 단계는 hosts: all 지시문을 사용하여 대상 호스트를 결정하는 것입니다. become 지시문은 슈퍼 사용자가 다음 작업을 실행해야 함을 나타내는 데 사용됩니다.

    사용자를 추가하는 작업, 모든 패키지를 업그레이드하는 작업, Nginx 서버를 설치하는 마지막 작업의 세 가지 작업을 정의합니다. 플레이북의 vars 섹션은 사용자 지정 변수를 정의하는 데 사용됩니다. 두 개의 변수를 정의합니다. 하나는 추가해야 하는 사용자에 대한 것이고 두 번째는 설치해야 하는 패키지의 상태를 정의하는 것입니다. 변수를 사용하려면 이중 중괄호로 변수 이름을 묶어야 합니다.

    ansible.builtin.user 모듈은 sudo 권한이 있는 새 사용자를 추가하는 데 사용됩니다. 사용자를 추가하기 위해 name, passwordgroup 변수를 사용하고 있습니다. group 변수는 sudo로 설정되어 사용자에게 수퍼유저 권한을 부여합니다. 플레이북 파일에 일반 텍스트 암호를 넣을 수 없으므로 SHA 해시 비밀을 추가합니다. 이를 위해 mkpasswd 유틸리티를 사용할 것입니다. 설치하려면 다음 명령을 실행하여 whois 패키지를 설치합니다.

    $ sudo apt install whois
    

    해시된 암호를 생성합니다. 일반적인 암호를 묻는 메시지가 표시되고 이에 대한 해시 문자열이 제공됩니다. 플레이북 파일에서 사용할 해시 키를 기록해 둡니다.

    $ mkpasswd --method=sha-512
    Password:
    $6$dGbprm2oVqClDDDh$Epk6r5eXYkYBaQpQpP.H7VCdz0g9Aj0aO8hjy/WXq4WmfQ7GvQP2/cl/cNhd7.LRFuCKix9uCF2t8X5/Pv0Lk1
    

    update_cache 지시문은 apt update 명령 및 upgrade: dist 와 마찬가지로 시스템 리포지토리 목록을 업데이트하는 것입니다. 지시문은 Ansible이 시스템 업그레이드를 수행하도록 지시합니다. 세 번째 작업은 Nginx 서버의 최신 버전을 설치하는 자명한 작업입니다.

    논의한 정보를 기반으로 다음 코드를 파일에 붙여넣습니다. password 변수의 값으로 얻은 해시 키를 붙여넣습니다.

    ---
    - name: Test playbook
      hosts: all
      become: true
      vars:
          state: latest
          user: navjot
      tasks:
      - name: Add the user {{ user }}
        ansible.builtin.user:
          name: "{{ user }}"
          password: '$6$dGbprm2oVqClDDDh$Epk6r5eXYkYBaQpQpP.H7VCdz0g9Aj0aO8hjy/WXq4WmfQ7GvQP2/cl/cNhd7.LRFuCKix9uCF2t8X5/Pv0Lk1'
          group: sudo
      - name: Upgrade all apt packages
        apt:
          update_cache: yes
          upgrade: dist
      - name: Install the {{ state }} of package "nginx"
        apt:
          name: "nginx"
          state: "{{ state }}"
    

    Ctrl + X를 누르고 변경 사항을 확인하라는 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    플레이북을 실행하려면 다음 명령을 실행합니다. --ask-become-pass 플래그는 상승된 작업을 수행하기 위해 루트 비밀번호를 요청합니다.

    $ ansible-playbook testplaybook.yml --ask-become-pass
    

    다음과 같은 결과가 표시됩니다.

    BECOME password:
    
    PLAY [Test playbook] ***************************************************************************************************
    
    TASK [Gathering Facts] *************************************************************************************************
    ok: [server1]
    ok: [server2]
    ok: [server3]
    
    TASK [Add the user casablanca] *****************************************************************************************
    changed: [server3]
    changed: [server2]
    changed: [server1]
    
    TASK [Upgrade all apt packages] ****************************************************************************************
    changed: [server1]
    changed: [server2]
    changed: [server3]
    
    TASK [Install the latest of package "nginx"] ***************************************************************************
    changed: [server3]
    changed: [server2]
    changed: [server1]
    
    PLAY RECAP *************************************************************************************************************
    server1                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    server2                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    server3                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    

    이것은 플레이북이 성공적으로 실행되었음을 확인합니다.

    사용자 지정 인벤토리 파일을 사용하는 경우 다음과 같이 명령에 파일 위치를 포함해야 합니다.

    $ ansible-playbook -i /etc/ansible/custominventory testplaybook.yml --ask-become-pass 
    

    결론

    이것으로 Ubuntu 22.04 서버에 Ansible을 설치하고 구성하는 방법에 대한 자습서를 마칩니다. 질문이 있으시면 아래 의견에 게시하십시오.