앤서블은 플레이북을 작성하여 동작시키는 방식 + 애드혹 명령을 통하여 간단하게 실행시키는 방식 두가지 있음
형식
ansible host-pattern -m module [-a argument] [-i inventory]
ping 모듈 사용해보기
[user@master ~]$ mkdir ping-test
[user@master ~]$ cd ping-test/
[user@master ping-test]$ vim inventory
>> inventory 파일 안에 작성
192.168.56.101
[user@master ping-test]$ vim ansible.cfg
>> ansible.cfg 파일 안에 작성
[defaults]
inventory = ./inventory
[user@master ping-test]$ ansible 192.168.56.101 -m ping -i /home/user/ping-test/inventory
# 뒤에 i 옵션은 사실 지금은 같은 디렉토리에 있는 inventory 참조하고 있어서 의미 없지만 다 적어본거
192.168.56.101 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[user@master ping-test]$ ansible all -m ping -i /home/user/ping-test/inventory
192.168.56.101 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
모듈 기능 확인
[user@master ping-test]$ ansible-doc ping
> PING (/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py)
A trivial test module, this module always returns `pong' on successful contact. It does not make sense
in playbooks, but it is useful from `/usr/bin/ansible' to verify the ability to login and that a usable
Python is configured. This is NOT ICMP ping, this is just a trivial test module that requires Python on
the remote-node. For Windows targets, use the [win_ping] module instead. For Network targets, use the
[net_ping] module instead.
* This module is maintained by The Ansible Core Team
OPTIONS (= is mandatory):
- data
Data to return for the `ping' return value.
If this parameter is set to `crash', the module will cause an exception.
[Default: pong]
type: str
SEE ALSO:
* Module net_ping
The official documentation on the net_ping module.
<https://docs.ansible.com/ansible/2.9/modules/net_ping_module.html>
* Module win_ping
The official documentation on the win_ping module.
<https://docs.ansible.com/ansible/2.9/modules/win_ping_module.html>
주로 사용하는 모듈
<aside> 📝 관리 호스트에 사용자 이름이 user이면서 uid가 1000번인 사용자가 존재하는지 확인하는 애드혹 명령어 실습
[user@master ping-test]$ ansible -m user -a 'name=user uid=1000 state=present' 192.168.56.101
192.168.56.101 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"append": false,
"changed": false,
"comment": "user",
"group": 1000,
"home": "/home/user",
"move_home": false,
"name": "user",
"shell": "/bin/bash",
"state": "present",
"uid": 1000
}
</aside>
관리 호스트에 명령어 입력도 가능
[user@master ping-test]$ ansible -m command -a hostname 192.168.56.101
192.168.56.101 | CHANGED | rc=0 >>
worker
[user@master ping-test]$ ansible -m shell -a hostname 192.168.56.101
192.168.56.101 | CHANGED | rc=0 >>
worker
set 명령어는 환경변수를 확인할 수 있는 명령어
[user@master ping-test]$ ansible -m command -a set 192.168.56.101
192.168.56.101 | FAILED | rc=2 >>
[Errno 2] No such file or directory
[user@master ping-test]$ ansible -m shell -a set 192.168.56.101
192.168.56.101 | CHANGED | rc=0 >>
BASH=/bin/sh
BASHOPTS=cmdhist:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_EXECUTION_STRING=set
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(2)-release'
DIRSTACK=()
EUID=1009
...
추가 옵션
<aside> 🎀 ansible --help 입력하면 이 추가 옵션들 다 볼 수 있음
</aside>
애드혹은 명령어로 실행하기 때문에 하나의 명령으로 실행시킨다는 특징이 존재
[user@master ping-test]$ ansible -m user -a 'name=user uid=1000 state=present' 192.168.56.101
플레이북은 파일로 만들기 때문에 복잡하고 반복적인 작업을 쉽게 구현한다는 특징이 있음
[user@master ~]$ mkdir user-test
[user@master ~]$ cd user-test/
[user@master user-test]$ vim inventory
>> inventory 파일 안에 작성
192.168.56.101
[user@master user-test]$ vim ansible.cfg
>> ansible.cfg 파일 안에 작성
[defaults]
inventory=./inventory
[user@master user-test]$ vim playbook.yml
>> playbook.yml 파일 안에 작성
---
- name: Configure important user consistently # 작업 이름 지정
hosts: 192.168.56.101 # 대상 지정
tasks: # 가서 할 일 지정
- name: user exist with UID 1000 # 세부 제목
user: # 작업에 사용할 모듈
name: user # 모듈에 들어갈 name
uid: 1000 # 들어갈 uid
state: present # 들어갈 state
[user@master user-test]$ ansible-playbook playbook.yml
PLAY [Configure important user consistently] *********************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************
ok: [192.168.56.101]
TASK [user exist with UID 1009] **********************************************************************************************************
ok: [192.168.56.101]
PLAY RECAP *******************************************************************************************************************************
192.168.56.101 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
<aside> 🎋 - 가 한 단락을 의미함
</aside>
플레이북 실행
[user@master user-test]$ ansible-playbook -v playbook.yml
Using /home/user/user-test/ansible.cfg as config file
PLAY [Configure important user consistently] *********************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************
ok: [192.168.56.101]
TASK [user exist with UID 1009] **********************************************************************************************************
ok: [192.168.56.101] => {"append": false, "changed": false, "comment": "", "group": 1011, "home": "/home/user", "move_home": false, "name": "user", "shell": "/bin/bash", "state": "present", "uid": 1009}
PLAY RECAP *******************************************************************************************************************************
192.168.56.101 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
<aside> 📝 v가 많아질수록 자세한 정보
</aside>
플레이북 작성 문법 잘 했는지 확인하기
[user@master user-test]$ ansible-playbook --syntax-check playbook.yml
playbook: playbook.yml
잘 되는지 예행연습
[user@master user-test]$ ansible-playbook -C playbook.yml
PLAY [Configure important user consistently] *********************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************
ok: [192.168.56.101]
TASK [user exist with UID 1009] **********************************************************************************************************
ok: [192.168.56.101]
PLAY RECAP *******************************************************************************************************************************
192.168.56.101 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
<aside> 📝 제어 노드에는 httpd를 설치하고 관리 호스트에는 mariadb를 설치하는 플레이북 작성 실습
</aside>
[user@master ~]$ mkdir multi-play
[user@master ~]$ cd multi-play/
[user@master multi-play]$ vim ansible.cfg
[defaults]
inventory = ./inventory
[user@master multi-play]$ vim inventory
>> inventory 파일 안에 작성
localhost # 192.168.56.100 이라고 자기 ip 주소 적어도 됌
192.168.56.101
[user@master multi_playbook]$ vim playbook.yml
>> playbook.yml 파일 안에 작성
---
- name: first play
hosts: localhost
become: yes
tasks:
- name: first task
yum:
name: httpd
state: present
- name: second task
service:
name: httpd
enabled: true
- name: second play
hosts: 192.168.56.101
become: yes
tasks:
- name: first task
yum:
name: mariadb-server
state: present
- name: second task
service:
name: mariadb
enabled: true
# 이 상태로는 작동 안함 -> localhost 진입할 때 비밀번호 필요하기 때문에!
[user@master multi-play]$ sudo vim /etc/sudoers.d/user
>> user 파일 안에 작성
user ALL=(ALL) NOPASSWD:ALL
# 진입할 때 비밀번호 안쓸게!
[user@master multi-play]$ ssh-copy-id [email protected]
#ssh로 통신 할때 사용할 키 복사
[user@master multi_playbook]$ ansible-playbook playbook.yml