目錄
前言
一、概述
常見的開源自動(dòng)化運(yùn)維工具比較
二、ansible環(huán)境搭建
三、ansible模塊
(一)、hostname模塊
(二)、file模塊
(三)、copy模塊
(四)、fetch模塊
(五)、user模塊
(六)、group模塊
(七)、cron模塊
(八)、yum_repository模塊
(九)、yum模塊
(十)、service模塊
(十一)、script模塊
(十二)、command與shell模塊
三、playbook
(一)、YAML格式
(二)、Playbook常見語法
(三)、實(shí)例
四、roles介紹
(一)、roles的目錄結(jié)構(gòu)
(二)、roles實(shí)現(xiàn)lamp
? (三)、拓展安裝discuz
總結(jié)
前言
公司的服務(wù)器越來越多, 維護(hù)一些簡單的事情都會變得很繁瑣。用shell腳本來管理少量服務(wù)器效率還行, 服務(wù)器多了之后, shell腳本無法實(shí)現(xiàn)高效率運(yùn)維。這種情況下,我們需要引入自動(dòng)化運(yùn)維工具, 對多臺服務(wù)器實(shí)現(xiàn)高效運(yùn)維。
一、概述
ansible是一種由Python開發(fā)的自動(dòng)化運(yùn)維工具,集合了眾多運(yùn)維工具(puppet、cfengine、chef、func、fabric)的優(yōu)點(diǎn),實(shí)現(xiàn)了批量系統(tǒng)配置、批量程序部署、批量運(yùn)行命令等功能。
架構(gòu)圖
特點(diǎn)
-
部署簡單
-
默認(rèn)使用ssh進(jìn)行管理,基于python里的==paramiko==模塊開發(fā)
-
管理端和被管理端不需要啟動(dòng)服務(wù)
-
配置簡單,功能強(qiáng)大,擴(kuò)展性強(qiáng)
-
能過playbook(劇本)進(jìn)行多個(gè)任務(wù)的編排
常見的開源自動(dòng)化運(yùn)維工具比較
-
puppet(拓展)
基于ruby語言,成熟穩(wěn)定。適合于大型架構(gòu),相對于ansible和saltstack會復(fù)雜些。
-
saltstack(拓展)
基于python語言。相對簡單,大并發(fā)能力比ansible要好, 需要維護(hù)被管理端的服務(wù)。如果服務(wù)斷開,連接就會出問題。
-
ansible
基于python語言。簡單快捷,被管理端不需要啟服務(wù)。直接走ssh協(xié)議,需要驗(yàn)證所以機(jī)器多的話速度會較慢。
二、ansible環(huán)境搭建
一臺管理
192.168.238.129(hd1)
兩臺被管理
192.168.238.130(hd2)
192.168.238.131(hd3)
防火墻設(shè)置、寬容模式(selinux )、NAT模式
所有主機(jī)都要配置主機(jī)名和 hosts文件
192.168.238.129
yum install -y epel-release
yum install -y ansible
設(shè)置免密登錄
若不免密操作,在后面操作agent時(shí)都要加-k參數(shù)傳密碼;或者在主機(jī)清單里傳密碼。
ssh-keygen
ssh-copy-id hd2
ssh-copy-id hd3
vim /etc/ansible/hosts
若不進(jìn)行免密會失敗
免密后進(jìn)行ping通測試(綠色為成功,紅色為失?。?/p>
主機(jī)清單功能
因?yàn)槲唇o自己免密所以129會失敗
三、ansible模塊
ansible是基于模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運(yùn)行的模塊,ansible只是提供一種框架。
ansible支持的模塊非常的多,我們并不需要把每個(gè)模塊都記住,而只需要熟悉一些常見的模塊,其它的模塊在需要用到時(shí)再查詢即可。
?官網(wǎng)模塊文檔地址:Ansible Documentation
(一)、hostname模塊
hostname模塊用于修改主機(jī)名(注意: 它不能修改/etc/hosts文件)?
基本格式為: ansible 操作的機(jī)器名或組名 -m 模塊名 -a "參數(shù)1=值1 參數(shù)2=值2" argment
例:修改hd3的hostname
(二)、file模塊
file模塊:用于對文件相關(guān)的操作(創(chuàng)建, 刪除, 軟硬鏈接等)
stat模塊:類似linux的stat命令,用于獲取文件的狀態(tài)信息 。(了解)
創(chuàng)建一個(gè)目錄
ansible my -m file -a 'path=/test state=directory'
創(chuàng)建一個(gè)文件
注意:my組的驗(yàn)證文章中多數(shù)只截取了一臺機(jī)器
ansible my -m file -a 'path=/test/1.txt state=touch'
遞歸修改owner,group,mode
ansible 192.168.238.130 -m file -a 'path=/root/OK recurse=yes owner=bin group=bin mode=1777'
創(chuàng)建文件并指定owner,group,mode等
ansible my -m file -a 'path=/test/1.txt state=file owner=bin group=daemon mode=1777'
也可以指定其中一項(xiàng)進(jìn)行創(chuàng)建修改
刪除文件
刪除目錄 absent(缺席的) 會連同目錄里的所有文件,刪除文件值刪除對應(yīng)文件
ansible my -m file -a 'path=/test/1.txt state=absent '
創(chuàng)建軟鏈接文件
ansible my -m file -a 'src=/etc/fstab path=/opt/fstab state=link'
創(chuàng)建硬鏈接文件
ansible my -m file -a 'src=/etc/fstab path=/opt/fstab2 state=hard'
(三)、copy模塊
copy模塊用于對文件的遠(yuǎn)程拷貝操作(如把本地的文件拷貝到遠(yuǎn)程的機(jī)器上)
echo master > OK
ansible my -m copy -a 'src=/root/OK dest=/opt/word'
content參數(shù)
使用content參數(shù)直接往遠(yuǎn)程文件里寫內(nèi)容(會覆蓋原內(nèi)容)
注意:ansible中-a后面的參數(shù)里也有引號時(shí),記得要單引雙引交叉使用,如果都為雙引會出現(xiàn)問題。
ansible my -m copy -a 'content="hello\n" dest=/opt/word'
force參數(shù)
使用force參數(shù)控制是否強(qiáng)制覆蓋
如果目標(biāo)文件已經(jīng)存在,則不覆蓋 ansible my -m copy -a 'src=/root/OK dest=/opt/word force=no' 如果目標(biāo)文件已經(jīng)存在,則會強(qiáng)制覆蓋 ansible my -m copy -a 'src=/root/OK dest=/opt/word force=yes'
backup參數(shù)
使用backup參數(shù)控制是否備份文件
backup=yes表示如果拷貝的文件內(nèi)容與原內(nèi)容不一樣,則會備份一份 my的機(jī)器上會將/opt/word備份一份(備份文件命名加上時(shí)間),再遠(yuǎn)程拷貝新的文件為/opt/word ansible my -m copy -a 'src=/root/OK dest=/opt/word backup=yes owner=daemon group=daemon mode=1777'
"/"符號
copy模塊拷貝時(shí)要注意拷貝目錄后面是否帶"/"符號
/etc/yum.repos.d后面不帶/符號,則表示把/etc/yum.repos.d整個(gè)目錄拷貝到/tmp/目錄下 ansible my -m copy -a 'src=/etc/yum.repos.d dest=/mnt/' /etc/yum.repos.d/后面帶/符號,則表示把/etc/yum.repos.d/目錄里的所有文件拷貝到/tmp/目錄下 ansible my -m copy -a 'src=/etc/yum.repos.d/ dest=mnt/'
(四)、fetch模塊
fetch模塊與copy模塊類似,但作用相反。用于把遠(yuǎn)程機(jī)器的文件拷貝到本地。
注意: fetch模塊不能從遠(yuǎn)程拷貝目錄到本地
創(chuàng)建同名文件
(五)、user模塊
user模塊用于管理用戶賬號和用戶屬性。
創(chuàng)建aaa用戶,默認(rèn)為普通用戶,創(chuàng)建家目錄
ansible 192.168.238.130 -m user -a 'name=aaa state=present'
創(chuàng)建bbb系統(tǒng)用戶,并且登錄shell環(huán)境為/sbin/nologin
ansible 192.168.238.130 -m user -a 'name=bbb state=present system=yes shell="/sbin/nologin"'
創(chuàng)建ccc用戶, 使用uid參數(shù)指定uid, 使用password參數(shù)傳密碼 (密碼要用雙引號引起來,單引號的話驗(yàn)證時(shí)會密碼不正確)
echo 123123 | openssl passwd -1 -stdin
ansible 192.168.238.130 -m user -a 'name=ccc uid=2000 state=present password="$1$TyI.ymu/$bDnWZc.re9V/37HAZAgrf0"'
刪除aaa用戶,但家目錄默認(rèn)沒有刪除
ansible 192.168.238.130 -m user -a 'name=aaa state=absent'
刪除bbb用戶,使用remove=yes參數(shù)讓其刪除用戶的同時(shí)也刪除家目錄
ansible 192.168.238.130 -m user -a 'name=bbb state=absent remove=yes'
創(chuàng)建一個(gè)普通用戶叫badboy,并產(chǎn)生空密碼 密鑰對echo
ansible 192.168.238.130 -m user -a 'name=badboy generate_ssh_key=yes'
產(chǎn)生空密碼指的是這個(gè),并非空密碼
(六)、group模塊
group模塊用于管理用戶組和用戶組屬性。
創(chuàng)建組
ansible 192.168.238.130 -m group -a 'name=long gid=3000 state=present'
刪除組(如果有用戶的gid為此組,則刪除不了)
ansible 192.168.238.130 -m group -a 'name=long state=absent'
ansible 192.168.238.130 -m group -a 'name=ss state=absent'
(七)、cron模塊
cron模塊用于管理周期性時(shí)間任務(wù)。
創(chuàng)建一個(gè)cron任務(wù),不指定user的話,默認(rèn)就是root。
minute,hour,day,month,week不指定的話,默認(rèn)都為*
ansible 192.168.238.130 -m cron -a 'name="test cron1" user=root job="touch /mnt/mnt.txt" minute=*/2'
也可以crontab -l查看任務(wù)
刪除cron任務(wù)
ansible 192.168.238.130 -m cron -a 'name="test cron1" state=absent'
(八)、yum_repository模塊
yum_repository模塊用于配置yum倉庫。
注意:此模塊只幫助配置yum倉庫,但如果倉庫里沒有軟件包,安裝一樣會失敗。所以可以手動(dòng)去掛載光驅(qū)。
增加一個(gè)/etc/yum.repos.d/local.repo配置文件 。(輸入命令注意-a后引號)
ansible 192.168.238.130 -m yum_repository -a "name=local description=localyum baseurl=file:///mnt/ enabled=yes gpgcheck=no"
刪除/etc/yum.repos.d/local.repo配置文件
ansible 192.168.238.130 -m yum_repository -a "name=local state=absent"
(九)、yum模塊
yum模塊用于使用yum命令來實(shí)現(xiàn)軟件包的安裝與卸載。
使用yum安裝一個(gè)軟件(前提:被安裝的機(jī)器上yum配置都已經(jīng)OK)
ansible 192.168.238.130 -m yum -a 'name=dhcp state=present'
使用yum安裝l軟件,state=latest表示安裝最新版本
ansible 192.168.238.130 -m yum -a 'name=dhcp state=latest'
使用yum卸載一個(gè)軟件
ansible 192.168.238.130 -m yum -a 'name=dhcp state=absent'
(十)、service模塊
service模塊用于控制服務(wù)的啟動(dòng),關(guān)閉,開機(jī)自啟動(dòng)等。
啟動(dòng)vsftpd服務(wù),并設(shè)為開機(jī)自動(dòng)啟動(dòng)
ansible 192.168.238.130 -m yum -a 'name=vsftpd state=present'
ansible 192.168.238.130 -m service -a 'name=vsftpd state=started enabled=on'
關(guān)閉vsftpd服務(wù),并設(shè)為開機(jī)不自動(dòng)啟動(dòng)
ansible 192.168.238.130 -m service -a 'name=vsftpd state=stoppd enabled=fales'
(十一)、script模塊
script模塊用于在遠(yuǎn)程機(jī)器上執(zhí)行本地腳本。(不用給權(quán)限)
vim /root/test.sh
ansible 192.168.238.130 -m script -a '/root/test.sh'
(十二)、command與shell模塊
兩個(gè)模塊都是用于執(zhí)行l(wèi)inux命令的,這對于命令熟悉的工程師來說,用起來非常high。
shell模塊與command模塊差不多(command模塊不能執(zhí)行一些類似$HOME,>,<,|等符號,但shell可以)
注意: shell模塊并不是百分之百任何命令都可以,比如vim或ll別名就不可以。不建議大家去記憶哪些命令不可以,大家只要養(yǎng)成任何在生產(chǎn)環(huán)境里的命令都要先在測試環(huán)境里測試一下的習(xí)慣就好。
查看my組IP
ansible my -m command -a 'ifconfig ens33'
對比于shell
ansible my -m command -a 'ifconfig ens33 |grep netmask'
ansible my -m shell -a 'ifconfig ens33 |grep netmask'
三、playbook
playbook(劇本): 是ansible用于配置,部署,和管理被控節(jié)點(diǎn)的劇本。用于ansible操作的編排。
使用的格式為yaml格式。(saltstack,elk,docker,docker-compose,kubernetes等也都會用到y(tǒng)aml格式)
(一)、YAML格式
注意: 寫這種文件不要使用tab鍵,都使用空格。
-
以.yaml或.yml結(jié)尾
-
文件的第一行以 "---"開始,表明YMAL文件的開始(可選的)
-
以#號開頭為注釋
-
列表中的所有成員都開始于相同的縮進(jìn)級別, 并且使用一個(gè)
"- "
作為開頭(一個(gè)橫杠和一個(gè)空格) -
一個(gè)字典是由一個(gè)簡單的
鍵: 值
的形式組成(這個(gè)冒號后面必須是一個(gè)空格)
(二)、Playbook常見語法
hosts | 用于指定要執(zhí)行任務(wù)的主機(jī),其可以是一個(gè)或多個(gè)由冒號分隔主機(jī)組 | ||
remote_user | 用于指定遠(yuǎn)程主機(jī)上的執(zhí)行任務(wù)的用戶 | ||
tasks | 任務(wù)列表, 按順序執(zhí)行任務(wù) | ||
如果一個(gè)host執(zhí)行task失敗, 這個(gè)tasks會回滾, 修正playbook 中的錯(cuò)誤, 然后重新執(zhí)行即可 | |||
handlers | 類似task,但需要使用notify通知調(diào)用 | ||
不管有多少個(gè)通知者進(jìn)行了notify,等到play中的所有task執(zhí)行完成之后,handlers也只會被執(zhí)行一次 | |||
handlers最佳的應(yīng)用場景是用來重啟服務(wù),或者觸發(fā)系統(tǒng)重啟操作.除此以外很少用到了 | |||
variables | 變量 | ||
定義變量可以被多次方便調(diào)用 |
(三)、實(shí)例
playbook編排my組安裝httpd
mkdir /root/palybook
vim /root/palybook/test.yml
可以中文,最好注釋以免造成異常(傳輸?shù)奈募_保主機(jī)有不然會失?。?/p>
執(zhí)行寫好的palybook :ansible-playbook /root/playbook/test.yml
vim /etc/httpd/conf/httpd.conf
修改配置文件端口為443
再次執(zhí)行palybook: ansible-playbook /root/playbook/test.yml
playbook編排多個(gè)hosts任務(wù)
vim /etc/httpd/conf/host.conf
ansible-playbook /root/playbook/host.yml
書寫錯(cuò)誤
my組用變量
vim /etc/httpd/conf/host.conf
ansible-playbook /root/playbook/host.yml
四、roles介紹
roles(角色): 就是通過分別將variables, tasks及handlers等放置于單獨(dú)的目錄中,并可以便捷地調(diào)用它們的一種機(jī)制。
假設(shè)我們要寫一個(gè)playbook來安裝管理lamp環(huán)境,那么這個(gè)playbook就會寫很長。所以我們希望把這個(gè)很大的文件分成多個(gè)功能拆分, 分成apache管理,php管理,mysql管理,然后在需要使用的時(shí)候直接調(diào)用就可以了,以免重復(fù)寫。就類似編程里的模塊化的概念,以達(dá)到代碼復(fù)用的效果。
(一)、roles的目錄結(jié)構(gòu)
注意: 在每個(gè)角色的目錄中分別創(chuàng)建files, tasks,handlers,templates,vars和meta目錄,用不到的目錄可以創(chuàng)建為空目錄.。
files | 用來存放由copy模塊或script模塊調(diào)用的文件 |
tasks | 至少有一個(gè)main.yml文件,定義各tasks |
handlers | 有一個(gè)main.yml文件,定義各handlers |
templates | 用來存放jinjia2模板 |
vars | 有一個(gè)main.yml文件,定義變量 |
meta | 有一個(gè)main.yml文件,定義此角色的特殊設(shè)定及其依賴關(guān)系 |
(二)、roles實(shí)現(xiàn)lamp
創(chuàng)建目錄及文件,并確認(rèn)目錄結(jié)構(gòu)
mkdir -p {httpd,mysql,php}/{files,tasks,handlers,templates,vars,meta}
touch {httpd,mysql,php}/{tasks,handlers,vars,meta}/main.yml
準(zhǔn)備httpd服務(wù)器的主頁文件,php測試頁和配置文件等
echo "hello" > /etc/ansible/roles/httpd/files/index.html
echo -e "<?php\n\tphpinfo();\n?>" > /etc/ansible/roles/httpd/files/test.php
yum install -y httpd
cp /etc/httpd/conf/httpd.conf /etc/ansible/roles/httpd/files/
編寫httpd角色的main.yml文件
vim /etc/ansible/roles/httpd/tasks/main.yml
編寫httpd角色里的handler
vim /etc/ansible/roles/httpd/handler/main.yml
編寫php角色的main.yml文件
vim /etc/ansible/roles/php/tasks/main.yml
編寫mysql角色的main.yml文件
vim /etc/ansible/roles/mysql/tasks/main.yml
編寫lamp的playbook文件調(diào)用前面定義好的三個(gè)角色
創(chuàng)建個(gè)playbook/lamp.yaml文件,位置隨意
vim /root/playbook/lamp.yaml
注意:要與前面創(chuàng)建的名稱一樣
執(zhí)行l(wèi)amp的playbook文件
ansible-playbook /root/playbook/lamp.yml
? (三)、拓展安裝discuz
在此基礎(chǔ)上安裝discuz
discuz包放在/roles/httpd/files中
修改httpd角色的main.yml文件進(jìn)行添加
vim /etc/ansible/roles/httpd/tasks/main.yml
修改mysql角色的main.yml文件
vim /etc/ansible/roles/mysql/tasks/main.yml
編寫mysql的建庫腳本
vim /etc/ansible/roles/mysql/files/create.sh
執(zhí)行l(wèi)amp的playbook文件
后續(xù)用mysql創(chuàng)建的授權(quán)用戶和數(shù)據(jù)庫即可。文章來源:http://www.zghlxwxcb.cn/news/detail-705809.html
總結(jié)
今天內(nèi)容相當(dāng)于可以舒緩下大腦了,沒有zabbix那么繁瑣的的流程。與基礎(chǔ)命令的使用相似,只是在基礎(chǔ)稍微擴(kuò)展,模版較多熟記常用的就好,要理解含義再操作更有助于背記。playbook為整體,roles為進(jìn)行分類,顯得比較有序,報(bào)錯(cuò)可找到對應(yīng)的地方進(jìn)行處理。文章來源地址http://www.zghlxwxcb.cn/news/detail-705809.html
到了這里,關(guān)于Ansible自動(dòng)化運(yùn)維的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!