運維自動化工具 Ansible
Ansible 簡單的說是一個配置管理系統(configuration management system)。你只需要可以使用 ssh 訪問你的服務器或設備就行。它也不同於其他工具,因為它使用推送的方式,而不是像 puppet 等 那樣使用拉取安裝agent的方式。你可以將代碼部署到任意數量的服務器上!
1、Ansible能做什麽
ansible可以幫助我們完成一些批量任務,或者完成一些需要經常重復的工作。
- 比如:同時在100臺服務器上安裝nginx服務,並在安裝後啟動它們。
- 比如:將某個文件一次性拷貝到100臺服務器上。
- 比如:每當有新服務器加入工作環境時,你都要為新服務器部署某個服務,也就是說你需要經常重復的完成相同的工作。
這些場景中我們都可以使用到ansible。
2、Ansible特性
- 模塊化:調用特定的模塊,完成特定任務
- 有Paramiko,PyYAML,Jinja2(模板語言)三個關鍵模塊
- 支持自定義模塊
- 基於Python語言實現
- 部署簡單,基於python和SSH(默認已安裝),agentless
- 安全,基於OpenSSH
- 支持playbook編排任務
- 冪等性:一個任務執行1遍和執行n遍效果一樣,不因重復執行帶來意外情況
- 無需代理不依賴PKI(無需ssl)
- 可使用任何編程語言寫模塊
- YAML格式,編排任務,支持豐富的數據結構
- 較強大的多層解決方案
3、Ansible架構
- Ansible核心組件說明:
Ansible:Ansible的核心程序
Host Lnventory:記錄了每一個由Ansible管理的主機信息,信息包括ssh端口,root帳號密碼,ip地址等等。可以通過file來加載,可以通過CMDB加載
Playbooks:YAML格式文件,多個任務定義在一個文件中,使用時可以統一調用,“劇本”用來定義那些主機需要調用那些模塊來完成的功能.
Core Modules:Ansible執行任何管理任務都不是由Ansible自己完成,而是由核心模塊完成;Ansible管理主機之前,先調用core Modules中的模塊,然後指明管理Host Lnventory中的主機,就可以完成管理主機。Custom Modules:自定義模塊,完成Ansible核心模塊無法完成的功能,此模塊支持任何語言編寫。
Connection Plugins:連接插件,Ansible和Host通信使用
二、Ansible 的安裝
安裝方法有很多,這裏僅僅以CentOS 7 yum安裝為例,Ansible默認不在標準倉庫中,需要用到EPEL源。
yum install ansible -y
[root@monitor ~]# ansible --version
ansible 2.6.2
config file = /etc/ansible/ansible.cfg
configured module search path = [u‘/root/.ansible/plugins/modules‘, u‘/usr/share/ansible/plugins/modules‘]
ansible python module location = /usr/lib/python2.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.6.6 (r266:84292, Jul 23 2015, 15:22:56) [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)]
三、Ansible 配置
1、實驗環境
我這裏主要是拿這幾臺設備進行測試,分組是隨意的。
IP | 系統 | 功能 |
---|---|---|
10.0.0.14 | CentOS 6.7 | ansible主控服務器 |
10.0.0.4 | CentOS 7.3 | cluster1 |
10.0.0.9 | CentOS 6.6 | cluster1 |
10.0.0.19 | CentOS 6.9 | cluster2 |
10.0.0.20 | CentOS 6.5 | cluster2 |
10.0.0.21 | CentOS 6.5 | cluster2 |
2、Inventory 主機清單
在主控服務器上面配置清單。
# cat /etc/ansible/hosts
[cluster1]
10.0.0.4
10.0.0.9
[cluster2]
10.0.0.19
10.0.0.20
10.0.0.21
3、配置無密碼通信
這裏配置比較簡單,自行操作一下。
4、測試 ping
[root@monitor ~]# ansible all -m ping
10.0.0.4 | SUCCESS => {
"changed": false,
"ping": "pong"
}
10.0.0.19 | SUCCESS => {
"changed": false,
"ping": "pong"
}
10.0.0.21 | SUCCESS => {
"changed": false,
"ping": "pong"
}
10.0.0.20 | SUCCESS => {
"changed": false,
"ping": "pong"
}
10.0.0.9 | SUCCESS => {
"changed": false,
"ping": "pong"
}
四、Ansible 模塊
ansible 使用方法
ansible <host-pattern> [-m module_name] [options]
指令 匹配規則的主機清單 -m 模塊名 選項
查看模塊使用方法
ansible-doc -s MODULE_NAME
1、ping
功能:嘗試連接到主機,驗證並返回pong成功。
對於Windows目標,請改用win_ping模塊
不使用icmp協議,使用ssh協議。
# ansible all -m ping
10.0.0.4 | SUCCESS => {
"changed": false,
"ping": "pong" # 返回pong表明成功通訊
}
2、command
功能:在遠程節點上執行命令
變量和操作符號 "<", ">", "|", ";" and "&" 不能正常工作。如果需要使用,請使用 shell 模塊
Ansible 默認不指定模塊時,將使用此模塊。
[root@monitor ~]# ansible cluster1 -a ‘date‘
10.0.0.4 | SUCCESS | rc=0 >>
Thu Sep 13 17:00:23 CST 2018
10.0.0.9 | SUCCESS | rc=0 >>
Thu Sep 13 17:00:33 CST 2018
3、shell
功能:在遠程節點上執行命令。
與command模快使用一致,但是,變量 和操作符號 "<", ">", "|", ";" and "&" 能正常工作。
我這裏使用通配符,使用command
模塊是不行的。
# ansible cluster1 -m command -a ‘ls -d /usr/local/tomcat0[1-3]‘
10.0.0.4 | FAILED | rc=2 >>
ls: cannot access /usr/local/tomcat0[1-3]: No such file or directorynon-zero return code
10.0.0.9 | FAILED | rc=2 >>
ls: cannot access /usr/local/tomcat0[1-3]: No such file or directorynon-zero return code
改成shell
模塊就可以。
# ansible cluster1 -m shell -a ‘ls -d /usr/local/tomcat0[1-3]‘
10.0.0.4 | SUCCESS | rc=0 >>
/usr/local/tomcat01
/usr/local/tomcat02
/usr/local/tomcat03
10.0.0.9 | SUCCESS | rc=0 >>
/usr/local/tomcat01
/usr/local/tomcat02
/usr/local/tomcat03
4、cron
功能:管理計劃任務
backup:對遠程主機上的原任務計劃內容修改之前做備份
cron_file:如果指定該選項,則用該文件替換遠程主機上的cron.d目錄下的用戶的任務計劃
day:日(1-31,,/2,……)
hour:小時(0-23,,/2,……)
minute:分鐘(0-59,,/2,……)
month:月(1-12,,/2,……)
weekday:周(0-7,*,……)
job:要執行的任務,依賴於state=present
name:該任務的描述
special_time:指定什麽時候執行,參數:reboot,yearly,annually,monthly,weekly,daily,hourly
state:確認該任務計劃是創建還是刪除
user:以哪個用戶的身份執行
-
創建一個定時任務。
# ansible cluster1 -m cron -a ‘name="test cron job" minute=*/2 job="/usr/bin/wall hello world"‘ 10.0.0.4 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "test cron job" ] } 10.0.0.9 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "test cron job" ] }
- 查看創建的任務
# ansible cluster1 -a ‘crontab -l‘
10.0.0.4 | SUCCESS | rc=0 >>
42 5 * * * /usr/sbin/ntpdate time1.aliyun.com
#Ansible: test cron job
*/2 * * * * /usr/bin/wall hello world
10.0.0.9 | SUCCESS | rc=0 >>
23 15 * * * /usr/sbin/ntpdate time1.aliyun.com
#Ansible: test cron job
*/2 * * * * /usr/bin/wall hello world
- 刪除定時任務
# ansible cluster1 -m cron -a ‘name="test cron job" minute=*/2 job="/usr/bin/wall hello world" state=absent‘
10.0.0.4 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": []
}
10.0.0.9 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": []
}
運維自動化工具 Ansible