설치


Ansible은 Agentless 방식으로 서버에 ssh로 접속하여 명령을 실행합니다. 

서버는 Python과 Ansible, 호스트는 Python만 설치합니다.


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 파일 이름인id_rsa을 찾아 접속을 시도합니다. Key 파일 이름을 변경하는 경우, 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의 이름이 id_rsa가 아니라면, Ansible 설정 파일에 추가합니다.

sudo vi /etc/ansible/ansible.cfg
[defaults]
private_key_file =  <PATH TO KEY_FILE>

등록 (호스트)


Ansible로 관리할 호스트에 접속하여, 복사한 공개 키를 ~/.ssh/authorized_keys 파일에 붙여 넣습니다.


공개키 등록

# echo <your public key> >> ~/.ssh/authorized_keys
echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDRF= ubuntu@ip-172-31-26-106>>~/.ssh/authorized_keys

Ansible – Inventory


Inventory


작업을 수행할 호스트를 정의하는 그룹으로, 서버의 /etc/ansible/hosts 파일에서 호스트를 정의합니다.


파일 생성 및 호스트 정의

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 사용자를 대상으로 ping 모듈을 수행합니다.

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

ubuntu 사용자를 대상으로 모듈을 실행합니다.


호스트를 정의한 그룹만 대상으로 연결할 수 있습니다.

ansible web -m ping

Ansible – Module


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
}

shell 모듈을 활용하여 실제 추가가 됐는지 확인합니다.

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


Playbook은 같은 설정을 반복해서 다수의 호스트에 적용할 때 사용합니다.

Ansible에서는 YAML 파일로 설정 사항을 관리하며, Visual Studio Code에서 편집을 진행합니다.


사용자 추가

Web 그룹에 속한 호스트에 사용자(laminar)를 추가합니다.


파일 생성 및 수정

vi ./site.yaml
---
- name: Add a User
  hosts: web
  become: true
  tasks:
    - name: Create a user name
      user:
        name: "{{ USER_NAME }}"

USER_NAME 변수에 laminar 값을 할당하여 Playbook을 실행합니다.


플레이북 실행

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   

결과는 아래와 같이 작업별로 구분해 출력합니다.


shell 모듈을 활용하여 실제 추가가 됐는지 확인합니다.

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') }}"

newpassword 변수에 변경할 암호(comtec123) 값을 할당하여 Playbook을 실행합니다.

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

마지막으로,

끝까지 읽어주신 모든 분들께 감사드립니다.


다음 글 보기

이전 글 보기