mingming

Ansible - 관리 노드 연결 ( SSH Key & Password ) 본문

새싹 하이브리드 클라우드/Ansible

Ansible - 관리 노드 연결 ( SSH Key & Password )

mingming_96 2023. 11. 11. 10:28

관리 노드 연결

  • Ansible의 제어 노드는 기본적으로 OpenSSH를 통해 접속하게 됩니다. 
  • Ansible은 기본적으로 제어 노드의 현재 로그인 된사용자와 같은 이름의사용자를 사용하여 관리 노드에 연결합니다. 또한 기본적으로 제어 노드의 SSH 키로 인증을 시도합니다.  
  • 인증 방식으론 SSH 패스워드 인증과 SSH 키 기반 인증 두가지가 있습니다.

 

SSH Key 기반 인증 

 

1. SSH Key 생성 

ssh-keygen -f ~/.ssh/id_resa

 

2. 관리 노드에 SSH 키 복사

ssh-copy-id worker

 

 

SSH 패스워드 인증

  • Ansible 구성 파일에 ask_pass =true 설정
  • ansible/ansible-playbook 명령 : -k 옵션 혹은 --ask-pass 옵션 사용 

호스트 키 확인

  • SSH 접속 대상에 대한 호스트 키는 ~/.ssh/known_hosts 파일에 존재합니다. Ansible은 기본적으로 SSH 접속 대상에 대한 호스트 키 검사가 활성화 되어 있습니다.
  • 만약 한 번도 접속한 적 없는 호스트라면 제어 노드에 대한 키 정보가 없기 때문에 오류가 발생하게 됩니다. 
  • Ansible을 이용해 관리 노드로 접근하기 전에 먼저 SSH 지문을 확인해 known_hosts 파일에 기록합니다
  • 구성 파일을 이용해 호스트 키 확인을 비활성화 합니다. 
[defaults]
host_key_checking=false

 

사용자 변경

  • Ansible은 SSH 인증할 사용자를 설정하지 않으면 제어 노드의 현재 사용자 이름으로 관리 노드에 접근합니다. 
  • Ansible 구성 파일에 접근할 사용자 이름을 지정할 수 있습니다.
[defaults]
remote_user=<remote_user>
  • -u 옵션 혹은 --user 옵션을 사용해 접근할 사용자 이름을 지정할 수 있습니다.
  • 플레이북에 remote_user를 지정할 수 있습니다.
---
- hosts:
  remote_user=<remote_user>

 

권한 상승

  • 관리 노드에 접근한 사용자가 root 권한을 이용하기 위한 설정입니다. 패키지 설치 혹은 시스템 관리자 권한으로 작업해야 하는 경우 반드시 필요합니다. 
  • 권한 상승을 위해 Ansible 구성 파일을 설정할 수 있습니다.
[priviilege_escalation]
become=true
  • -b 옵션 혹은 --become 옵션을 사용할 수 있습니다.
  • 플레이북에 지정할 수 있습니다.
---
- hosts: webservers
  become: true

 

Passwordless sudo 설정 

  • 기본적으로 패스워드 인증 없이 권한 상승을 이용하기 위해선 sudoers 파일에 기록이 되어 있어야 합니다. 
  • /etc/sudoers 또는 /etc/sudoers.d/<FILE> 파일을 생성하거나 수정합니다.
  • sudo 명령어를 실행할 때 비밀번호를 요구하지 않아야 합니다. 
USER_NAME ALL=(ALL) NOPASSWD: ALL

 

Password sudo 설정

  • Ansible 구성파일 설정 
[privilege_escalation]
become_ask_pass=true
  • -K 또는 --ask-become-pass 옵션을 사용할 수 있습니다.

 

실습 1. 제어 노드의 ssh-key를 관리 노드에 전송하는 플레이북 작성

 

1. 인벤토리 파일 작성

[worker]
192.168.56.112

 

2. ansible.cfg 구성 파일 작성

[defaults]
inventory=./inventory
remote_user=slave
ask_pass=true

 

3. 플레이북 작성

---
- name: ssh key test
  hosts: all
  tasks:
    - name: ssh key test
      authorized_key:
        user: slave
        state: present
        key: "{{ item }}"
      with_file:
        - ~/.ssh/id_rsa.pub

 

4. 플레이북 실행

ansible-playbook deploy_ssh_key.yaml

[master@master ansible_ssh_key_test]$ ansible-playbook deploy_ssh_key.yaml
SSH password:

PLAY [ssh key test] ************************************************************

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

TASK [keycopy] *****************************************************************
changed: [192.168.56.112] =>

PLAY RECAP *********************************************************************
192.168.56.112             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

 

 

실습 2. 관리 노드에 user01 사용자를 만들고 sudo 권한을 사용할 때 비밀번호를 요구하지 않도록 설정해 user01 사용자에게 root 권한을 사용하여 id_rsa.pub 파일을 전달하는 플레이북을 작성

 

1. ansible.cfg 파일 수정

[defaults]
inventory=./inventory

[privilege_escalation]
become_user=root
become_method=sudo

 

2. user 생성하는 플레이북 작성

---
- name: create user01
  hosts: worker
  remote_user: slave
  become_ask_pass=true
  tasks:
    - name: use user module 
      user:
        name: user01
        
    - name: passwordless setting 
      lineinfile:
        path: /etc/sudoers
        line: "user01 ALL=(ALL) NOPASSWORD: ALL"

 

3. ssh 공개키 전송하는 플레이북 작성

---
- name: ssh key 
  hosts: worker
  tasks:
    - name: key copy
      authorized_key:
        user: user01
        state: present
        key: "{{ item }}"
      with_file:
        - ~/.ssh/id_rsa.pub

 

'새싹 하이브리드 클라우드 > Ansible' 카테고리의 다른 글

Ansible - 반복문 & 조건문  (1) 2023.11.19
Ansible - 변수  (0) 2023.11.18
Ansible - ad-hoc & playbook  (0) 2023.11.18
Ansible - 설치 & 인벤토리 및 구성파일  (0) 2023.11.10