Ansible Playbook 으로 ssh-copy-id 자동화하기
처음에는 뭣도 모르고, 80대가 넘는 managed node에 직접 ssh-copy-id 로 ssh public key를 전송하고, ssh 접속 테스트까지 했다… 근데 이것 또한 Ansible로 자동화가 가능하다! Ansible은 정말 미쳤다!
아래에서 설명할 playbook yml 파일에서 사용되는 hosts 파일의 내용은 다음과 같다.
아래처럼 hosts 파일에 그룹별로 나누어 IP를 작성하면, 아래 단계를 모두 적용시켜야 하는지, 부분 적용시켜야 하는 지를 hosts 파일 수정만으로 구분이 가능하게 되므로 참고하자!
[KNOWN_HOSTS]
10.123.123.11
[AUTHORIZED_KEYS]
10.123.123.12
[EXISTING_RSA_KEYS]
10.123.123.13
[PLAYBOOK_TEST]
10.123.123.14
- [KNOWN_HOSTS] : 아래에서 설명할 'auto_add_known_hosts.yml' playbook 을 실행시킬 대상
-> Control Node 상에서 ~/.ssh/known_hosts 파일에 Managed Node(Remote Host) 정보들이 등록되지 않아 있는 상태이므로, 첫 번째 playbook 의 수행 대상이 되는 그룹이다. - [AUTHORIZED_KEYS] : 아래에서 설명할 'auto_authorized_keys.yml' playbook 을 실행시킬 대상
-> Control Node 상의 ~/.ssh/known_hosts 파일에는 기재가 되었고, 이후에 Managed Node의 ~/.ssh/authorized_keys 파일에 Control Node의 ssh public key 파일 내용을 기재해주어야 하므로, 이 작업 대상이 되는 그룹이다. - [EXISTING_RSA_KEYS] : 아래에서 설명할 'remove_rsa_authorized_keys.yml' playbook 을 실행시킬 대상
-> 이미 Control Node의 RSA 방식의 public key 값의 내용을 ~/.ssh/authorized_keys 파일에 가지고 있는 Managed Node들이 들어가는 그룹이다. - [PLAYBOOK_TEST] : 아래에서 설명할 'uptime_test.yml' playbook 을 실행시킬 대상
-> known_hosts, authorized_keys 파일 작업 수행 후에, 이 그룹에 있는 Managed Node 들에 대해 ssh 로 테스트 명령어를 수행하도록 하는 playbook 을 실행시킬 대상이다.
아래에 Ansible Playbook 으로 동작시킬 YAML 파일 코드를 첨부한다.
1. known_hosts 등록
: Control Node의 ~/.ssh/known_hosts 에 Managed-Node들을 등록
# auto_add_known_hosts.yml
---
- hosts: KNOWN_HOSTS
connection: local
serial: 1
gather_facts: no
tasks:
- name : Get known_hosts fingerprint for remote nodes from local host (Ansible Server)
command: "/usr/bin/ssh-keyscan -t ed25519 {{ ansible_host }}"
register: keyscan # 원격지 호스트에 대한 fingerprint 를 스캔
- name: Add ansible_host to known_hosts
lineinfile:
path: ~/.ssh/knwon_hosts
line: "{{ item }}"
create: yes
with_items:
- "{{ keyscan.stdout_lines }}"
playbook 수행 명령어
ansible-playbook -i [hosts 파일 path] ['auto_add_known_hosts.yml' path] -k
2. SSH Server에 SSH Client의 pub 파일 등록
2.1. Managed-Node들이 PW방식이 아닌 Key파일 방식으로 ansible 수행되도록 설정하기
Managed Node들에 SSH Password 입력 없이 스크립트 수행을 하게 하기 위한 사전 작업이라고 생각하면 된다.
key파일을 이용하여 ansible을 사용하지 않을거라면, 이 과정은 생략해도 된다.
key파일 방식으로 변경을 원치 않으면, 2.2.의 과정 또한 진행하지 않아도 된다.
Managed Node에 로그인할 user에 대한 ~/.ssh/authorized_keys 파일에 Control Node 가 생성한 SSH Public Key 내용 복사
# auto_authorized_keys.yml
---
- hosts: AUTHORIZED_KEYS # {Inventory 파일에 있는 그룹명 또는 호스트명} ex) CentOS or 10.0.2.15
gather_facts: no # Facts : Remote host의 Hostname, CPU, Memory 정보 등을 수집하는 setup 모듈
tasks:
- name: Copy SSH Public Key from Control Node to Managed-Node
authorized_key:
user: root # Managed-Node의 로그인할 user를 지정
state: present
key: "{{ lookup('file', '/root/.ssh/id_ed25519.pub') }}"
# lookup: Control Node의 /root/.ssh/id_ed25519.pub 파일의 모든 내용을 찾는다.
playbook 수행 명령어
ansible-playbook -i [hosts 파일 path] ['auto_authorized_keys.yml' path] -k [-c paramiko]
- ‘-c paramiko’ 를 사용하는 이유
[ansible] ansible의 paramiko
이 과정이 정상적으로 수행되었다면, 이제 ssh-agent가 가동되어 있고, 올바른 key파일로 캐싱되어 있다면,
ansible-playbook 수행 시, -k 옵션을 넣지 않아도 된다!
만약 아무 반응 없이 위 playbook이 수행되지 않는다면 아래 2.2 방법으로 수행해본다.
2.2. 만약 Managed Node에 이미 key 파일로 로그인하도록 등록되어 있다면?
ansible의 특성상, ansible-playbook -k 옵션을 수행하면, SSH Password 방식으로 connection이 맺어지기 때문에, 이미 Managed Node에 key파일 방식으로 connection이 맺어지도록 설정되어 있다면, ansible-playbook -k 명령어가 수행되지 못한다.
따라서 이런 경우에는, Managed Node의 authorized_keys 파일에서 이미 등록되어 있는 key파일 내용을 지워줘야 한다. 이 과정 또한 ansible-playbook 으로 진행이 가능하므로, 아래 과정으로 진행해보자.
2.2.1. ssh-agent 가동
# eval : "" 안에 내용을 한번 검증 후 백그라운드로 실행하겠다.
# ssh-agent -s : ssh-agent 시작
eval "$(ssh-agent -s)"
2.2.2. ssh-agent에 key파일 캐싱
# ssh-keygen 으로 생성한 SSH Key 파일을 ssh-agent 에 캐싱하는 명령어
# 명령어 수행시, 최초에만 ssh-keygen 으로 key 파일 생성할 때 넣은 passphrase 입력해야 함
ssh-add ~/.ssh/id_rsa
2.2.3. 기존 key파일 제거하는 playbook 수행
참고로 아래 플레이북은 Managed Node의 RSA 알고리즘을 사용한, root 유저 접속에 대한 키 파일의 내용을 삭제하는 것이다. 다른 유저로 되어 있다면, 아래 'user' key 의 값을 해당 유저로 설정해 주면 된다.
# remove_rsa_authorized_keys.yml
---
- hosts: RSA_HOSTS
serial: 1
gather_facts: no
tasks:
- name: Remove root's public key from the authorized_keys file on the Managed-Node
authorized_key:
user: root
state: absent
key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"
playbook 수행 명령어
ansible-playbook -i [hosts 파일 path] ['remove_rsa_authorized_keys.yml' path] -k [-c paramiko]
이 과정이 완료되고, 다른 알고리즘의 key 파일 방식으로 Managed Node들을 설정하고 싶다면, hosts 파일의 [AUTHORIZED_HOSTS] 그룹에 해당 호스트의 IP들을 넣고, 2.1.의 내용을 다시 수행하면 된다.
3. Managed Node 들에 Ansible playbook SSH password 없이 가능한 지 테스트
위 playbook 으로 known_hosts, authorized_keys 파일 작업 수행 후에 다음과 같은 playbook 실행으로 테스트 해보도록 하자!
해당 playbook 은 Managed Node 들의 uptime 을 간단하게 조회하는 playbook 이다.
# uptime_test.yml
---
- name: Test passwordless ssh command on managed nodes
hosts: PLAYBOOK_TEST
gather_facts: no
tasks:
- name: Run uptime command via ssh without password
shell: ssh root@{{ inventory_hostname }} uptime
register: uptime_output
- name: Show uptime command result
debug:
msg: "{{ inventory_hostname }} uptime: {{ uptime_output.stdout }}"
playbook 수행 명령어
ansible-playbook -i [hosts 파일 path] ['uptime_test.yml' path] -k [-c paramiko]
참고
Lookup plugins — Ansible Documentation
Lookup plugins — Ansible Community Documentation
Ansible Community Documentation Ansible Lookup plugins Lookup plugins are an Ansible-specific extension to the Jinja2 templating language. You can use lookup plugins to access data from outside sources (files, databases, key/value stores, APIs, and other s
docs.ansible.com
ansible.posix.authorized_key module – Adds or removes an SSH authorized key — Ansible Documentation
ansible.posix.authorized_key module – Adds or removes an SSH authorized key — Ansible Community Documentation
Ansible Community Documentation Ansible ansible.posix.authorized_key module – Adds or removes an SSH authorized key Note This module is part of the ansible.posix collection (version 1.5.4). You might already have this collection installed if you are usin
docs.ansible.com
ansible.posix.authorized_key module – Adds or removes an SSH authorized key — Ansible Documentation
ansible.posix.authorized_key module – Adds or removes an SSH authorized key — Ansible Community Documentation
Ansible Community Documentation Ansible ansible.posix.authorized_key module – Adds or removes an SSH authorized key Note This module is part of the ansible.posix collection (version 1.5.4). You might already have this collection installed if you are usin
docs.ansible.com
Append or remove SSH public certificates from an authorized_keys file
FreeKB
my Interwebs Free Knowledge Base
www.freekb.net
'DevOps > Ansible' 카테고리의 다른 글
[Ansible] 베이그런트(Vagrant)를 통해 Virtualbox 프로비저닝 하기 (0) | 2022.10.13 |
---|
최근댓글