ansible 설치
[root@test_ansible]# git clone https://github.com/ansible/ansible.git
[root@test_ansible]# make
[root@test_ansible]# make install
- make error 발생 시
Traceback (most recent call last):
File "packaging/release/versionhelper/version_helper.py", line 9, in <module>
from packaging.version import Version, VERSION_PATTERN
ImportError: No module named packaging.version
Makefile:40: *** "version_helper failed". Stop.
[root@test_ansible]# pip install --upgrade setuptools
[root@test_ansible]# pip install packaging
=> 설치 후 make 재시도
- ansible configure 파일 설정
$ vi ~/.bash_profile
ansible 사용 계정 profile에 아래 환경변수 설정 시 ansible command 수행할 때 아래의 ansible.cfg 설정파일을 자동으로 읽어옴
$ export ANSIBLE_CONFIG=/engn001/ansible/work/ansible.cfg
$ export ANSIBLE_HOSTS=/engn001/ansible/work/hosts
$ vi ansible.cfg
forks = 10 ### multi thread 개수
host_key_checking = False ### 호스트 키 확인과정이 필요한지
timeout = 5
remote_user = ansible_user ### target 서버에 붙을 계정
ansible 구성요소
inventory
$ vi /engn001/ansible/work/hosts
[mysql_test]
11.11.111.11
22.222.222.22
333.333.333.33
444.444.444.555
[mysql_test:vars]
ansible_ssh_user=root
port=3306
centos_version:6
[mysql_prod]
11.11.111.111
22.222.222.222
333.333.333.333
444.444.444.5555
[mysql_prod:vars]
ansible_ssh_user=root
port=13306
centos_version:7
[redis]
redis1
redis2
redis3
- ansible 로 접속해서 작업할 target 서버 리스트
- all 로 모든 대상서버에 command를 수행하거나 [그룹명] 로 그룹핑한 서버들에만 선별적으로 command 수행 가능
- /etc/hosts 에 대상 서버 ip에 alias를 주면 inventory 파일에서 alias 로 지정 가능
- 대상서버들은 ansible 서버와 ssh keygen 을 통해 key 작업을 해주어야함
- 위에서 설정한 vars 값은 playbook 에서 {{port}} , {{centos_version}} 등으로 사용 가능
module
$ ansible-doc -l | grep mysql_
mysql_info Gather information about MySQL servers
mysql_db Add or remove MySQL databases from a remote host
mysql_variables Manage MySQL global variables
mysql_user Adds or removes a user from a MySQL database
mysql_replication Manage MySQL replication
=> task를 어떻게 수행할 것인지 정의해둔 command의 집합
- 각 module 사용법은 공홈 매뉴얼에서 확인 가능 https://docs.ansible.com/ansible/latest/modules/mysql_variables_module.html
playbook
* vi /engn001/ansible/work/playbook_mysql_task1.yaml
---
- hosts: mysql_prod
become_user: testuser
tasks:
- name: source profile
shell: source ~/.bash_profile && echo $MARIA_HOME
args:
chdir: /home/testuser/
executable: /bin/bash
register: maria_home
- name: mysql command
command: mysql -utestuser -ptest123 -S "{{ item }}"/mysql/mysql.sock -e "show processlist\G"
when : item is defined
with_items:
- "{{ maria_home.stdout }}"
register: result
- debug:
msg="{{ result.results | json_query('[].stdout_lines[]') }}"
yaml 형식
위와 같이 playbook 을 사용하여 특정 서버들에서 수행할 task들을 설정할 수 있음
위 예시는 inventory 설정의 대상서버들 중 [mysql_prod] 그룹을 대상으로 하고
source profile , mysql_command 을 포함하는 task (ansible module를 호출하는 단위)를 수행함
위 playbook 설명
source profile :
ansible이 대상 서버에 ssh 수행하는 방식은 interactive 하기 때문에 login shell 이 수행 되지 않아 대상 서버 계정의 profile 설정을 사용하려면 위와 같이 설정이 필요함
mysql command:
profile 을 읽어 maria db의 home 을 maria_home 변수로 register 후 'mysql command' 수행하는데 활용함
그 결과를 register 에 담아서 debug:msg 에서 출력함
ansible-playbook 수행 결과
$ ansible-playbook -i [인벤토리파일] [플레이북명]
PLAY [dbservers_test_user01] *******************************************************
TASK [Gathering Facts] *********************************************************
ok: [11.111.111.111]
ok: [22.222.222.222]
TASK [source profile] **********************************************************
changed: [22.222.222.222]
changed: [11.111.111.111]
TASK [mysql command] ***********************************************************
changed: [22.222.222.222] => (item=/engn001/test_user01/TEST_10.2.4)
changed: [11.111.111.111] => (item=/engn001/test_user01/TEST_10.2.4)
TASK [debug] *******************************************************************
ok: [11.111.111.111] => {
"msg": [
"*************************** 1. row ***************************",
" Id: 1",
" User: system user",
" Host: ",
" db: NULL",
" Command: Daemon",
" Time: NULL",
" State: InnoDB background thread",
" Info: NULL",
"Progress: 0.000",
"*************************** 2. row ***************************",
" Id: 2",
" User: system user",
" Host: ",
" db: NULL",
" Command: Daemon",
" Time: NULL",
" State: InnoDB background thread",
" Info: NULL",
"Progress: 0.000",
]
}
ok: [22.222.222.222] => {
"msg": [
"*************************** 1. row ***************************",
" Id: 1",
" User: system user",
" Host: ",
" db: NULL",
" Command: Daemon",
" Time: NULL",
" State: InnoDB background thread",
" Info: NULL",
"Progress: 0.000",
"*************************** 2. row ***************************",
" Id: 2",
" User: system user",
" Host: ",
" db: NULL",
" Command: Daemon",
" Time: NULL",
" State: InnoDB background thread",
" Info: NULL",
"Progress: 0.000",
]
}
PLAY RECAP *********************************************************************
11.111.111.111 : ok=4 changed=2 unreachable=0 failed=0 skipped=0
22.222.222.222 : ok=4 changed=2 unreachable=0 failed=0 skipped=0
- ok : 변경사항 없음
- changed : 변경사항 있음
- unreachable : 서버에 접속 실패
- failed : 실패
- skipped : playbook 설정의 조건에 맞지 않아서 실행되지 않은 경우
MySQL module 활용 예제
- variables 조회
---
- name: test
hosts: mysql
gather_facts: no
vars:
mysql_user: prom
mysql_password: qhdks123
mysql_port: 3306
login_unix_socket: /engn001/mysql/data/mysql.sock
tasks:
- name: install mysql-python
yum:
name: "{{ item }}"
state: installed
with_items:
- MySQL-python
- name: get variables
mysql_variables:
login_user: "{{ mysql_user }}"
login_password: "{{ mysql_password }}"
variable: sql_mode
register: result
- debug: var=result
- 결과
ok: [172.18.0.3] => {
"result": {
"changed": false,
"failed": false,
"msg": "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
}
}
ok: [172.18.0.2] => {
"result": {
"changed": false,
"failed": false,
"msg": "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
}
}