ansible
運(yùn)維自動(dòng)化工具介紹
在日常服務(wù)器維護(hù)中,從系統(tǒng)安裝到程序部署再到發(fā)布應(yīng)用揩晴,在大規(guī)模的生產(chǎn)環(huán)境中,如果需要手動(dòng)的每臺(tái)服務(wù)器進(jìn)行安裝配置將會(huì)給運(yùn)維人員帶來許多繁瑣而又重復(fù)的工作叽讳。這就促使了在每個(gè)運(yùn)維層次中出現(xiàn)了不同的自動(dòng)化運(yùn)維工具拟蜻。
常見的自動(dòng)化運(yùn)維工具分類有以下幾類:
系統(tǒng)安裝運(yùn)維工具(OS Provisioning):
常見的有:PXE,Cobbler壳繁,Red Hat Satelite(redhat)系統(tǒng)專用等
操作系統(tǒng)的配置運(yùn)維工具(OS Config):
常見的有:cfengine震捣,puppet,saltsack,chef等
應(yīng)用程序部署工具(Application Service Orchestration):
常見的有:Func,Fabric,ControITier,Capistrano等
根據(jù)工作模式不同上面的運(yùn)維工具有分為以下兩類:
- agent:基于ssl協(xié)議實(shí)現(xiàn),agent工作在被監(jiān)控端闹炉,例如:puppet
- agentless: 基于ssh key實(shí)現(xiàn)蒿赢,例如:ansible
ansible介紹
ansible是一款輕量級(jí)自動(dòng)化運(yùn)維工具,由Python語言開發(fā)渣触,結(jié)合了多種自動(dòng)化運(yùn)維工具的特性羡棵,實(shí)現(xiàn)了批量系統(tǒng)配置、批量程序部署嗅钻、批量命令執(zhí)行等功能皂冰;ansible是基于模塊化實(shí)現(xiàn)批量操作的。
ansible組成
- Ansible: 核心
- Modules: 包括 Ansible 自帶的核心模塊及自定義模塊
- Plugins: 完成模塊功能的補(bǔ)充养篓,包括連接插件秃流、郵件插件等
- Playbooks: 網(wǎng)上很多翻譯為劇本,個(gè)人覺得理解為編排更為合理柳弄;定義 Ansible 多任務(wù)配置文件舶胀,有 Ansible 自動(dòng)執(zhí)行
- Inventory: 定義 Ansible 管理主機(jī)的清單
ansible特點(diǎn)
模塊化、部署簡單、工作于agentless模式嚣伐、默認(rèn)使用ssh協(xié)議糖赔、支持自定義模塊、支持Palybook等
ansible 基本安裝介紹
系統(tǒng)環(huán)境
[root@note1 ~]# uname -a
Linux note1 2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
[root@note1 ~]# cat /etc/redhat-release
CentOS release 6.6 (Final)
epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
安裝ansible
[root@note1 ~]# yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto ansible
配置ansible主機(jī)文件
[root@note1 ~]# > /etc/ansible/hosts #清空文件(操作前先備份)
[root@note1 ~]# vim /etc/ansible/hosts #編輯配置主機(jī)文件
[root@note1 ~]# cat /etc/ansible/hosts #查看配置
[web]
192.168.70.51
[db]
192.168.70.50
配置主機(jī)免密鑰登陸
為了避免Ansible下發(fā)指令時(shí)輸入目標(biāo)主機(jī)密碼轩端,通過證書簽名達(dá)到SSH無密碼是一個(gè)好的方案放典,推薦使用ssh-keygen與ssh- copy-id來實(shí)現(xiàn)快速證書的生成和公鑰下發(fā),其中ssh-keygen生成一對(duì)密鑰基茵,使用ssh-copy-id來下發(fā)生成的公鑰奋构。具體操作如下:
[root@note1 ~]ssh-keygen -t rsa -P ''
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
a8:eb:cc:da:26:06:67:9b:23:ae:45:04:d4:76:63:bb root@bj-idc-15
The key's randomart image is:
+--[ RSA 2048]----+
|o.. |
| . o + |
| o o o |
| . . . |
| . o S |
|..o E |
| +.o. |
|..*+.. |
|++.** |
密鑰拷貝到遠(yuǎn)程主機(jī)
[root@note1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.70.51
root@192.168.70.51's password:
Now try logging into the machine, with "ssh 'root@10.10.10.14'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
[root@note1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.70.50
root@192.168.70.50's password:
Now try logging into the machine, with "ssh 'root@192.168.70.50'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
*注意:在首次連接或者重裝系統(tǒng)之后會(huì)出現(xiàn)檢查 keys 的提示*
測(cè)試ping
[root@note1 ~]# ansible all -m ping
The authenticity of host '192.168.70.50 (192.168.70.50)' can't be established.
RSA key fingerprint is 56:49:f5:4f:3e:30:8d:5c:2c:42:06:79:69:a4:18:89.
Are you sure you want to continue connecting (yes/no)?
解決辦法:
vim /etc/ansible/ansible.cfg 或者 ~/.ansible.cfg
[defaults]
host_key_checking = False
也可以通過設(shè)置系統(tǒng)環(huán)境變量來禁止這樣的提示
export ANSIBLE_HOST_KEY_CHECKING=False
應(yīng)用最后一個(gè)辦法
[root@note1 ~]# export ANSIBLE_HOST_KEY_CHECKING=False
再次測(cè)試
[root@note1 ~]# ansible all -m ping
192.168.70.50 | success >> {
"changed": false,
"ping": "pong"
}
192.168.70.51 | success >> {
"changed": false,
"ping": "pong"
}
Ansible命令參數(shù)介紹
-v,–verbose 詳細(xì)模式,如果命令執(zhí)行成功耿导,輸出詳細(xì)的結(jié)果(-vv –vvv -vvvv)
-i PATH,–inventory=PATH 指定host文件的路徑声怔,默認(rèn)是在/etc/ansible/hosts
-f NUM,–forks=NU NUM是指定一個(gè)整數(shù)态贤,默認(rèn)是5舱呻,指定fork開啟同步進(jìn)程的個(gè)數(shù)。
-m NAME,–module-name=NAME 指定使用的module名稱悠汽,默認(rèn)是command
-m DIRECTORY,–module-path=DIRECTORY 指定module的目錄來加載module箱吕,默認(rèn)是/usr/share/ansible,
-a,MODULE_ARGS 指定module模塊的參數(shù)
-k,-ask-pass 提示輸入ssh的密碼,而不是使用基于ssh的密鑰認(rèn)證
-sudo 指定使用sudo獲得root權(quán)限
-K,-ask-sudo-pass 提示輸入sudo密碼柿冲,與–sudo一起使用
-u USERNAME,-user=USERNAME 指定移動(dòng)端的執(zhí)行用戶
-C,-check 測(cè)試此命令執(zhí)行會(huì)改變什么內(nèi)容茬高,不會(huì)真正的去執(zhí)行
主機(jī)清單介紹hosts
Ansible 通過讀取默認(rèn)的主機(jī)清單配置/etc/ansible/hosts,可以同時(shí)連接到多個(gè)遠(yuǎn)程主機(jī)上執(zhí)行任務(wù)假抄,默認(rèn)路徑可以通過修改 ansible.cfg 的 hostfile 參數(shù)指定路徑怎栽。
[dbserver] []表示主機(jī)的分組名,可以按照功能,系統(tǒng)進(jìn)行分類,便于進(jìn)行操作
192.168.10.2
one.example.com
www.bds.com:5309 #支持指定ssh端口5309
jumper ansible_ssh_port=5309 ansible_ssh_host=192.168.10.2 #設(shè)置主機(jī)別名為jumper
www[01:50].bds.com #支持通配符匹配www01.bds.com www02.bds.com
[web] #提醒下這里面字母是隨便定義的
web-[a:f].bds.com #支持字母匹配 web-a.bds.com ..web-f.bds.com
為主機(jī)指定類型和連接用戶
[bds]
Localhost ansible_connection=local
other1.example.com ansible_connection=ssh ansible_ssh_user=deploy
other2.example.com ansible_connection=ssh ansible_ssh_user=deploy
ansible hosts配置文件中支持指令
注意: 前面如果不配置主機(jī)免密鑰登錄,可以在/etc/ansible/hosts中定義用戶和密碼,主機(jī)ip地址,和ssh端口,這樣也可以進(jìn)行免密碼訪問,但是這個(gè)/hosts文件要保護(hù)好,因?yàn)樗械拿艽a都寫在里面
hosts文件配置參數(shù)介紹
1, ansible_ssh_host :
指定主機(jī)別名對(duì)應(yīng)的真實(shí) IP,如:100 ansible_ssh_host=192.168.1.100宿饱,隨后連接該主機(jī)無須指定完整 IP熏瞄,只需指定 251 就行
2, ansible_ssh_port :
指定連接到這個(gè)主機(jī)的 ssh 端口,默認(rèn) 22
3, ansible_ssh_user:
連接到該主機(jī)的 ssh 用戶
4, ansible_ssh_pass:
連接到該主機(jī)的 ssh 密碼(連-k 選項(xiàng)都省了)谬以,安全考慮還是建議使用私鑰或在命令行指定-k 選項(xiàng)輸入
5, ansible_sudo_pass: sudo 密碼
6, ansible_sudo_exe: sudo 命令路徑
7, ansible_connection :
連接類型强饮,可以是 local、ssh 或 paramiko为黎,ansible1.2 之前默認(rèn)為 paramiko
8, ansible_ssh_private_key_file : 私鑰文件路徑
9, ansible_shell_type :
目標(biāo)系統(tǒng)的 shell 類型邮丰,默認(rèn)為 sh,如果設(shè)置 csh/fish,那么命令需要遵循它們語法
10, ansible_python_interpreter :
python 解釋器路徑铭乾,默認(rèn)是/usr/bin/python剪廉,但是如要要連BSD系統(tǒng)的話,就需要該指令修改 python 路徑
11, ansible__interpreter :
這里的"*"可以是 ruby 或 perl 或其他語言的解釋器炕檩,作用和 ansible_python_interpreter 類似
ansible 常用模塊介紹
ansible使用幫助
[root@note1 ~]# ansible-doc -l #查詢ansible的所有模塊
[root@note1 ~]# ansible-doc -s module_name #查看模塊的屬性信息
例子: 查詢service 模塊的信息
[root@note1 ~]# ansible-doc -s service
less 436
Copyright (C) 1984-2009 Mark Nudelman
less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Homepage: http://www.greenwoodsoftware.com/less
- name: M a n a g e s e r v i c e s .
action: service
arguments # Additional arguments provided on the command line
enabled # Whether the service should start on boot. *At least one of state and enabled are requi
name= # Name of the service.
pattern # If the service does not respond to the status command, name a substring to look for as
runlevel # For OpenRC init scripts (ex: Gentoo) only. The runlevel that this service belongs to.
sleep # If the service is being `restarted' then sleep this many seconds between the stop and
state # `started'/`stopped' are idempotent actions that will not run commands unless necessary
(END)
ansible語法
ansible <pattern_goes_here> -m <module_name> -a <arguments>
command模塊
默認(rèn)模塊 ,用于在各個(gè)被管理節(jié)點(diǎn)運(yùn)行指定的命令(不支持管道和變量)
[root@note1 ~]# ansible all -m command -a "hostname "
192.168.70.51 | success | rc=0 >>
bds
192.168.70.50 | success | rc=0 >>
note1
shell模塊
command模塊功能相同妈经,但比command的模塊功能強(qiáng)大(支持管道和變量)
[root@note1 ~]# ansible all -m shell -a "cat /etc/passwd| grep root "
192.168.70.51 | success | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
192.168.70.50 | success | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
user模塊
用戶模塊,用于在各管理節(jié)點(diǎn)管理用戶所使用
創(chuàng)建一個(gè)名字為DBA的用戶,uid是505 ,家目錄是/Data/dba,shell是不讓用戶登錄
[root@note1 ~]# ansible db -m user -a 'name=DBA uid=505 home=/Data/dba shell=/sbin/nologin'
192.168.70.50 | success >> {
"changed": true,
"comment": "",
"createhome": true,
"group": 505,
"home": "/Data/dba",
"name": "DBA",
"shell": "/sbin/nologin",
"state": "present",
"system": false,
"uid": 505
}
刪除一個(gè)用戶
ansible db -m user -a 'name=budongshu uid=506 state=absent'
group模塊
ansible db -m group -a 'name=test gid=1000'
cron模塊
計(jì)劃定時(shí)任務(wù),用于在各管理節(jié)點(diǎn)管理計(jì)劃任務(wù)
[root@note1 ~]# ansible all -m cron -a "name=time minute='*/2' job='/usr/sbin/ntpdate
copy模塊
復(fù)制模塊,復(fù)制文件到各個(gè)節(jié)點(diǎn)
[root@note1 ~]# ansible all -m copy -a "src=/etc/hosts dest=/tmp/ mode=600"
file模塊
文件模塊 , 修改各個(gè)節(jié)點(diǎn)指定的文件屬性
[root@note1 ~]# ansible all -m file -a 'path=/tmp/hosts mode=644 owner=DBA'
創(chuàng)建目錄類似mkdir –p
[root@note1 ~]# ansible all -m file -a "dest=/tmp/ansible.txt mode=755 owner=root
group=root state=directory"
file刪除文件或者目錄
[root@note1 ~]# ansible all -m file -a "dest=/tmp/ansible.txt state=absent"
注:state的其他選項(xiàng):link(鏈接)、hard(硬鏈接)
stat 模塊
獲取遠(yuǎn)程文件狀態(tài)信息,包含atime吹泡、ctime骤星、mtime、md5爆哑、uid洞难、gid等
[root@note1 ~]# ansible all -m stat -a "path=/etc/passwd "
ping 模塊
測(cè)試模塊 ,測(cè)試各個(gè)節(jié)點(diǎn)是否正常在線
ansible all -m stat -a 'path=/etc/passwd'
template模塊
根據(jù)官方的翻譯是:template使用了Jinjia2格式作為文件模板,進(jìn)行文檔內(nèi)變量的替換的模塊揭朝。他的每次使用都會(huì)被ansible標(biāo)記為changed狀態(tài)队贱。
yum模塊
用于管理節(jié)點(diǎn)安裝軟件所使用
[root@note1 ~]# ansible all -m yum -a 'name=ntp state=present'
卸載的軟件只需要將 name=ntp state=absent
安裝特定版本 name=nginx-1.6.2 state=present
指定某個(gè)源倉庫安裝軟件包name=htop enablerepo=epel state=present
更新軟件到最新版 name=nginx state=latest
service模塊
管理各個(gè)節(jié)點(diǎn)的服務(wù)
[root@note1 ~]# ansible all -m service -a "name=ntpd enabled=true state=started" state 支持其它選項(xiàng) started stopped restarted
script模塊
自動(dòng)復(fù)制腳本到遠(yuǎn)程節(jié)點(diǎn),并運(yùn)行
- 測(cè)試腳本
[root@note1 ~]# cat ansible_test.sh
#!/bin/bash
echo "hello world " >> /tmp/ansible_sh.log
- 運(yùn)行腳本
[root@note1 ~]# ansible all -m script -a 'ansible_test.sh'
setup模塊
收集ansible的facts信息
[root@note1 ~]# ansible all -m setup #收集主機(jī)的facts信息,可以通過變量引用這些信息
ansible 主機(jī)清單通配模式介紹
可以看到上面執(zhí)行命令的時(shí)候有個(gè)ansible -m all ,以上我用的all或指定主機(jī),這里也可以進(jìn)行通配 ,在/etc/ansible/hosts 進(jìn)行設(shè)置如下
[web]
10.10.10.2
10.10.10.3
[db]
10.10.10.4
[allhost:children] #可以把一個(gè)組當(dāng)做另一個(gè)組的子成員
web
db
例子:
ansible web -m shell -a ‘uptime’ #代表web組中的所有主機(jī)
ansible allhost -m shell -a ‘uptime’ #代表allhost組中的所有子成員組
其它匹配方式
1.1 通配所有主機(jī)
all , *
ansible all -m shell -a ‘uptime’
ansible * -m shell –a ‘uptime’
1.2 通配具有規(guī)則特征的主機(jī)或者主機(jī)名
one.bds.com
.bds.com
192.168.10.2
192.168.10.
1.3 通配倆組的所有主機(jī),組名之間通過冒號(hào)分開,表示or的意思
web:db
1.4 非模式匹配: 表示在 web組不在db組的主機(jī)
web:!db
1.5 交集匹配: 表示同時(shí)都在 web 和db組的主機(jī)
web:&db
1.6 匹配一個(gè)組的特定編號(hào)的主機(jī) 從零開始計(jì)算
web[0]
1.7 匹配 web組的第 1 個(gè)到第 25 個(gè)主機(jī)
web [0-25]
1.8 組合匹配
在web組或者在db組中,必須還存在test1組中,但不在test2組中
web:db:&test1:!test2
1.9 大部分人都在patterns應(yīng)用正則表達(dá)式,但你可以.只需要以 ‘~’ 開頭即可:
~(web|db).*.example.com
2.0 同時(shí)讓我們提前了解一些技能,除了如上,你也可以通過 --limit 標(biāo)記來添加排除條件,/usr/bin/ansible or /usr/bin/ansible-playbook都支持:
ansible-playbook site.yml --limit datacenter2
2.1 如果你想從文件讀取hosts,文件名以@為前綴即可.從Ansible 1.2開始支持該功能:
ansible-playbook site.yml --limit @retry_hosts.txt