Ansible 연결을 위한 기본 SSH 사용자 설정 방법

AnsibleBeginner
지금 연습하기

소개

Ansible 은 원격 서버 관리를 단순화하는 강력한 자동화 도구입니다. Ansible 의 중요한 측면 중 하나는 이러한 서버에 대한 안전한 SSH 연결을 설정하는 기능입니다. 이 튜토리얼에서는 Ansible 연결에 대한 기본 SSH 사용자를 설정하여 서버 관리 작업의 원활하고 효율적인 워크플로우를 보장하는 방법을 살펴보겠습니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 중급 레벨의 실험이며 완료율은 71%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

Ansible 설치 및 설정

Ansible SSH 사용자를 구성하기 전에, Ansible 이 시스템에 제대로 설치되고 설정되었는지 확인해야 합니다.

Ansible 설치

Ansible 을 설치하는 것으로 시작해 보겠습니다. 터미널을 열고 다음 명령을 실행합니다.

sudo apt update
sudo apt install -y ansible

설치가 완료되면 Ansible 버전을 확인하여 Ansible 이 올바르게 설치되었는지 확인합니다.

ansible --version

다음과 유사한 출력을 볼 수 있습니다.

ansible [core 2.12.x]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  ansible collection location = /home/labex/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.10.x (main, Ubuntu, x86_64)
  jinja version = 3.0.3
  libyaml = True

Ansible 작업 디렉토리 생성

다음으로, Ansible 프로젝트를 위한 디렉토리 구조를 만들어 보겠습니다. 이렇게 하면 파일을 체계적으로 정리하는 데 도움이 됩니다.

mkdir -p ~/project/ansible/inventory
cd ~/project/ansible

기본 인벤토리 파일 생성

Ansible 은 관리하는 호스트를 정의하기 위해 인벤토리 파일을 사용합니다. 간단한 인벤토리 파일을 만들어 보겠습니다.

echo "[webservers]
localhost ansible_connection=local" > ~/project/ansible/inventory/hosts

이 인벤토리 파일은 webservers라는 그룹을 정의하며, localhost라는 하나의 호스트만 포함하고, Ansible 에게 이 호스트에 대해 SSH 대신 로컬 연결을 사용하도록 지시합니다.

이제 인벤토리를 확인해 보겠습니다.

ansible -i inventory/hosts --list-hosts all

다음과 같은 출력을 볼 수 있습니다.

  hosts (1):
    localhost

이는 Ansible 이 인벤토리와 그 안에 정의된 호스트를 인식한다는 것을 보여줍니다.

Ansible SSH 연결 및 구성 이해

Ansible 은 주로 SSH 를 사용하여 원격 호스트에 연결하고 명령을 실행합니다. Ansible 이 SSH 연결을 설정하는 방법과 기본 SSH 사용자를 구성하는 방법을 살펴보겠습니다.

Ansible 이 SSH 를 사용하는 방법

기본적으로 Ansible 은 현재 시스템 사용자를 사용하여 SSH 연결을 설정하려고 시도합니다. 즉, labex 사용자로 로그인하여 Ansible 명령을 실행하면 Ansible 은 원격 호스트에 labex 사용자로 연결하려고 시도합니다.

이 기본 동작이 항상 원하는 것은 아닐 수 있습니다. 예를 들어:

  • 원격 서버는 액세스를 위해 다른 사용자를 요구할 수 있습니다.
  • 자동화 작업에 전용 사용자를 사용하고 싶을 수 있습니다.
  • 서로 다른 서버는 서로 다른 사용자를 요구할 수 있습니다.

Ansible 구성 계층 구조

Ansible 은 사용할 SSH 사용자를 결정하기 위해 구성 소스의 계층 구조를 사용합니다.

  1. 명령줄 옵션 (최고 우선 순위)
  2. 플레이북의 작업별 옵션
  3. 인벤토리의 호스트 및 그룹 변수
  4. Ansible 구성 파일
  5. 기본값 (최저 우선 순위)

이것을 더 잘 이해하기 위해 기본 Ansible 구성 파일을 만들어 보겠습니다.

cat > ~/project/ansible/ansible.cfg << 'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
EOF

이 구성 파일은 Ansible 에게 다음을 지시합니다.

  • 기본적으로 인벤토리 파일을 사용합니다.
  • 호스트 키 확인을 비활성화합니다 (랩 환경에서 테스트하는 데 유용합니다).

방금 만든 파일을 검토해 보겠습니다.

cat ~/project/ansible/ansible.cfg

방금 파일에 추가한 내용을 볼 수 있습니다.

기본 Ansible 명령 테스트

이제 현재 사용자를 확인하기 위해 기본 Ansible 명령을 실행해 보겠습니다.

cd ~/project/ansible
ansible localhost -m command -a "whoami"

출력은 다음과 같아야 합니다.

localhost | CHANGED | rc=0 >>
labex

이는 Ansible 이 현재 사용자 (labex) 로 명령을 실행하고 있음을 확인합니다.

Ansible 의 기본 SSH 사용자 설정

이제 Ansible 이 SSH 를 사용하는 방식을 이해했으므로, 연결에 대한 기본 SSH 사용자를 설정하는 다양한 방법을 살펴보겠습니다.

방법 1: Ansible 구성 파일 사용

전역 기본 SSH 사용자를 설정하는 가장 간단한 방법은 Ansible 구성 파일을 사용하는 것입니다. ansible.cfg 파일을 수정해 보겠습니다.

cat > ~/project/ansible/ansible.cfg << 'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
remote_user = ansible_user
EOF

이 구성에서 remote_user 매개변수를 추가했습니다. 이 매개변수는 Ansible 에게 모든 연결에 대해 ansible_user를 기본 SSH 사용자로 사용하도록 지시합니다.

방법 2: 인벤토리 파일에서 사용자 설정

또 다른 방법은 인벤토리 파일에서 SSH 사용자를 정의하는 것입니다. 이 방법을 사용하면 서로 다른 호스트 또는 그룹에 대해 서로 다른 사용자를 설정할 수 있습니다.

인벤토리 파일을 수정해 보겠습니다.

cat > ~/project/ansible/inventory/hosts << 'EOF'
[webservers]
localhost ansible_connection=local

[dbservers]
db.example.com ansible_user=db_admin

[all:vars]
ansible_user=default_user
EOF

이 예에서:

  • dbservers라는 새 그룹을 추가하고 db.example.com 호스트를 추가했으며, Ansible 이 이 호스트에 연결할 때 db_admin 사용자를 사용하도록 지정했습니다.
  • 또한 재정의되지 않는 한 모든 호스트에 적용되는 그룹 변수 ansible_user=default_user를 추가했습니다.

방법 3: 명령줄 옵션 사용

Ansible 명령을 실행할 때 명령줄에서 직접 SSH 사용자를 지정할 수도 있습니다.

ansible localhost -m command -a "whoami" -u specific_user

-u 옵션은 Ansible 에게 이 특정 명령에 대해 specific_user를 사용하도록 지시하여 구성 파일 또는 인벤토리에 정의된 모든 사용자를 재정의합니다.

방법 4: 플레이북에서 사용자 설정

Ansible 플레이북을 사용할 때 플레이 수준에서 SSH 사용자를 지정할 수 있습니다.

이를 시연하기 위해 간단한 플레이북을 만들어 보겠습니다.

cat > ~/project/ansible/user_demo.yml << 'EOF'
---
- name: Demonstrate user configuration
  hosts: localhost
  remote_user: playbook_user
  
  tasks:
    - name: Show current user
      command: whoami
      register: current_user
      
    - name: Display current user
      debug:
        msg: "Current user is {{ current_user.stdout }}"
EOF

이 플레이북에서 remote_user 매개변수는 이 플레이의 모든 작업에 대해 SSH 사용자를 playbook_user로 설정합니다.

Ansible 의 사용자 우선 순위

이러한 다양한 방법의 우선 순위를 이해하는 것이 중요합니다.

  1. 명령줄 옵션 (-u 플래그) 이 가장 높은 우선 순위를 갖습니다.
  2. 플레이북의 작업 수준 설정
  3. 플레이북의 플레이 수준 설정
  4. 인벤토리의 호스트 변수
  5. 인벤토리의 그룹 변수
  6. 구성 파일 설정 (ansible.cfgremote_user)
  7. 기본 시스템 사용자 (가장 낮은 우선 순위)

이는 더 구체적인 사용자 설정이 더 일반적인 설정을 재정의한다는 것을 의미합니다.

SSH 사용자 구성 테스트 및 확인

이제 다양한 방법으로 기본 SSH 사용자를 구성했으므로 구성을 테스트하고 확인해 보겠습니다.

구성 파일 설정 테스트

먼저, 구성 파일 설정이 적용되었는지 확인하기 위해 간단한 Ansible 명령을 실행해 보겠습니다.

cd ~/project/ansible
ansible localhost -m command -a "whoami"

ansible_connection=local로 localhost 에 연결하고 있으므로, Ansible 은 remote_user 설정에 관계없이 현재 사용자로 명령을 실행합니다. 그러나 원격 연결인 경우 Ansible 은 구성에서 지정한 ansible_user 사용자를 사용하려고 시도합니다.

ansible-inventory 를 사용하여 사용자 설정 확인

Ansible 은 SSH 사용자 설정을 포함하여 Ansible 이 인벤토리를 해석하는 방식을 확인할 수 있는 ansible-inventory라는 명령을 제공합니다.

ansible-inventory --list

이 명령은 인벤토리의 JSON 표현을 출력하여 SSH 사용자 설정을 포함하여 각 호스트와 관련된 모든 변수를 표시합니다.

플레이북으로 사용자 설정 테스트

이전 단계에서 만든 플레이북을 실행해 보겠습니다.

ansible-playbook user_demo.yml

출력은 다음과 유사하게 표시됩니다.

PLAY [Demonstrate user configuration] ******************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Show current user] *******************************************************
changed: [localhost]

TASK [Display current user] ****************************************************
ok: [localhost] => {
    "msg": "Current user is labex"
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

출력은 명령이 여전히 labex 사용자로 실행됨을 보여줍니다. 이는 ansible_connection=local로 localhost 에 연결하고 있기 때문에 예상되는 동작입니다.

실제 SSH 사용자 구성 예제 만들기

원격 호스트에 대한 SSH 사용자 구성을 설정하는 방법을 보여주는 보다 현실적인 예제를 만들어 보겠습니다. 새 플레이북을 만들겠습니다.

cat > ~/project/ansible/remote_user_example.yml << 'EOF'
---
- name: Example of remote user configuration
  hosts: all
  remote_user: admin_user
  
  tasks:
    - name: This task uses the play-level user (admin_user)
      debug:
        msg: "This would run as admin_user"
      
    - name: This task uses a specific user
      debug:
        msg: "This would run as operator_user"
      remote_user: operator_user
      
    - name: This task uses become to elevate privileges
      debug:
        msg: "This would run as the root user"
      become: true
      become_user: root
EOF

이 플레이북에서:

  • 플레이 수준에서 remote_user: admin_user를 설정하여 기본적으로 모든 작업에 적용합니다.
  • 두 번째 작업은 remote_user: operator_user로 이를 재정의합니다.
  • 세 번째 작업은 become: true를 사용하여 권한을 root 사용자로 승격합니다.

이 예제는 Ansible 에서 SSH 사용자를 구성할 수 있는 다양한 수준을 보여줍니다.

고급 SSH 사용자 구성 및 문제 해결

이제 Ansible 의 기본 SSH 사용자 설정을 다루었으므로, 몇 가지 고급 기술과 문제 해결 단계를 살펴보겠습니다.

Ansible 과 함께 SSH 키 사용

원격 호스트에 연결할 때 암호 대신 SSH 키 인증을 사용하는 것이 가장 좋습니다. Ansible 에서 SSH 키 인증을 구성하는 방법을 살펴보겠습니다.

cat > ~/project/ansible/ssh_key_example.yml << 'EOF'
---
- name: Example using SSH key authentication
  hosts: all
  remote_user: secure_user
  vars:
    ansible_ssh_private_key_file: ~/.ssh/id_rsa
  
  tasks:
    - name: Show SSH connection details
      debug:
        msg: "Connecting as {{ ansible_user }} using key {{ ansible_ssh_private_key_file }}"
EOF

이 예에서:

  • remote_user: secure_user를 기본 SSH 사용자로 설정했습니다.
  • ansible_ssh_private_key_file을 사용하여 사용할 SSH 개인 키 파일을 지정했습니다.

서로 다른 환경에 대해 서로 다른 사용자 설정

실제 시나리오에서는 서로 다른 환경 (개발, 스테이징, 프로덕션) 에 대해 서로 다른 SSH 사용자를 사용하고 싶을 수 있습니다. 이를 달성하는 방법을 살펴보겠습니다.

mkdir -p ~/project/ansible/group_vars

이제 서로 다른 환경에 대한 그룹 변수 파일을 만들어 보겠습니다.

cat > ~/project/ansible/group_vars/development << 'EOF'
---
ansible_user: dev_user
EOF

cat > ~/project/ansible/group_vars/production << 'EOF'
---
ansible_user: prod_user
ansible_ssh_private_key_file: ~/.ssh/prod_key
EOF

이러한 환경 그룹을 포함하도록 인벤토리 파일을 업데이트합니다.

cat > ~/project/ansible/inventory/hosts << 'EOF'
[webservers]
localhost ansible_connection=local

[development]
dev.example.com

[production]
prod1.example.com
prod2.example.com

[all:vars]
ansible_user=default_user
EOF

이 구성으로:

  • development 그룹의 호스트는 dev_user SSH 사용자를 사용합니다.
  • production 그룹의 호스트는 prod_user SSH 사용자와 특정 SSH 키를 사용합니다.
  • 다른 모든 호스트는 default_user SSH 사용자를 사용합니다.

SSH 사용자 구성 문제 해결

Ansible 에서 SSH 사용자 구성과 관련된 문제가 발생하면 다음 문제 해결 단계를 따르세요.

1. Ansible 의 해석된 인벤토리 확인

Ansible 이 모든 변수 값을 포함하여 인벤토리를 해석하는 방식을 확인하려면 다음을 수행합니다.

ansible-inventory --list

2. 상세 모드로 Ansible 실행

상세 모드로 Ansible 을 실행하면 연결 문제를 식별하는 데 도움이 될 수 있습니다.

ansible localhost -m ping -vvv

-vvv 플래그는 상세 수준을 높여 SSH 연결 프로세스에 대한 자세한 정보를 표시합니다.

3. SSH 연결 수동 테스트

사용자 및 키가 작동하는지 확인하기 위해 SSH 연결을 수동으로 테스트할 수 있습니다.

ssh -i ~/.ssh/id_rsa username@hostname

4. SSH 연결 오류 확인

일반적인 SSH 연결 오류는 다음과 같습니다.

  • 권한 거부 (공개 키): SSH 키 인증에 문제가 있음을 나타냅니다.
  • 호스트 키 확인 실패: 호스트 키가 변경된 경우 발생합니다.
  • 연결 거부: SSH 서비스가 실행되고 있지 않거나 방화벽에 의해 차단되었음을 나타냅니다.

5. Ansible 구성 테스트 플레이북 만들기

SSH 사용자 구성을 테스트하기 위해 간단한 플레이북을 만들어 보겠습니다.

cat > ~/project/ansible/test_ssh_config.yml << 'EOF'
---
- name: Test SSH user configuration
  hosts: all
  gather_facts: no
  
  tasks:
    - name: Display connection information
      debug:
        msg: |
          Connected to: {{ inventory_hostname }}
          User: {{ ansible_user | default('not set') }}
          SSH Key: {{ ansible_ssh_private_key_file | default('not set') }}
EOF

각 호스트에 대한 연결 정보를 확인하려면 이 플레이북을 실행합니다.

ansible-playbook -i inventory/hosts test_ssh_config.yml

이 플레이북은 각 호스트에 대해 Ansible 이 사용하고 있는 SSH 사용자 및 키를 표시하여 구성 문제를 식별하는 데 도움이 될 수 있습니다.

요약

이 랩에서는 다양한 방법을 사용하여 Ansible 연결에 대한 기본 SSH 사용자를 구성하는 방법을 배웠습니다. 이제 다음을 이해하게 되었습니다.

  1. 기본 구성을 사용하여 Ansible 을 설치하고 설정합니다.
  2. Ansible 구성 파일을 통해 기본 SSH 사용자를 구성합니다.
  3. 인벤토리, 플레이북 및 명령줄에서 서로 다른 수준으로 SSH 사용자를 설정합니다.
  4. SSH 사용자 구성을 확인하고 테스트합니다.
  5. 일반적인 SSH 연결 문제를 해결합니다.

이러한 기술을 통해 Ansible 로 인프라를 보다 효과적으로 관리하고 원격 서버에 대한 안전하고 안정적인 연결을 보장할 수 있습니다. Ansible 연결에 대한 SSH 사용자를 적절하게 구성하면 적절한 보안 관행을 유지하면서 서로 다른 환경에서 일관된 자동화 워크플로우를 구현할 수 있습니다.