known_hosts
'ansible all -m ping'을 입력하면 노드 수만큼 'yes'를 입력해야한다
하지만 여러개를 동시에 했더니 개수만큼 yes도 못함 이러면 접속을 할 수가 없다
[vagrant@ansible-server ~]$ ansible all -m ping
The authenticity of host '192.168.219.101 (192.168.219.101)' can't be established.
ECDSA key fingerprint is SHA256:1GF9uYRwsy11hRN1ZkiEaC23OUw37aheZTgHuFs2LHk.
ECDSA key fingerprint is MD5:ce:34:5b:d0:e9:e1:fd:f1:cf:ef:f5:57:1a:46:78:b7.
Are you sure you want to continue connecting (yes/no)? The authenticity of host '192.168.219.102 (192.168.219.102)' can't be established.
ECDSA key fingerprint is SHA256:1g6lHtPffvU3YOpvllYc91g85uasmZrudOflBtR6VHs.
ECDSA key fingerprint is MD5:f6:e1:71:8b:1a:8e:9d:96:4c:b2:98:fc:b0:ba:34:d5.
Are you sure you want to continue connecting (yes/no)? The authenticity of host '192.168.219.103 (192.168.219.103)' can't be established.
ECDSA key fingerprint is SHA256:j7KqvANePU9D1rs3RHXa9zZS7juoeoTZSgFZQC0pNKc.
ECDSA key fingerprint is MD5:12:7a:eb:dd:77:80:69:32:46:9d:1a:59:bf:7f:46:dc.
Are you sure you want to continue connecting (yes/no)? yes
192.168.219.101 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
'yes'를 입력하면 'known_hosts'에 key가 저장된다
그러면 다음부터 node에 명령어를 보내거나 ssh접속을 하려고 할때 'yes'를 물어보지 않는다
일일이 yes를 입력하는건 귀찮은 일이므로 자동으로 'known_hosts'에 저장되도록 ansible-playbook을 만들자
[vagrant@ansible-server ~]$ vi auto_pass.yml
ex) ssh-keyscan 192.168.1.101 >> ~/.ssh/known_hosts 형식
---
- name: Create authority between server and nodes
hosts: nodes # /etc/ansible/hosts에 nodes에 대한 정보를 읽어들여서 nodes에서 실행하는 것이 아니라
connection: local # 목적지를 local(ansible-server)로 잡아서 실행
serial: 1 # 실행되는 태스크를 한 개씩 진행하라는 의미, 성능이 좋은 시스템의 경우 빠른 진행으로 겹치는 경우가 발생하므로 설정한 옵션
gather_facts: no
tasks:
- name: ssh-keyscan for known_hosts file
command: /usr/bin/ssh-keyscan -t ecdsa {{ ansible_host }} # "{{ ansible_host }}"라는 변수에 nodes를 불러와
register: keyscan # command에서 확인된 noeds의 키값을 "keyscan"이라는 변수에 저장
- name: input key
lineinfile:
path: ~/.ssh/known_hosts
line: "{{ item }}" # keyscan 변수의 값이 stdout_lines으로 출력되면 known_hosts파일에 한줄씩 저장
create: yes
with_items:
- "{{ keyscan.stdout_lines }}"
매직변수
ansible에서는 특별히 선언하지 않아도, 기본덕으로 사용할 수 있는 변수들이 존재하는데, 이를 매직변수라고 한다.
"ansible_host" 매직변수를 호출하여 /etc/ansible/hosts 에 있는 노드들의 값 중에 플레이북에서 호출한 노드들에 대한 정보를 자동으로 변수로 입력 받은 것이다.
playbook 적용
[vagrant@ansible-server ~]$ ansible-playbook auto_pass.yml -k
known_hosts에 등록된 nodes들의 key 확인
[vagrant@ansible-server ~]$ cat .ssh/known_hosts
192.168.219.101 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBE+LUbm+3D1NiBrMjmsviNyOrwRvsx5MOGj20U80yfoAB35D42bAagfTWpvb4ro6dI2ddehQrkkc8I4U5H/scPs=
192.168.219.102 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOvdaW6fy13ruPeP370ycvR2VKBXZi2j+IgArJbsjmkphfwWkvmlsltGrndRq86pRL4LcgZmVhfKEy1UzXUo7tk=
192.168.219.103 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKacMAQ3zE4fo8HRRjqZfAf4vn3d9jeZVNjqP5UZQfeuzN3gx0rIy6vRzg86qrv7DOhkTP2OlAC0lcKhWdtHGgI=
192.168.219.201 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHg/YQWZJhpf3vMStp9dndYmReANtKXXsBoJJQRs+2lm1jsRM9zaRV9H9NAB+VPM4htqVBYt4sF59Ibl9S8AbCE=
192.168.219.202 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJh6Yy/SaYqIgjpQauK6Pexnsm+YYDtS4iisOVNQvb4xsJgo63D8hfWwwKtK0QbWcBqWYa89qm1n6xS7hOwF/Ds=
192.168.219.203 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNRfmGZxRgRM/mbo/WUA8ppsryHrRX22fkFanlftk7RuyZn2dxLI8Lhfado0jCirC8tAohVzdzamnKdTR3J+u8Y=
node에게 ssh접속
-> 사용자에게 접속확인에게 더이상 묻지 않는다!
[vagrant@ansible-server ~]$ ssh 192.168.219.101
Last login: Fri Apr 30 05:26:57 2021 from 192.168.219.10
authorized_keys
ansible명령어와 ansible-playbook명령어를 사용할때 ssh 암호를 입력하기 위해 '-k'옵션을 사용해야했다
vagrant ssh ansible-server에서 암호를 입력하지 않았던 이유는 앤서블 서버에 있는 authorized_keys를 이용했기 때문이다 베이그런트 설치시에 authorized_keys 공개키가 자체적으로 등록되어 있기 때문이다.
[vagrant@ansible-server ~]$ cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCtxvSeVmOJB/1VrBcC7YSeOsXTF21V3K6h9Bb6r7xWc9uwmgsxZI6OM+otmHwn3yexIQ9fpqQww8M5rbhWhjZLSGHzvdi3v+Cl79sq1pariOea22l89Bg70M+qqxvotP3IZA25yfcbrTQfi4sxbevJqjUWrHd+oi7+bAj3k3LAQMoqELzZaH7imBSgV33ZshZSC1nzY8efYxmIhKM8yedKiBylRn0YNs451Syl/eU/9VHOXUewJRMq85N53JRlzuQn/e1fUmJX+0UUGje8KYlv9B58ee16HbqROozgfbu6Jk7qjHwqDC416AiU1n83lotqaP6q8mA3qwKhqHYjWP3f vagrant
[vagrant@ansible-node101 ~]$ cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDI8gfHWkBWGXgGeF+dwuDf4tohN4LGKbcuyc8/sgGUA4ZOMnHyFZZH9LlQjWCRv1LX4PHrjkVNHNy4Nd0edMUh8BpzOTGDRhe94Xlsj9Zmu1cK/TCq0Yz4NgnIGZsVyDB9j5tpPqhyI5+fV3krKh0IabnKN3BQTsFsyEV6ocDZY8Q8S8kb5a4GIlYEozS4cnPWpYEz82O9JRMMNTLGqNoRQhEK9G4aJRmlxP8BEkPkW+peUnzo8OinJjjvETBcw5Hu3HhD0KfKDrp6T7ay6dL/nmh7pfb+9cXlGsMmFjNTw09WwyLjQjczPwr0hlL6BM8G/sBlvS6Z4q7KfrKPY5MD vagrant
인증 과정
- node에 접속을 시도
- node의 ~/.ssh/authorized_keys 파일의 존재를 확인하고, authorized_keys 안에 접속자의 공개 키 정보가 존재하는지 확인
- 본인의 개인 키로 authorized_keys에 있는 공개 키를 풀어서 접속
-k 옵션을 빼면 에러가 뜬다
[vagrant@ansible-server ~]$ ansible all -m shell -a "df -h"
192.168.219.101 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
"unreachable": true
}
192.168.219.102 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
"unreachable": true
}
192.168.219.103 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
"unreachable": true
}
[vagrant@ansible-server ~]$ ansible all -m shell -a "df -h" -k
SSH password:
192.168.219.103 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
devtmpfs 237M 0 237M 0% /dev
tmpfs 244M 0 244M 0% /dev/shm
tmpfs 244M 4.5M 240M 2% /run
tmpfs 244M 0 244M 0% /sys/fs/cgroup
/dev/sda1 40G 4.2G 36G 11% /
tmpfs 49M 0 49M 0% /run/user/1000
192.168.219.101 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
devtmpfs 237M 0 237M 0% /dev
tmpfs 244M 0 244M 0% /dev/shm
tmpfs 244M 4.6M 239M 2% /run
tmpfs 244M 0 244M 0% /sys/fs/cgroup
/dev/sda1 40G 4.2G 36G 11% /
tmpfs 49M 0 49M 0% /run/user/1000
192.168.219.102 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
devtmpfs 237M 0 237M 0% /dev
tmpfs 244M 0 244M 0% /dev/shm
tmpfs 244M 4.5M 240M 2% /run
tmpfs 244M 0 244M 0% /sys/fs/cgroup
/dev/sda1 40G 4.2G 36G 11% /
tmpfs 49M 0 49M 0% /run/user/1000
[vagrant@ansible-server ~]$ vi auto_pass.yml
생성했던 파일에 aythorized_keys를 자동으로 등록하는 코드 추가
---
- name: Create authority between server and nodes
hosts: nodes
connection: local
serial: 1
gather_facts: no
vars:
ansible_password: vagrant # 접속암호를 미리 변수로 선언
tasks:
- name: ssh-keyscan for known_hosts file
command: /usr/bin/ssh-keyscan -t ecdsa {{ ansible_host }}
register: keyscan
- name: input key
lineinfile:
path: ~/.ssh/known_hosts
line: "{{ item }}"
create: yes
with_items:
- "{{ keyscan.stdout_lines }}"
- name: ssh-keygen for authorized_keys file
command: "ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N ''"
ignore_errors: yes
run_once: true # 키를 한번만 만들기 위함
- name: input key for each node
connection: ssh # connection: local에서 기본 값인 connection: ssh로 변경
authorized_key: # 각 노드들의 공개키 값을 authorized_keys로 저장하기 위한 모듈
user: vagrant # 저장되는 위치는 베이그런트 유저의 ssh설정이 위치한 ~/.ssh/authorized_keys 로저장
state: present
key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" # 공개키 지정하는 key 옵션, 공개키를 읽는 lookup 옵션, 읽으려는 대상이 파일임을 명시하기 위한 file 옵션, 마지막으로 공개키의 위치를 지정하여 lookup옵션이 파일을 찾고 읽을 수 있도록함
'ssh-keygen'명령을 통해서 공개 키와 개인 키를 생성할 수 있다.
옵션
- -b 2048: 생성할 키의 비트수
- -t rsa: rsa암호화 방식을 사용하겠다
- -f <위치>: 키를 생성할 위치 지정
- -q: 사일런트 모드
- -N: 암호문을 공란('')으로 생성
암호를 변수로 지정했기 때문에 처음에 -k 옵션 빼도됨
[vagrant@ansible-server ~]$ ansible-playbook auto_pass.yml
[vagrant@ansible-server ~]$ ansible all -m ping
192.168.219.103 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.219.102 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.219.101 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
성공!
[vagrant@ansible-server ~]$ ls .ssh/
authorized_keys id_rsa id_rsa.pub known_hosts
id_rsa 개인키와 id_rsa.pub 공개키가 만들어졌다
[vagrant@ansible-node101 ~]$ cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDI8gfHWkBWGXgGeF+dwuDf4tohN4LGKbcuyc8/sgGUA4ZOMnHyFZZH9LlQjWCRv1LX4PHrjkVNHNy4Nd0edMUh8BpzOTGDRhe94Xlsj9Zmu1cK/TCq0Yz4NgnIGZsVyDB9j5tpPqhyI5+fV3krKh0IabnKN3BQTsFsyEV6ocDZY8Q8S8kb5a4GIlYEozS4cnPWpYEz82O9JRMMNTLGqNoRQhEK9G4aJRmlxP8BEkPkW+peUnzo8OinJjjvETBcw5Hu3HhD0KfKDrp6T7ay6dL/nmh7pfb+9cXlGsMmFjNTw09WwyLjQjczPwr0hlL6BM8G/sBlvS6Z4q7KfrKPY5MD vagrant
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCy4xzgQiW42yEIVE9i0iFXIbm/+3WYPLFNnrS6CZZcs/YSwqooJrgR2Geo0BBqABMaJCAVdvGSDFfKyjErcAnKBXSVNDOVj7EpN2LxVvT/Qb1n/FKgybMA7BFdtBluiHorHxWo6HFZ7r9Ymo7XUMEQdvff4fwRYNC2/21g0eQ/fsEb5QgjUI1uctdAFUOZ7kTTQfus8Lt71UvSFPlhUDMTgzNhD7ULzolX4qDG9vzF1LUGxJ6xym3GLyysR1rnRB49WvicFtqyCegJrXgfJV3wDPn5iQeC3Ym1Ix4H8YsNvVUCR+WTQOaZl3lRDhUVYCQCKyhizl5/4oRPgVvEagdl vagrant@ansible-server
vagrant@ansible-server의 공개키가 생겼다~
~/.ssh/ 하위에 기본적으로 있는 파일 4개
authorized_keys | server에서 관리하는 파일. server가 알고 있는 client의 public key를 기록한 파일이다. client를 인증할 때 사용한다. |
known_host | client에서 관리하는 파일. 해당 컴퓨터가 알고 있는 server의 host key를 기록한 파일 |
id_rsa | default 파일이름으로, private key가 저장되어 있다 |
id_rsa.pub | default 파일이름으로, public key가 저장되어 있다 |
'Ansible > 우아한앤서블' 카테고리의 다른 글
5장 Vagrant로 Ansible 사용하기 - 네트워크(nxos) (0) | 2021.05.02 |
---|---|
4장 Vagrant로 Ansible 사용하기 - 윈도우 (0) | 2021.04.29 |
우아한앤서블 3장 Vagrant로 Ansible 사용하기 - centos/7 (2) | 2021.04.29 |