이번에 다룰 내용의 요지는 다음과 같습니다.
사전 분석:
- 사용자 아이디는 외부 변수로 받습니다.
- Ansible 서버에서 ansible 계정을 만들고 SSH 키를 생성합니다.
- Ansible 서버에서 생성된 SSH 공개 키를 각 tnode 호스트로 복사합니다.
- 계정을 생성할 때는 ansible.builtin.user 모듈을 사용하며, SSH 공개 키를 복사할 때는 ansible.posix.authorized_key 모듈을 사용합니다.
플레이북 설계:
- 앤서블 공식 문서의 콘텐츠 컬렉션에서 SSH 키 생성 모듈과 SSH 키 복사 모듈을 찾습니다.
- 플레이북 명은 create_sshkey.yml로 설정하고, 두 가지 주요 태스크를 가집니다:
- 'Create ssh key'와 'Copy SSH Pub Key'. - 'Create ssh key' 태스크는 로컬 호스트에서 실행되며 ansible 계정의 SSH 키를 생성합니다.
- 'Copy SSH Pub Key' 태스크는 원격 호스트인 tnode에서 실행되며 ansible 계정의 공개 키를 해당 호스트에 복사합니다.
- 인벤토리에는 tnode라는 호스트 그룹을 만들고, 모든 관리 노드를 tnode 그룹에 정의합니다.
1) 프로젝트 디렉터리 생성 및 inventory 파일 작성
#
mkdir ~/my-ansible/chapter_09.2
cd ~/my-ansible/chapter_09.2
# ansible.cfg, inventory 파일 작성
cp ~/my-ansible/ansible.cfg ./
# inventory 파일 수정
cat <<EOT> inventory
[tnode]
tnode1
tnode2
tnode3
EOT
# lookup 플러그인
ansible-doc -l -t lookup
2) 플레이북 작성 (SSH 키 생성하고 복사하기 위함)
- localhost인 ansible-server에서 생성된 SSH 공개 키는 ansible.posix.authorized_key 모듈을 이용하여 인벤토리의 tnode 호스트 그룹의 각 서버로 복사됩니다.
- 키를 등록하기 위해 lookup 함수 사용 : 외부 소스(파일, DB, key/value stores, APIs 등)으로 부터 데이터를 검색합니다.
~/my-ansible/chapter_09.2/create_sshkey.yml
---
- hosts: localhost
tasks:
- name : Create ssh key
ansible.builtin.user:
name: "{{ userid }}"
generate_ssh_key: true
ssh_key_bits: 2048
ssh_key_file: /home/{{ userid }}/.ssh/id_rsa
shell: /bin/bash
- hosts: tnode
tasks:
- name: Copy SSH Pub key
ansible.posix.authorized_key:
user: "{{ userid }}"
state: present
key: "{{ lookup('file', '/home/{{ userid }}/.ssh/id_rsa.pub') }}"
3) 플레이북 실행
# 문법 체크
ansible-playbook --syntax-check create_sshkey.yml
# 실행 : 외부 변수(-e)로 userid 정의하고 전달 실행 >> 실패!
ansible-playbook -e userid=ansible create_sshkey.yml
ansible-playbook -e userid=ansible create_sshkey.yml -vvvvv
#
ls -l /home/ansible/.ssh/id_rsa.pub
sudo ls -l /home/ansible/.ssh/id_rsa.pub
플레이북 실행시 다음과 같이 실패하는 것을 볼 수 있습니다.
따라서, root 계정으로 실행하여 해당 내용을 해소할 수 있습니다.
4) ansible.cfg 파일 수정
기존의 ansible.cfg를 다음과 같이 변경합니다.
ubuntu 사용자를 사용하여 연결하고 있었지만 변경된 설정에서는 root 사용자로 변경되었습니다.
이 변경은 Ansible이 원격 호스트에 연결할 때 사용되는 기본 사용자를 변경합니다.
- become 설정: 이 설정은 Ansible이 sudo 또는 다른 방법을 사용하여 작업을 루트 권한으로 수행할 것인지 여부를 제어합니다.
초기 설정에서는 become을 사용하여 sudo를 통해 루트 권한을 상승시킵니다. - inject_facts_as_vars 설정: 이 설정은 Ansible이 호스트의 사전 수집된 사전 변수를 주 변수로 주입할지 여부를 제어합니다.
변경된 설정에서는 이 설정이 추가되고 false로 설정되어 있으므로 사전 수집된 사전 변수가 주 변수로 주입되지 않습니다.
이후, 실행하면 다음과 같습니다.
다음의 명령어를 실행시킵니다.
sudo ansible-playbook -e userid=ansible create_sshkey.yml --ask-pass
5) 공개키 복사를 확인
# ansible 계정 전환
sudo su - ansible
# bash
echo $SHELL
whoami
pwd
#
ls -al
ls -l .ssh
total 8
-rw------- 1 ansible ansible 1856 Jan 5 05:57 id_rsa
-rw-r--r-- 1 ansible ansible 417 Jan 5 05:57 id_rsa.pub
# tnode SSH 접속 테스트
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i hostname; echo; done
# 대상 노드에 정보 확인
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i tree /home/ansible/.ssh; echo; done
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i cat /home/ansible/.ssh/authorized_keys; echo; done
# ubuntu로 복귀
exit
whoami
pwd
6) tnode 관리 노드에 ansible 계정에 패스워드 입력 없이 sudo 권한 줄 수 있게 설정 : root 계정 권한으로 진행
~/my-ansible/chapter_09.2/sudo-ansible.yml
---
- hosts: all
tasks:
- name: Create file
ansible.builtin.file:
path: /etc/sudoers.d/ansible
mode: '0600'
state: touch
- name: Edit file
ansible.builtin.lineinfile:
path: /etc/sudoers.d/ansible
line: ansible ALL=(root) NOPASSWD:ALL
이 플레이북의 주요 작업은 다음과 같습니다.
- Create file 작업:
- ansible.builtin.file 모듈을 사용하여 /etc/sudoers.d/ansible 경로에 파일을 생성합니다.
- mode를 '0600'으로 설정하여 파일의 퍼미션을 0600으로 변경합니다. 이는 파일이 읽기 및 쓰기 권한이 있는 소유자만 열 수 있도록 설정합니다.
- state를 touch로 설정하여 파일을 만들도록 지시합니다.
- Edit file 작업:
- ansible.builtin.lineinfile 모듈을 사용하여 /etc/sudoers.d/ansible 파일에 특정 라인을 추가하거나 수정합니다.
- line 매개 변수를 사용하여 /etc/sudoers.d/ansible 파일에 추가할 라인을 정의합니다. 여기에서는 ansible 사용자가 모든 명령에 대해 비밀번호 없이 sudo를 사용할 수 있도록 설정합니다.
- 이러한 변경 사항은 /etc/sudoers.d/ansible 파일에 기록됩니다.
7) 플레이북 실행
sudo ansible-playbook sudo-ansible.yml --ask-pass
SSH password: qwe123
8) 확인
# ansible 계정 전환 후 tnode1 접속 후 확인
sudo su - ansible
ssh tnode1
----------
whoami
sudo cat /etc/sudoers.d/ansible
exit
----------
'DevOps > Ansible' 카테고리의 다른 글
[Ansible 101] 환경 설정 자동화 (0) | 2024.02.04 |
---|---|
[Ansible 101] NTP 서버 설치 및 설정하기 (1) | 2024.02.04 |
[Ansible 101] 사용자 계정 생성하기 (1) | 2024.02.04 |
[Ansible 101] 2주차 도전과제 (0) | 2024.01.21 |
[Ansible 101] 앤서블 블록 및 오류처리 (0) | 2024.01.21 |