설치
Ansible은 Agentless 방식으로 서버에 ssh로 접속하여 명령을 실행합니다.
Python
파이썬 버전 확인
python3 --version
Python 3.8.2
파이썬 버전 3.8 이상으로 설치해주세요. 만약 다른 메세지가 나온다면 링크를 참고하여 설치를 진행하세요.
[ 참고 ]
sudo apt install python3.8
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.[old-version] 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2
sudo update-alternatives --config python3
출력에는 사용 가능한 선택 항목과 할당된 번호가 표시됩니다
사용하려는 버전 번호를 입력하고 Enter 키 를 누릅니다 .
파이썬 패키지 관리 도구 설치
sudo apt update
sudo apt install python3-pip -y
패키지 관리 도구를 설치합니다.
Ansible
Ansible 설치
sudo python3 -m pip install ansible
or
sudo apt-get install ansible
설치 확인
ansible -h
# Expected Output
usage: ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD] [--become-user BECOME_USER] [-K] [-i INVENTORY] [--list-hosts] [-l SUBSET] [-P POLL_INTERVAL] [-B SECONDS] [-o] [-t TREE]
[-k] [--private-key PRIVATE_KEY_FILE] [-u REMOTE_USER] [-c CONNECTION] [-T TIMEOUT] [--ssh-common-args SSH_COMMON_ARGS] [--sftp-extra-args SFTP_EXTRA_ARGS]
[--scp-extra-args SCP_EXTRA_ARGS] [--ssh-extra-args SSH_EXTRA_ARGS] [-C] [--syntax-check] [-D] [-e EXTRA_VARS] [--vault-id VAULT_IDS]
[--ask-vault-password | --vault-password-file VAULT_PASSWORD_FILES] [-f FORKS] [-M MODULE_PATH] [--playbook-dir BASEDIR] [-a MODULE_ARGS] [-m MODULE_NAME]
pattern
도움말이 나오나요?
설치 확인 2
ansible localhost -m ping
[WARNING]: No inventory was parsed, only implicit localhost is available
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
자기 자신에게 Ping을 해봐요.
Key
서버에서 호스트로 접속 할 Key를 생성하여 호스트로 배포합니다.
생성 (서버)
Key 생성은 서버에서만 진행합니다.
Key 생성
ubuntu@ip-172-31-26-106:~$ cd ~/.ssh
ubuntu@ip-172-31-26-106:~/.ssh$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ubuntu/.ssh/id_rsa): ansible
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ansible
Your public key has been saved in ansible.pub
The key fingerprint is:
SHA256:Cj0xlHqj1ORiFOZl5od19eoZ7v/iadpa6BFv0dvoEAE ubuntu@ip-172-31-26-106
The key's randomart image is:
+---[RSA 3072]----+
| o.=.. E.. |
| o.*oo . . . |
| ..== . . . |
| =.=+ o . |
| o.+o.S = . .|
| .. o o B oo|
| . B =..|
| o Bo. |
| =**o.|
+----[SHA256]-----+
Ansible은 SSH 접속 시 기본 Key 파일 이름인
권한 변경
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/known_hosts
공개키 복사
ubuntu@ip-172-31-26-106:~/.ssh$ cat ansible.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDRFJcsmEbYN3hbbLBokOu5I5TsHq8XWxRwg8p1n94L2ysw0/ndV+S/vcU7T2Vuzj1lx269N6Gx1ZrTkYYiJM/mkl0KQYebGgumxlyxWMlrvtEMGMYIoNDwL1pYNoSjFEqJWGSbe/ZBShtqKrmKJKNTLmdModydqxTMDp26aMTUCf1mJ5DWRi4OXGwz5sQxJr+XCEzwCPXzD6Eu4ShFf29SarWWXemiCDpBT8VWSMjYy7Lm+Ft25Gb7tWBZD6KOeVEBAWCnRHsDMr/T9yjqoJ9MPIekyCyr1eapCj++if0vl9+S2jlNz6kxOXXHAOHARElaJpJV4FZ2cEP2mY1hwVxg4dGXMjWMTBh2oI+7MwQameh3dUY4L1mgxp6vSnrxRn4Pxz88qY993qkVlzF8t7/xG9pfM13B8SzyZqVKsMf4hur/YX9vtDjguNQvzyxe7616ZyKn4ZmezonbC/SmM+HQCA6Q/uHvxiPja1KpK0bWT9ZYJGNzy2JiJ2bwWjCFiu8= ubuntu@ip-172-31-26-106
만약 생성한 Key의 이름이
sudo vi /etc/ansible/ansible.cfg
[defaults]
private_key_file = <PATH TO KEY_FILE>
등록 (호스트)
Ansible로 관리할 호스트에 접속하여, 복사한 공개 키를
공개키 등록
# echo <your public key> >> ~/.ssh/authorized_keys
echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDRF= ubuntu@ip-172-31-26-106>>~/.ssh/authorized_keys
Ansible – Inventory
Inventory
작업을 수행할 호스트를 정의하는 그룹으로, 서버의
파일 생성 및 호스트 정의
sudo vi /etc/ansible/hosts
# /etc/ansible/hosts
[web]
10.10.10.10
10.10.10.11
그룹 이름과 적용할 호스트를 작성합니다.
그룹(Group)
– 그룹은 대괄호로 표현합니다.
– 수행할 목적에 따라 그룹별로 호스트를 관리합니다.
– 하나의 호스트를 다수의 그룹에 포함할 수 있습니다.
[web]
10.10.10.10:20022 ansible_user=ubuntu
10.10.10.11:20022 ansible_user=ubuntu
포트 및 사용자를 특정하여 호스트를 정의할 수 있습니다.
하나의 그룹에 일괄적으로 변수를 정의할 수 있습니다.
[web]
10.10.10.10
10.10.10.11
[web:vars]
ansible_port=20022
ansible_user=ubuntu
ansible_python_interpreter=/usr/bin/python3
# example
ansible_ssh_private_key_file=/home/example/.ssh/aws.pem
Ansible – SSH
서버에서 호스트로 연결이 되는지 확인합니다.
ansible all -m ping -u ubuntu
모든 호스트의 ubuntu 사용자를 대상으로
10.10.10.10 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
[DEPRECATION WARNING]: Distribution Ubuntu 18.04 on host 10.10.10.11 should use /usr/bin/python3, but is using
/usr/bin/python for backward compatibility with prior Ansible releases. A future Ansible release will default to using
the discovered platform python for this host. See
https://docs.ansible.com/ansible/2.10/reference_appendices/interpreter_discovery.html for more information. This
feature will be removed in version 2.12. Deprecation warnings can be disabled by setting deprecation_warnings=False in
ansible.cfg.
10.10.10.11 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
DEPRECATION WARNING은 그룹 변수 설정 시 파이썬 인터프리터를 특정하는 것으로 해결할 수 있습니다.
그룹에 변수를 정의한 경우 사용자 인자를 생략하여 명령어를 실행합니다.
ansible all -m ping
호스트를 정의한 그룹만 대상으로 연결할 수 있습니다.
ansible web -m ping
Ansible – Module
사용자(User)
사용자 계정 추가 및 삭제, 패스워드 변경, 그룹 추가 등을 지원하는 모듈입니다.
Web 그룹에 속한 호스트에 사용자(laminar)를 추가하려고 합니다.
사용자 추가
Web 그룹에 속한 호스트에 사용자(laminar)를
ansible web -m user -a "name=laminar"
10.10.10.10 | FAILED! => {
"changed": false,
"msg": "useradd: Permission denied.nuseradd: cannot lock /etc/passwd; try again later.n",
"name": "laminar",
"rc": 1
}
권한 부족 에러 메세지가 발생하였습니다.
에러가 발생한다면 명령어 수행 시 Sudo 권한으로 수행할 수 있게 설정을 추가합니다.
Ansible 설정 파일 수정
sudo vi /etc/ansible/ansible.cfg
[privilege_escalation]
become=True
파일 변경 후 명령어를 다시 실행합니다.
ansible web -m user -a "name=laminar"
계정을 성공적으로 추가하였습니다.
10.10.10.10 | CHANGED => {
"changed": true,
"comment": "",
"create_home": true,
"group": 1001,
"home": "/home/laminar",
"name": "laminar",
"shell": "/bin/sh",
"state": "present",
"system": false,
"uid": 1001
}
ansible web -m shell -a "tail -n 1 /etc/passwd"
10.10.10.10 | CHANGED | rc=0 >>
laminar:x:1001:1001::/home/laminar:/bin/sh
추가 성공!
사용자 삭제
Web 그룹에 속한 호스트에 사용자(laminar)를
ansible web -m user -a "name=laminar state=absent remove=yes"
10.10.10.10 | CHANGED => {
"changed": true,
"force": false,
"name": "laminar",
"remove": true,
"state": "absent",
"stderr": "userdel: laminar mail spool (/var/mail/laminar) not foundn",
"stderr_lines": [
"userdel: laminar mail spool (/var/mail/laminar) not found"
]
}
Ansible – Playbook
Ansible에서는
사용자 추가
Web 그룹에 속한 호스트에 사용자(laminar)를
파일 생성 및 수정
vi ./site.yaml
---
- name: Add a User
hosts: web
become: true
tasks:
- name: Create a user name
user:
name: "{{ USER_NAME }}"
플레이북 실행
ansible-playbook site.yaml --extra-vars "USER_NAME=laminar"
PLAY [Add a User] ***************************************************************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************************************************
ok: [10.10.10.10]
TASK [Create a user name] *******************************************************************************************************************************************************************************
changed: [10.10.10.10]
PLAY RECAP **********************************************************************************************************************************************************************************************
10.10.10.10 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
결과는 아래와 같이 작업별로 구분해 출력합니다.
ansible web -m shell -a "tail -n 1 /etc/passwd"
10.10.10.10 | CHANGED | rc=0 >>
laminar:x:1001:1001::/home/laminar:/bin/sh
추가 성공!
사용자 암호변경
Web 그룹에 속한 호스트에 사용자(laminar) 암호를
계속 진행하기 전에 Ansible은 사용자 모듈을 통해 일반 텍스트 암호를 전달하는 것을 허용하지 않으므로
Python의 암호 해싱 라이브러리를 설치해야 합니다.
sudo pip install passlib
or
sudo -H pip3 install passlib
vi ./change.yaml
---
- name: Change a User
hosts: web
become: true
tasks:
- name: Change user password
user:
name: laminar
update_password: always
password: "{{ newpassword|password_hash('sha512') }}"
ansible-playbook change.yaml --extra-vars "newpassword=comtec123"
PLAY [Add a User] ***********************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************
ok: [10.10.10.10]
TASK [Change user password] *************************************************************************************************************************************
changed: [10.10.10.10]
PLAY RECAP ******************************************************************************************************************************************************
10.10.10.10 : ok=2 changed=1 unreachable=0 failed=0
마지막으로,
끝까지 읽어주신 모든 분들께 감사드립니다.
다음 글 보기
이전 글 보기