웹사이트 검색

Ansible을 사용하여 Rocky Linux 9에서 초기 서버 설정을 자동화하는 방법


소개

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

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

이 가이드는 Ansible을 사용하여 Rocky Linux 9 서버용 초기 서버 설정 가이드에 포함된 단계를 자동화하는 방법을 설명합니다.

전제 조건

이 자습서를 따르려면 다음이 필요합니다.

  • 하나의 Ansible 제어 노드: Ansible이 설치되고 SSH 키를 사용하여 Ansible 호스트에 연결하도록 구성된 Rocky Linux 9 시스템. Rocky Linux 9에서 Ansible을 설치 및 구성하는 방법에 설명된 대로 제어 노드에 sudo 권한이 있고 방화벽이 활성화된 일반 사용자가 있는지 확인하십시오. 일반적으로 정확히 동일한 Linux 버전에서 동일한 대상에 설치할 필요는 없습니다. 버전(예: 이 경우 Rocky Linux 9에서 Rocky Linux 9로)이지만 데모 목적으로 모든 항목을 일관되게 유지합니다.
  • Rocky Linux 9을 새로 설치한 원격 서버 1개: 이 서버에 사전 설정이 필요하지 않지만 위에서 언급한 Ansible 제어 노드에서 이 서버에 대한 SSH 액세스 권한이 있어야 합니다. Ansible 제어 노드에서 원격 서버에 대한 SSH 액세스 권한이 아직 없는 경우 SSH 키 설정 방법에 대한 자습서를 참조하십시오. 이 서버는 Ansible 제어 노드에 의한 자동 프로비저닝을 대상으로 하는 Ansible 호스트 원격 서버가 됩니다.

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

이 Ansible 플레이북은 서버를 부팅할 때마다 Rocky Linux 9에서 SSH 키 설정에 설명된 절차를 수동으로 실행하는 대안을 제공합니다. 플레이북을 한 번 설정하고 이후 모든 서버에서 사용하십시오.

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

  1. 새 sudo 사용자를 만들고 암호가 없는 sudo를 설정합니다.
  2. 로컬 SSH 공개 키를 복사하고 원격 호스트의 새 관리 사용자를 위한 authorized_keys 파일에 포함합니다(이전에 SSH에 비밀번호를 사용한 경우).
  3. 루트 사용자에 대한 암호 기반 인증을 비활성화합니다.
  4. 시스템 패키지를 설치합니다.

플레이북 실행이 완료되면 서버에 로그인하는 데 사용할 수 있는 새 사용자가 생깁니다.

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

1단계 — Ansible 제어 노드 준비

Ansible 제어 노드 서버에서 Ansible 호스트 원격 서버의 IP를 Ansible 인벤토리 파일에 추가합니다. vi 또는 원하는 텍스트 편집기를 사용하여 Ansible 인벤토리 파일을 엽니다.

  1. sudo vi /etc/ansible/hosts

이렇게 하면 Ansible 인벤토리 파일이 열립니다. Ansible 호스트 원격 서버의 IP를 [servers] 블록에 추가합니다.

[servers]
server1 ansible_host=your_remote_server_ip

. . .

파일을 저장하고 닫습니다.

이제 이 Ansible 제어 노드와 Ansible 호스트 원격 서버 간의 SSH 연결을 테스트하고 인증합니다.

  1. ssh root@your_remote_server_ip

인증 요청을 수락하고 메시지가 표시되면 비밀번호를 입력합니다. SSH 연결을 확인했으면 CTRL+D를 눌러 연결을 닫고 제어 노드로 돌아갑니다.

2단계 - 플레이북 준비

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

  1. vi playbook.yml

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

---
- hosts: all
  become: true
  vars:
    created_username: sammy

사용자 이름을 원하는 것으로 바꾸셔도 됩니다.

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

vars를 사용하면 변수에 데이터를 저장할 수 있습니다. 나중에 이 사용자 이름을 변경하기로 결정한 경우 파일에서 이 한 줄만 편집하면 됩니다.

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

3단계 - 플레이북에 Sudo 사용자 설정 작업 추가

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

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

루트 사용자를 광범위하게 사용하지 않는 것이 좋습니다. 다음을 추가하여 sudo 권한이 부여된 사용자 생성을 자동화할 수 있습니다.

  tasks:
    - name: Setup passwordless sudo
      lineinfile:
        path: /etc/sudoers
        state: present
        regexp: '^%sudo'
        line: '%sudo ALL=(ALL) NOPASSWD: ALL'
        validate: '/usr/sbin/visudo -cf %s' 

    - name: Create a new regular user with sudo privileges
      user:
        name: "{{ created_username }}"
        state: present
        groups: wheel
        append: true
        create_home: true

lineinfile Ansible 모듈을 사용하여 파일의 특정 줄을 대상으로 지정하고 바꿉니다. 이 경우 정규식을 사용하여 sudoers 파일의 특정 줄을 대상으로 지정한 다음 암호 없이 sudo를 사용할 수 있도록 수정합니다. 또한 visudo를 사용하여 변경 사항을 확인하여 중단되지 않도록 합니다.

이를 활용하기 위해 user 모듈을 사용하여 새 사용자를 추가합니다. Ansible은 이 사용자가 아직 존재하지 않는 경우 생성되고 사용자가 다른 그룹에서 제거되지 않는 동안 wheel(admin) 그룹에 속하며 홈 디렉토리가 생성되도록 합니다.

참고: 변수를 나타내는 중괄호 주위에 따옴표를 포함해야 합니다. 이러한 따옴표를 생략하는 것은 매우 일반적인 Ansible 구문 오류입니다.

4단계 - 플레이북에 SSH 키 설정 추가 및 루트 암호 작업 비활성화

Ansible은 SSH 키를 사용한다는 가정하에 작동합니다. SSH 키 사용과 루트 암호 인증 비활성화를 결합하는 것이 강력히 권장되며 일반적으로 좋은 방법입니다. 이를 자동화하려면 다음을 추가하십시오.

    - name: Set authorized key for remote user
      ansible.posix.authorized_key:
        user: "{{ created_username }}"
        state: present
        key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"

    - name: Disable password authentication for root
      lineinfile:
        path: /etc/ssh/sshd_config
        state: present
        regexp: '^#?PermitRootLogin'
        line: 'PermitRootLogin prohibit-password'

사용자 이름과 키 위치를 제공하면 authorized_key 모듈을 사용할 수 있습니다. 여기서 키에 대한 경로는 Ansible의 lookup 기능을 사용하여 구축됩니다.

lineinfile 모듈은 sshd_config에서 줄을 검색하고 교체하여 루트에 대한 암호 인증을 비활성화하고 강화된 보안을 위해 권한에 대한 액세스를 제한하는 데 사용됩니다.

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

Ansible은 특정 패키지가 항상 서버에 설치되도록 할 수 있습니다. 각 개별 패키지에서 dnf install을 호출하거나 여러 작업으로 나누는 대신 원하는 모든 패키지를 나열할 수 있습니다.

    - name: Update and install required system packages
      dnf:
        pkg:
          - curl
          - vim
          - git
          - firewalld
        state: latest
        update_cache: true

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

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

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

---
- hosts: all
  become: true
  vars:
    created_username: sammy

  tasks:
    - name: Setup passwordless sudo
      lineinfile:
        path: /etc/sudoers
        state: present
        regexp: '^%sudo'
        line: '%sudo ALL=(ALL) NOPASSWD: ALL'
        validate: '/usr/sbin/visudo -cf %s'

    - name: Create a new regular user with sudo privileges
      user:
        name: "{{ created_username }}"
        state: present
        groups: wheel
        append: true
        create_home: true

    - name: Set authorized key for remote user
      ansible.posix.authorized_key:
        user: "{{ created_username }}"
        state: present
        key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"

    - name: Disable password authentication for root
      lineinfile:
        path: /etc/ssh/sshd_config
        state: present
        regexp: '^#?PermitRootLogin'
        line: 'PermitRootLogin prohibit-password'

    - name: Update and install required system packages
      dnf:
        pkg:
          - curl
          - vim
          - git
          - firewalld
        state: latest
        update_cache: true

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

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

7단계 - 처음으로 플레이북 실행

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

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

  1. ansible-playbook playbook.yml -l server1 -u root -k

-l 플래그는 서버를 지정하고 -u 플래그는 원격 서버에 로그인할 사용자를 지정합니다. 아직 원격 서버를 설정하지 않았으므로 루트가 유일한 옵션입니다. 암호가 없는 SSH를 사용하지 않는 경우 -k 플래그가 필요합니다. SSH 암호를 묻는 메시지가 표시됩니다.

다음과 유사한 출력이 표시됩니다.

Output
. . . PLAY RECAP *************************************************************************************************************************************************************************************************************************************************** server1 : ok=6 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

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

이제 플레이북에 대한 첫 번째 설정을 완료했으므로 이후의 모든 ansible 호출은 사용자 sammy(비밀번호를 사용한 경우 -k 플래그 없이)로 수행할 수 있습니다. 우선):

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

다음을 사용하여 서버에 로그인할 수도 있습니다.

  1. ssh sammy@your_remote_server_ip

sammycreated_username 변수로 정의된 사용자로 바꾸고 server_host_or_IP를 서버의 호스트 이름 또는 IP 주소로 바꾸십시오.

결론

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

이 가이드에서는 sudo 액세스 권한이 있는 루트가 아닌 사용자 생성, 패키지 설치 및 원격 암호 비활성화와 같이 새로운 서버에서 실행해야 하는 초기 작업을 자동화하기 위해 Ansible을 사용하는 방법을 보여주었습니다. - 기반 루트 로그인.

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

이 플레이북에 새로운 작업을 포함하여 초기 서버 설정을 추가로 사용자 정의하려면 Ansible 소개 가이드 Ansible 역할을 사용하여 인프라 환경을 추상화하는 방법을 참조하십시오.