소개
Ansible 은 원격 서버 관리를 단순화하는 강력한 자동화 도구입니다. Ansible 의 중요한 측면 중 하나는 이러한 서버에 대한 안전한 SSH 연결을 설정하는 기능입니다. 이 튜토리얼에서는 Ansible 연결에 대한 기본 SSH 사용자를 설정하여 서버 관리 작업의 원활하고 효율적인 워크플로우를 보장하는 방법을 살펴보겠습니다.
Ansible 은 원격 서버 관리를 단순화하는 강력한 자동화 도구입니다. Ansible 의 중요한 측면 중 하나는 이러한 서버에 대한 안전한 SSH 연결을 설정하는 기능입니다. 이 튜토리얼에서는 Ansible 연결에 대한 기본 SSH 사용자를 설정하여 서버 관리 작업의 원활하고 효율적인 워크플로우를 보장하는 방법을 살펴보겠습니다.
Ansible SSH 사용자를 구성하기 전에, 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 프로젝트를 위한 디렉토리 구조를 만들어 보겠습니다. 이렇게 하면 파일을 체계적으로 정리하는 데 도움이 됩니다.
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 연결을 설정하는 방법과 기본 SSH 사용자를 구성하는 방법을 살펴보겠습니다.
기본적으로 Ansible 은 현재 시스템 사용자를 사용하여 SSH 연결을 설정하려고 시도합니다. 즉, labex 사용자로 로그인하여 Ansible 명령을 실행하면 Ansible 은 원격 호스트에 labex 사용자로 연결하려고 시도합니다.
이 기본 동작이 항상 원하는 것은 아닐 수 있습니다. 예를 들어:
Ansible 은 사용할 SSH 사용자를 결정하기 위해 구성 소스의 계층 구조를 사용합니다.
이것을 더 잘 이해하기 위해 기본 Ansible 구성 파일을 만들어 보겠습니다.
cat > ~/project/ansible/ansible.cfg << 'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
EOF
이 구성 파일은 Ansible 에게 다음을 지시합니다.
방금 만든 파일을 검토해 보겠습니다.
cat ~/project/ansible/ansible.cfg
방금 파일에 추가한 내용을 볼 수 있습니다.
이제 현재 사용자를 확인하기 위해 기본 Ansible 명령을 실행해 보겠습니다.
cd ~/project/ansible
ansible localhost -m command -a "whoami"
출력은 다음과 같아야 합니다.
localhost | CHANGED | rc=0 >>
labex
이는 Ansible 이 현재 사용자 (labex) 로 명령을 실행하고 있음을 확인합니다.
이제 Ansible 이 SSH 를 사용하는 방식을 이해했으므로, 연결에 대한 기본 SSH 사용자를 설정하는 다양한 방법을 살펴보겠습니다.
전역 기본 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 사용자로 사용하도록 지시합니다.
또 다른 방법은 인벤토리 파일에서 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를 추가했습니다.Ansible 명령을 실행할 때 명령줄에서 직접 SSH 사용자를 지정할 수도 있습니다.
ansible localhost -m command -a "whoami" -u specific_user
-u 옵션은 Ansible 에게 이 특정 명령에 대해 specific_user를 사용하도록 지시하여 구성 파일 또는 인벤토리에 정의된 모든 사용자를 재정의합니다.
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로 설정합니다.
이러한 다양한 방법의 우선 순위를 이해하는 것이 중요합니다.
-u 플래그) 이 가장 높은 우선 순위를 갖습니다.ansible.cfg의 remote_user)이는 더 구체적인 사용자 설정이 더 일반적인 설정을 재정의한다는 것을 의미합니다.
이제 다양한 방법으로 기본 SSH 사용자를 구성했으므로 구성을 테스트하고 확인해 보겠습니다.
먼저, 구성 파일 설정이 적용되었는지 확인하기 위해 간단한 Ansible 명령을 실행해 보겠습니다.
cd ~/project/ansible
ansible localhost -m command -a "whoami"
ansible_connection=local로 localhost 에 연결하고 있으므로, Ansible 은 remote_user 설정에 관계없이 현재 사용자로 명령을 실행합니다. 그러나 원격 연결인 경우 Ansible 은 구성에서 지정한 ansible_user 사용자를 사용하려고 시도합니다.
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 사용자 구성을 설정하는 방법을 보여주는 보다 현실적인 예제를 만들어 보겠습니다. 새 플레이북을 만들겠습니다.
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 사용자를 구성할 수 있는 다양한 수준을 보여줍니다.
이제 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 사용자를 사용합니다.Ansible 에서 SSH 사용자 구성과 관련된 문제가 발생하면 다음 문제 해결 단계를 따르세요.
Ansible 이 모든 변수 값을 포함하여 인벤토리를 해석하는 방식을 확인하려면 다음을 수행합니다.
ansible-inventory --list
상세 모드로 Ansible 을 실행하면 연결 문제를 식별하는 데 도움이 될 수 있습니다.
ansible localhost -m ping -vvv
-vvv 플래그는 상세 수준을 높여 SSH 연결 프로세스에 대한 자세한 정보를 표시합니다.
사용자 및 키가 작동하는지 확인하기 위해 SSH 연결을 수동으로 테스트할 수 있습니다.
ssh -i ~/.ssh/id_rsa username@hostname
일반적인 SSH 연결 오류는 다음과 같습니다.
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 사용자를 구성하는 방법을 배웠습니다. 이제 다음을 이해하게 되었습니다.
이러한 기술을 통해 Ansible 로 인프라를 보다 효과적으로 관리하고 원격 서버에 대한 안전하고 안정적인 연결을 보장할 수 있습니다. Ansible 연결에 대한 SSH 사용자를 적절하게 구성하면 적절한 보안 관행을 유지하면서 서로 다른 환경에서 일관된 자동화 워크플로우를 구현할 수 있습니다.