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의 집합

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