當(dāng)前位置: 首頁(yè)最新資訊 IT業(yè)界 → 基于Ansible實(shí)現(xiàn)批量管理

基于Ansible實(shí)現(xiàn)批量管理

更多

基于Ansible實(shí)現(xiàn)批量管理

Ansible提供一種最簡(jiǎn)單的方式用于發(fā)布、管理和編排計(jì)算機(jī)系統(tǒng)的工具,可在數(shù)分鐘內(nèi)搞定,Ansible本身是一種python程序,只需要配置一個(gè)節(jié)點(diǎn),只要ssh連接ok 被控制節(jié)點(diǎn)不需要安裝任何工具,就可以實(shí)現(xiàn)遠(yuǎn)程連接執(zhí)行任何操作支持多節(jié)點(diǎn)發(fā)布、遠(yuǎn)程任務(wù)執(zhí)行。

如果想熟練使用Ansible 還需了解Ansible的模塊機(jī)制,下面我們來(lái)介紹ansible的日常使用,從而達(dá)到我們批量管理的目的


安裝ansible

只需要將管理節(jié)點(diǎn)安裝ansible ,被管理節(jié)點(diǎn)不需要安裝

但如果使用yum安裝的話,必須配置epel源

rpm -Uvh  http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

rpm -import/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

安裝依賴關(guān)系包

yum installpython-dev python-yamlpython-paramiko python-jinja2 git

確保無(wú)誤,使用yum安裝absible

yum install ansible

ansbible配置文件

安裝后的配置文件位于/etc/ansible

[root@node1ansible]# pwd

/etc/ansible

[root@node1ansible]# ll
total 20
-rw-r--r--. 1 root root 5507 May  1 17:53 ansible.cfg     #主配置文件
-rw-r--r--. 1 root root  965 Mar 15 13:07 hosts            #目標(biāo)主機(jī)

目標(biāo)被管理主機(jī)要定義在host中,否則只能一個(gè)一個(gè)去手寫(xiě)了

查看配置文件ansible.cfg常用參數(shù):

hostfile  = /etc/ansible/hosts      #默認(rèn)目標(biāo)主機(jī)文件
library = /usr/share/ansible       #庫(kù)文件,裝載模塊時(shí)候其模塊裝載的路徑,因?yàn)閍nsible是模塊化的工具

module_name =command              #模塊的名稱,意思是沒(méi)有使用指定模塊的時(shí)候其默認(rèn)使用的模塊,默認(rèn)是命令,意為只執(zhí)行命令

forks = 5                            #啟動(dòng)的子進(jìn)程

remote_port  = 22                    #被管理主機(jī)的端口,默認(rèn)為22,如果ssh端口有變動(dòng)則需要修改此參數(shù)

sudo_user = root                      #如果以普通用戶登錄進(jìn)行sudo那么sudo的默認(rèn)賬戶是root


host配置文件

一般按照安全性要求,應(yīng)該禁止 root 登錄,禁用密碼登錄,一律使用證書(shū)登錄。 ansible 支持通過(guò) sudo 來(lái)執(zhí)行

所有管理主機(jī),每個(gè)被管理主機(jī)都可以使用主機(jī)名或者ip地址都可以

使用中括號(hào)可以組,緊跟著中括號(hào)下面的都是同一組內(nèi)被管理的主機(jī)

[root@node1ansible]# grep -v "^#" hosts | grep -v "^$"
green.example.com
blue.example.com
192.168.100.1
192.168.100.10
[webservers]
alpha.example.org
beta.example.org
192.168.1.100
192.168.1.110
www[001:006].example.com           #定義組的時(shí)候還可以使用通配符
[dbservers]
db01.intranet.mydomain.net
db02.intranet.mydomain.net
10.25.1.56
10.25.1.57
db-[99:101]-node.example.com

使用absible批量管理節(jié)點(diǎn)

假如這個(gè)配置文件不符合我們的意向,可以cp一份作為參考模板,方便以后借鑒

[root@node1ansible]# cp hosts hosts.bak

這里我們定義2臺(tái)被管理節(jié)點(diǎn)

#使用[]指定分組

[root@node1ansible]# grep -v '#'  hosts
[hac]
10.0.10.62
10.0.10.61

10.0.10.60

要基于ssh工作,所以本地要生成一對(duì)ssh秘鑰,然后讓其基于秘鑰認(rèn)證方式來(lái)管理節(jié)點(diǎn)

創(chuàng)建秘鑰

[root@node1ansible]# ssh-keygen -t rsa -P ''

傳送至被管理控節(jié)點(diǎn)上去

ssh-copy-id-i .ssh/id_rsa.pub root@10.0.10.60
ssh-copy-id -i .ssh/id_rsa.pub root@10.0.10.62
ssh-copy-id -i .ssh/id_rsa.pub root@10.0.10.61     #因?yàn)楸镜匾彩潜槐O(jiān)控節(jié)點(diǎn)之一

嘗試ansible是否可用

先來(lái)man一下幫助手冊(cè)

ANSIBLE(1)   System administration commands    ANSIBLE(1)

NAME
    ansible - run acommand somewhere else

SYNOPSIS   #使用格式

ansible <host-pattern> [-f forks] [-mmodule_name] [-a args]

主機(jī)模式,可以使用通配

-f forks      表示我們可以明確指明啟動(dòng)多少個(gè)子進(jìn)程去連接這些主機(jī)默認(rèn)不定義為5個(gè)forks,如果節(jié)點(diǎn)比較多,可以將forks參數(shù)調(diào)大

-m           指定使用的模塊,每個(gè)模塊都需要接受特定參數(shù)

-a           來(lái)指定使用參數(shù)

比如我們想讓所有主機(jī)顯示當(dāng)前系統(tǒng)時(shí)間

[root@node1 ~]#ansible all -m command -a 'date'
10.0.10.61 | success | rc=0 >>
Thu May  1 18:49:18 CST 2014

10.0.10.60 | success | rc=0 >>
Mon Apr 28 22:17:58 CST 2014

10.0.10.62 | success | rc=0 >>
Thu May  1 02:49:58 CST 2014

-m command 為指定模塊,默認(rèn)為command,如果默認(rèn)執(zhí)行命令的話,可以不加這個(gè)模塊,如下所示

[root@node1 ~]#ansible all -a 'date'
10.0.10.60 | success | rc=0 >>
Mon Apr 28 22:18:06 CST 2014

10.0.10.62 | success | rc=0 >>
Thu May  1 02:50:05 CST 2014

10.0.10.61 | success | rc=0 >>
Thu May  1 18:49:27 CST 2014

可以看到,時(shí)間不同步,但是命令是同時(shí)進(jìn)行的,因?yàn)闀?huì)發(fā)起N個(gè)子進(jìn)程分別與每個(gè)被監(jiān)控節(jié)點(diǎn)進(jìn)行交互的

如果節(jié)點(diǎn)比較多,可以將forks參數(shù)調(diào)大


現(xiàn)在期望多個(gè)節(jié)點(diǎn)自動(dòng)的去ntp服務(wù)器同步時(shí)間

[root@node1 ~]#ansible all -a 'crontab -l'
10.0.10.60 | FAILED | rc=1 >>
no crontab for root

10.0.10.62 | success | rc=0 >>
00 * * * * ntpdate time.windows.com

10.0.10.61 | FAILED | rc=1 >>
no crontab for root

可以看到只有一個(gè)節(jié)點(diǎn)存在,那么我們只要同步其余兩臺(tái)機(jī)器即可

定義單獨(dú)組

[root@node1ansible]# cat hosts

[hac]
10.0.10.62
10.0.10.61
10.0.10.60

[crontab]
10.0.10.61
10.0.10.60

首先先來(lái)手動(dòng)同步

[root@node1ansible]# ansible crontab -a 'ntpdate time.windows.com'
10.0.10.60 | success | rc=0 >>
30 Apr 18:57:02 ntpdate[2079]: step time server 65.55.56.206 offset160320.206233 sec

10.0.10.61 | success | rc=0 >>
30 Apr 18:57:02 ntpdate[3619]: step time server 65.55.56.206 offset-86361.207014 sec

將時(shí)間同步加入計(jì)劃任務(wù),我們可以使用命令追加的方式來(lái)寫(xiě)入計(jì)劃任務(wù)

[root@node1ansible]# ansible crontab -a 'echo '00 * * * * * ' >>/var/spool/cron/root'

這樣一來(lái)可以實(shí)現(xiàn),但是實(shí)在是太麻煩了,為此,ansible有專門(mén)計(jì)劃任務(wù)管理的模塊,可以使用內(nèi)置模塊來(lái)實(shí)現(xiàn)以最簡(jiǎn)單的命令方式來(lái)輕松批量管理

定義crontab的參數(shù)有很多,可以在官方去查找?guī)椭臋n,這里不再一一介紹


明確指定crontab組,-m指定cron模塊 -a指定參數(shù)

[root@node1 ansible]# ansible crontab -m cron-a 'name="sync time from time.windows.com" minute='*/3'job="/usr/sbin/ntpdate time.windows.com" '
10.0.10.60 | success >> {
   "changed": true,
   "jobs": [
       "sync time fromtime.windows.com"
   ]
}

10.0.10.61 | success >> {
   "changed": true,
   "jobs": [
       "sync time fromtime.windows.com"
   ]
}

[root@node1 ansible]# ansible all -a 'crontab -l'
10.0.10.60 | success | rc=0 >>
#Ansible: sync time from time.windows.com
*/3 * * * * /usr/sbin/ntpdate time.windows.com

10.0.10.62 | success | rc=0 >>
00 * * * * ntpdate time.windows.com

10.0.10.61 | success | rc=0 >>
#Ansible: sync time from time.windows.com
*/3 * * * * /usr/sbin/ntpdate time.windows.com

參數(shù)說(shuō)明:

name=sync time from time.windows" 這是任務(wù)的名稱注釋會(huì)寫(xiě)到crontab里面去,也可以不指定,效果如下所示

[root@node1ansible]# crontab -l

#Ansible:sync time from time.windows.com                        #因此上面多了一個(gè)注釋信息

*/3 * * * */usr/sbin/ntpdate time.windows.com

minute='*/3 我們這里只需要關(guān)注分鐘,只需要提供分鐘的定義,省去的統(tǒng)統(tǒng)默認(rèn)為*

job="/usr/sbin/ntpdate time.windows.com"   此為我們定義的計(jì)劃任務(wù)執(zhí)行的命令

使用ansible批量安裝程序

我們工作場(chǎng)景中,如果想安裝程序的話,只要我們的yum源無(wú)問(wèn)題,那么則可以完全使用yum來(lái)安裝

那我們來(lái)man一下其模塊

man的使用方法比較獨(dú)特如果想man查看ansible模塊的話必須加符號(hào).

[root@node1ansible]# man ansible.yum

安裝vsftpd服務(wù)

[root@node1ansible]# ansible crontab -m yum -a'name=vsftpd state=present'

state=present 狀態(tài)判斷其是安裝還是卸載的,這里也可以使用install

[root@node1ansible]# ansible crontab -m yum -a'name=vsftpd state=present'
10.0.10.61 | success >> {
   "changed": true,
   "msg": "",
   "rc": 0,
   "results": [
       "Loaded plugins: fastestmirror,refresh-packagekit, security\nLoading mirror speeds from cached hostfile\n *base: mirror.neu.edu.cn\n * epel: ftp6.sjtu.edu.cn\n * extras: mirror.neu.edu.cn\n* updates: mirror.neu.edu.cn\nSetting up Install Process\nResolvingDependencies\n--> Running transaction check\n---> Package vsftpd.x86_640:2.2.2-11.el6_4.1 will be installed\n--> Finished DependencyResolution\n\nDependencies Resolved\n\n================================================================================\nPackage        Arch           Version                   Repository    Size\n================================================================================\nInstalling:\nvsftpd         x86_64         2.2.2-11.el6_4.1          base          151 k\n\nTransactionSummary\n================================================================================\nInstall      1 Package(s)\n\nTotal download size: 151 k\nInstalled size: 331 k\nDownloadingPackages:\nRunning rpm_check_debug\nRunning Transaction Test\nTransaction TestSucceeded\nRunning Transaction\n\r  Installing :vsftpd-2.2.2-11.el6_4.1.x86_64                              1/1 \n\r  Verifying  : vsftpd-2.2.2-11.el6_4.1.x86_64                              1/1 \n\nInstalled:\n  vsftpd.x86_64 0:2.2.2-11.el6_4.1                                             \n\nComplete!\n"
   ]
}
10.0.10.60 | success >> {
   "changed": true,
   "msg": "",
   "rc": 0,
   "results": [
       "Loaded plugins: fastestmirror,security\nLoading mirror speeds from cached hostfile\n * base:mirrors.btte.net\n * extras: mirrors.btte.net\n * updates:mirrors.btte.net\nSetting up Install Process\nResolving Dependencies\n-->Running transaction check\n---> Package vsftpd.x86_64 0:2.2.2-11.el6_4.1will be installed\n--> Finished Dependency Resolution\n\nDependenciesResolved\n\n================================================================================\nPackage        Arch            Version                   Repository    Size\n================================================================================\nInstalling:\nvsftpd         x86_64         2.2.2-11.el6_4.1          base          151 k\n\nTransactionSummary\n================================================================================\nInstall      1 Package(s)\n\nTotal download size: 151 k\nInstalled size: 331 k\nDownloadingPackages:\nRunning rpm_check_debug\nRunning Transaction Test\nTransaction TestSucceeded\nRunning Transaction\n\r  Installing :vsftpd-2.2.2-11.el6_4.1.x86_64                              1/1 \n\r  Verifying  :vsftpd-2.2.2-11.el6_4.1.x86_64                              1/1 \n\nInstalled:\n  vsftpd.x86_640:2.2.2-11.el6_4.1                                             \n\nComplete!\n"
   ]
}

對(duì)于ansible來(lái)講的話,很難生成yum配置文件,但可以使用wget將其批量下載

#可以看到只有定義個(gè)沒(méi)用裝,因?yàn)楸緛?lái)就沒(méi)有安裝。。

[root@node1ansible]# ansible all -a 'rpm -q vsftpd'
10.0.10.62 | FAILED | rc=1 >>
package vsftpd is not installed

10.0.10.60 | success | rc=0 >>
vsftpd-2.2.2-11.el6_4.1.x86_64

10.0.10.61 | success | rc=0 >>
vsftpd-2.2.2-11.el6_4.1.x86_64

使其服務(wù)批量啟動(dòng)

[root@node1ansible]# ansible crontab -a '/etc/init.d/vsftpd start'
10.0.10.60 | success | rc=0 >>
Starting vsftpd for vsftpd: [  OK  ]

10.0.10.61 | success | rc=0 >>
Starting vsftpd for vsftpd: [  OK  ]

再查看端口是否被監(jiān)聽(tīng)

[root@node1ansible]# ansible crontab -a 'netstat -lnt ' | grep 21
tcp        0      00.0.0.0:21                 0.0.0.0:*                  LISTEN     
tcp        0      00.0.0.0:21                 0.0.0.0:*                  LISTEN


以上,為absible的簡(jiǎn)單配置與使用,謝謝大家。


熱門(mén)評(píng)論
最新評(píng)論
發(fā)表評(píng)論 查看所有評(píng)論(0)
昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)