一、Ansible概述
Ansible是今年來越來越火的一款開源運維自動化工具,通過Ansible可以實作運維自動化,提高運維工程師的作業效率,減少人為失誤,Ansible通過本身集成的非常豐富的模塊可以實作各種管理任務,其自帶模塊超過上千個,更為重要的是,它操作非常簡單,即使小白也可以輕松上手,但它提供的功能又非常豐富,在運維領域,幾乎可以做任何事,
1、Ansible特點
Ansible自2012年發布以來,很快在全球流行,其特點如下:
Ansible基于Python開發,運維工程師對其二次開發相對比較容易;
Ansible豐富的內置模塊,幾乎可以滿足一切要求;
管理模式非常簡單,一條命令可以影響上千臺主機;
無客戶端模式,底層通過SSH通信;
- Ansible發布后,也陸續被AWS、Google Cloud Platform、Microsoft Azure、Cisco、HP、VMware、Twitter等大公司接納并投入使用;
二、Ansible的角色
-
使用者:如何使用Ansible實作自動化運維?
-
Ansible工具集:Ansible可以實作的功能?
- 作用物件:Ansible可以影響哪些主機?
1、使用者
如下圖所示:Ansible使用者可以采用多種方式和Ansible互動,圖中展示了四種方式:
-
CMDB:CMDB存盤和管理者企業IT架構中的各項配置資訊,是構建ITIL專案的核心工具,運維人員可以組合CMDB和Ansible,通過CMDB直接下發指令呼叫Ansible工具集完成操作者所希望達到的目標;
-
PUBLIC/PRIVATE方式:Ansible除了豐富的內置模塊外,同時還提供豐富的API語言介面,如PHP、Python、PERL等多種流行語言,基于PUBLIC/PRIVATE,Ansible以API呼叫的方式運行;
-
Ad-Hoc命令集:Users直接通過Ad-Hoc命令集呼叫Ansible工具集來完成任務;
-
Playbooks:Users預先撰寫好Ansible Playbooks,通過執行
Playbooks中預先編排好的任務集,按序執行任務;
2、Ansible工具集
Ansible工具集包含Inventory、Modules、Plugins和API,其中:Inventory:用來管理設備串列,可以通過分組實作,對組的呼叫直接影響組內的所有主機;Modules:是各種執行模塊,幾乎所有的管理任務都是通過模塊執行的;Plugins:提供了各種附加功能;API:為編程人員提供一個介面,可以基于此做Ansible的二次開發;具體表現如下:
Ansible Playbooks:任務腳本,編排定義Ansible任務及的組態檔,由Ansible按序依次執行,通常是JSON格式的YML檔案;
Inventory:Ansible管理主機清單;
Modules:Ansible執行命令功能模塊,多數為內置的核心模塊,也可自定義;
Plugins:模塊功能的補充,如連接型別插件、回圈插件、變數插件、過濾插件等,該功能不太常用;
API:供第三方程式呼叫的應用程式編程介面;
- Ansible:該部分圖中表現得不太明顯,組合Inventory、API、Modules、Plugins可以理解為是Ansible命令工具,其為核心執行工具;
3、作用物件
Ansible的作用物件不僅僅是Linux和非Linux作業系統的主機,也可以作用于各類PUBLIC/PRIVATE、商業和非商業設備的網路設施,
使用者使用Ansible或Ansible-Playbooks時,在服務器終端輸入Ansible的Ad-Hoc命令集或Playbooks后,Ansible會遵循預選安排的規則將Playbooks逐步拆解為Play,再將Play組織成Ansible可以識別的任務,隨后呼叫任務涉及的所有模塊和插件,根據Inventory中定義的主機串列通過SSH將任務集以臨時檔案或命令的形式傳輸到遠程客戶端執行并回傳執行結果,如果是臨時檔案則執行完畢后自動洗掉,
三、Ansible的配置
1、Ansible安裝
Ansible的安裝部署非常簡單,以RPM安裝為例,其依賴軟體只有Python和SSH,且系統默認均已安裝,Ansible的管理端只能是Linux,如Redhat、Debian、Centos,
1)通過YUM安裝Ansible
可以自行從互聯網上直接下載Ansible所需軟體包,本篇博客提供安裝Ansible自動化運維工具所需的依賴軟體包,網盤鏈接:[https://pan.baidu.com/s/1EduwbjYwoj2Pzl9Ye14HEw
提取碼:hsvm])
如果使用本人提供的網盤鏈接,自己建立yum組態檔,掛載光碟這些就不說了啊,畢竟太基礎了!使用互聯網直接安裝即可(實驗環境我這里是關閉防火墻和SELinux的),
[root@centos01 ~]# cd /mnt/ansiblerepo/ansiblerepo/repodata/ [root@centos01 ansiblerepo]# vim /etc/yum.repos.d/local.repo [local] name=centos baseurl=file:///mnt/ansiblerepo/ansiblerepo <!--修改yum路徑-->enabled=1 gpgcheck=0 [root@centos01 ~]# yum -y install ansible <!--安裝Ansible自動化運維工具-->
2)驗證安裝結果
[root@centos01 ~]# ansible --version <!--如果命令可以正常執行,則表示Ansible工具安裝成功-->ansible 2.3.1.0 config file = /etc/ansible/ansible.cfg configured module search path = Default w/o overrides python version = 2.7.5 (default, Nov 6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
3)創建SSH免互動登錄
Ansible通過SSH對設備進行管理,而SSH包含兩種認證方式:一種是通過密碼認證,另一種是通過密鑰對驗證,前者必須和系統互動,而后者是免互動登錄,如果希望通過Ansible自動管理設備,應該配置為免互動登錄被管理設備,如果對SSH免互動式登錄不太了解的朋友可以參考博文:Centos 7.4中的遠程訪問控制里面有詳細的介紹,這里就不詳細介紹了!
[root@centos01 ~]# ssh-keygen -t rsa <!--生成密鑰對-->Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):<!--密鑰對存放路徑-->Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
<!--輸入私鑰保護密碼,直接按Enter鍵表示無密碼-->Enter same passphrase again: <!--再次輸入-->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:
SHA256:cJz6NRTrvMDxX+Jpce6LRnWI3vVEl/zvARL7D10q9WY root@centos01
The key's randomart image is:
+---[RSA 2048]----+
| . . .|
| . . + oo|
| . = o o. oo|
| = * o..+ *|
| . S *.=+=*+|
| . o =+XooE|
| . ..=.++.|
| ..o ..|
| .. o. |
+----[SHA256]-----+
[root@centos01 ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected] <!--復制公鑰到遠端192.168.100.20-->[root@centos01 ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected] <!--復制公鑰到遠端192.168.100.30-->
至此,已經完成Ansible的部署,接下來就可以通過Ansible對設備進行管理了,
2、Ansible配置
Inventory是Ansible管理主機資訊的組態檔,相當于系統Hosts檔案的功能,默認存放在/etc/ansible/hosts,在hosts檔案中,通過分組來組織設備,Ansible通過Inventory來定義主機和分組,通過在ansible命令中使用選項-i或--inventory-file來指定Inventory,
[root@centos01 ~]# ansible -i /etc/ansible/hosts web -m ping
如果使用默認的Inventory檔案(/etc/ansible/hosts),也可以不指定Inventory檔案,例如:
[root@centos01 ~]# ansible web -m ping
Ansible通過設備串列以分組的方式添加到/etc/ansible/hosts檔案來實作對設備的管理,所以在正式管理之前,首先要撰寫好hosts檔案,hosts檔案中,以[ ]包含的部分代表組名,設備串列支持主機名和IP地址,默認情況下,通過訪問22埠(SSH)來管理設備,若目標主機使用了非默認的SSH埠,還可以在主機名稱之后使用冒號加埠標明,以行為單位分隔配置,另外,hosts檔案還支持通配符,
[root@centos01 ~]# vim /etc/ansible/hosts ............ <!--此處省略部分內容-->[web] 192.168.100.20 192.168.100.30 [test] www.benet.com:222 <!--通過222埠管理設備-->[mail] yj1.kgc.cn yj[2:5].kgc.cn<!--[2:5]表示2~5之間的所有數字,即表示yj2.kgc.cn、yj3.kgc.cn……的所有主機-->
可以將一個主機同時歸置在不同的組中,
配置完成之后,可以針對hosts定義的組進行遠程操作,也可以針對組中的某一個或多個主機操作,例如:
1)只對web組中192.168.1.2主機操作,通過--limit引數限定主機的變更,
[root@centos01 ~]# ansible web -m command -a "systemctl status httpd" --limit "192.168.100.20" 192.168.100.20 | SUCCESS | rc=0 >><!--看到SUCCESS就知道成功了,所以以下內容--><!--如果測驗httpd服務,被測驗主機必然已經安裝并啟動了httpd服務-->
2)只對192.168.100.20主機操作,通過IP限定主機的變更,
[root@centos01 ~]# ansible 192.168.100.20 -m command -a "systemctl status httpd"192.168.100.20 | SUCCESS | rc=0 >>
3)只對192.168.100.0網段主機操作,這就需要使用到通配符來限定主機的變更了,
[root@centos01 ~]# ansible 192.168.1.* -m command -a "systemctl status httpd" 192.168.100.20 | SUCCESS | rc=0 >> ....... <!--此處省略部分內容-->192.168.100.30 | SUCCESS | rc=0 >> ....... <!--此處省略部分內容--><!--實驗環境,效果一樣,這里就不多說了-->
3、Ansible命令
Ansible的維護命令大多數是以ansible開頭,在終端輸入ansible后連續按兩次Tab鍵,會補全所有跟ansible相關的命令,
[root@centos01 ~]# ansible <!--連續按Tab鍵-->ansible ansible-console-2 ansible-galaxy ansible-playbook-2.7 ansible-vault-2 ansible-2 ansible-console-2.7 ansible-galaxy-2 ansible-pull ansible-vault-2.7 ansible-2.7 ansible-doc ansible-galaxy-2.7 ansible-pull-2 ansible-connection ansible-doc-2 ansible-playbook ansible-pull-2.7 ansible-console ansible-doc-2.7 ansible-playbook-2 ansible-vault
1)ansible
ansible是生產環境中使用非常頻繁的命令之一,主要在以下場景使用:
非固化需求;
臨時一次性操作;
- 二次開發介面呼叫;
非固化需求是指臨時性的維護,如查看web服務器組磁盤使用情況、復制一個檔案到其他機器等,類似這些沒有規律的、臨時需要做的任務,我們成為非固化需求,臨時一次性操作,語法如下:
Ansible <host-pattern> [options]
可用選項如下:
-v(--verbose):輸出詳細的執行程序資訊,可以得到執行程序所有資訊;
-i PATH(--inventory=PATH):指定inventory資訊,默認為/etc/ansible/hosts;
-f NUM(--forks=NUM):并發執行緒數,默認為5個執行緒;
--private-key=PRIVATE_KEY_FILE:指定密鑰檔案;
-m NAME,--module-name=NAME:指定執行使用的模塊;
-M DIRECTORY(--module-path=DIRECTORY) :指定模塊存放路徑,默認為/usr/share/ansible;
-a ARGUMENTS(--args=ARGUMENTS):指定模塊引數;
-u USERNAME(--user=USERNAME):指定遠程主機以USERNAME運行命令;
- -l subset(--limit=SUBSET):限制運行主機;
①檢查所有主機是否存活,執行命令如下:
[root@centos01 ~]# ansible all -f 5 -m ping
<!--呼叫ping模塊,all表示/etc/ansible/hosts檔案中的所有主機,不用創建all分組(默認存在)-->192.168.100.20 | SUCCESS => { <!--表示執行成功-->
"changed": false, <!--沒有對主機做出更改-->
"ping": "pong" <!--表示執行ping命令的回傳結果-->}
192.168.100.30 | SUCCESS => {
"changed": false,
"ping": "pong"
}
②列出web組所有的主機串列,執行命令如下:
[root@centos01 ~]# ansible web --list <!-- --list:表示列出主機串列資訊-->
hosts (2):
192.168.100.20
192.168.100.30
③批量顯示web組中的磁盤使用空間,執行命令如下:
[root@centos01 ~]# ansible web -m command -a "df -hT"192.168.100.30 | SUCCESS | rc=0 >> 檔案系統 型別 容量 已用 可用 已用% 掛載點/dev/mapper/cl-root xfs 17G 4.4G 13G 26% /devtmpfs devtmpfs 897M 0 897M 0% /dev tmpfs tmpfs 912M 84K 912M 1% /dev/shm tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup /dev/sda1 xfs 1014M 173M 842M 18% /boot tmpfs tmpfs 183M 16K 183M 1% /run/user/42tmpfs tmpfs 183M 0 183M 0% /run/user/0192.168.100.20 | SUCCESS | rc=0 >> 檔案系統 型別 容量 已用 可用 已用% 掛載點/dev/mapper/cl-root xfs 17G 4.3G 13G 26% /devtmpfs devtmpfs 897M 0 897M 0% /dev tmpfs tmpfs 912M 84K 912M 1% /dev/shm tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup /dev/sda1 xfs 1014M 173M 842M 18% /boot tmpfs tmpfs 183M 16K 183M 1% /run/user/42tmpfs tmpfs 183M 0 183M 0% /run/user/0/dev/sr0 iso9660 4.1G 4.1G 0 100% /mnt
web關鍵字需要提前在/etc/ansible/hosts檔案中定義組,
Ansible的回傳結果非常友好,一般會用三種顏色來表示執行結果:
紅色:表示執行程序出現例外;
橘黃顏色:表示命令執行后目標有狀態變化;
- 綠色:表示執行成功且沒有目標機器做修改;
2)Ansible-doc
Ansible-doc用來查詢ansible模塊檔案的說明,類似于man命令,針對每個模塊都有詳細的用法說明及應用案例介紹,語法如下:
ansible-doc [options] [module……]
列出支持的模塊:
[root@centos01 ~]#ansible-doc -l
查詢ping模塊的說明資訊:
[root@centos01 ~]# ansible-doc ping> PING (/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py)
A trivial test module, this module always returns `pong' on successful contact. It
does not make sense in playbooks, but it is useful from `/usr/bin/ansible' to verify
the ability to login and that a usable python is configured. This is NOT ICMP ping,
this is just a trivial test module.
EXAMPLES:
# Test we can logon to 'webservers' and execute python with json lib.
ansible webservers -m ping
MAINTAINERS: Ansible Core Team, Michael DeHaan
METADATA:
Status: ['stableinterface']
Supported_by: core
3)Ansible-playbook
Ansible-playbook是日常應用中使用頻率最高的命令,類似于Linux中的sh或source命令,用來執行系列任務,其作業機制:通過讀取預先撰寫好的playbook檔案實作集中處理任務,Ansible-playbook命令后跟yml格式的playbook檔案,playbook檔案存放了要執行的任務代碼,命令使用方式如下:
Ansible-playbook playbook.yml<!--playbook.yml檔案要提前撰寫好,建議使用絕對路徑-->
4)Ansible-console
Ansible-console是Ansible為用戶提供的一款互動式工具,類似于Windows的cmd或者是Linux中shell,用戶可以在ansible-console虛擬出來的終端上像shell一樣使用Ansible內置的各種命令,這為習慣于使用shell互動式方式的用戶提供了良好的使用體驗,在終端輸入ansible-console命令后,顯示如下:
[root@centos01 ~]# ansible-console Welcome to the ansible console. Type help or ? to list commands. <!--輸入help或?獲取幫助-->root@all (2)[f:5]$ cd web <!--使用cd命令切換主機或分組-->root@web (2)[f:5]$ list <!--列出當前的設備-->192.168.100.20 192.168.100.30<!--支持Tab鍵補全,快捷鍵Ctrl+D或Ctrl+C即可退出當前的虛擬終端-->
4、Ansible模塊
1)command模塊
command模塊在遠程主機執行命令,不支持管道、重定向等shell的特性,常用的引數如下:
chdir:在遠程主機上運行命令前要提前進入的目錄;
creates:在命令運行時創建一個檔案,如果檔案已存在,則不會執行創建任務;
removes:在命令運行時移除一個檔案,如果檔案不存在,則不會執行移除任務;
- executeable:指明運行命令的shell程式;
在所有主機上運行“ls ./”命令,運行前切換到/home目錄下,操作如下:
[root@centos01 ~]# ansible web -m command -a "chdir=/ ls ./"
2)shell模塊
shell模塊在遠程主機執行命令,相當于呼叫遠程主機的Shell行程,然后在該Shell下打開一個子Shell運行命令,和command模塊的區別是它支持Shell特性:如管道、重定向等,
示例如下:
[root@centos01 ~]# ansible web -m shell -a "echo hello world " <!--輸出到螢屏-->192.168.100.20 | SUCCESS | rc=0 >> hello world 192.168.100.30 | SUCCESS | rc=0 >> hello world [root@centos01 ~]# ansible web -m shell -a "echo hello world > /1.txt" <!--輸出到1.txt檔案中-->192.168.100.20 | SUCCESS | rc=0 >> 192.168.100.30 | SUCCESS | rc=0 >>
3)copy模塊
copy模塊用于復制指定主機檔案到遠程主機的指定位置,常見的引數如下:
dest:指出復制檔案的目標目錄位置,使用絕對路徑,如果源是目錄,則目標也要是目錄,如果目標檔案已存在,會覆寫原有內容;
src:指出源檔案的路徑,可以使用相對路徑和絕對路徑,支持直接指定目錄,如果源是目錄,則目標也要是目錄;
mode:指出復制時,目標檔案的權限,可選;
owner:指出復制時,目標檔案的屬主,可選;
group:指出復制時目標檔案的屬組,可選;
- content:指出復制到目標主機上的內容,不能和src一起使用,相當于復制content指明的資料到目標檔案中;
示例如下:
[root@centos01 ~]# ansible web -m copy -a "src=https://www.cnblogs.com/etc/hosts dest=/root/a1.hosts mode=777 owner=root group=root"<!--/將本機的hosts檔案復制到web組中的所有主機上存放在家目錄下的a1.hosts目錄, 權限是777,屬主是root,屬組是root-->
4)hostname模塊
hostname模塊用于管理遠程主機上的主機名,常用的引數如下:
- name:指明主機名;
示例如下:
[root@centos01 ~]# ansible 192.168.100.20 -m hostname -a "name=test"<!--將192.168.100.20的主機名改為test, 但是192.168.100.20需要敲一下bash才生效-->
5)yum模塊
yum模塊基于yum機制,對遠程主機管理程式包,常用的引數如下:
name:程式包名稱,可以帶上版本號,若不指明版本,則默認為最新版本;
state=present|atest|absent:指明對程式包執行的操作:present表明安裝程式包,latest表示安裝最新版本的程式包,absent表示卸載程式包;
disablerepo:在用yum安裝時,臨時禁用某個倉庫的ID;
enablerepo:在用yum安裝時,臨時啟用某個倉庫的ID;
conf_file:yum運行時的組態檔,而不是使用默認的組態檔;
- disable_gpg_check=yes|no:是否啟用完整性校驗功能;
示例如下:
[root@centos01 ~]# ansible web -m shell -a "/usr/bin/rm -rf
/etc/yum.repos.d/CentOS-*"
<!--批量化洗掉web組主機的yum源-->[root@centos01 ~]# ansible web -m shell -a "/usr/bin/mount
/dev/cdrom /mnt" <!--批量化掛載光碟-->
[WARNING]: Consider using mount module rather than running mount
192.168.100.20 | SUCCESS | rc=0 >>
mount: /dev/sr0 寫保護,將以只讀方式掛載
192.168.100.30 | SUCCESS | rc=0 >>
mount: /dev/sr0 寫保護,將以只讀方式掛載
[root@centos01 ~]# ansible web -m yum -a "name=httpd
state=present" <!--批量化安裝httpd程式-->[root@centos01 ~]# ansible web -m shell -a "rpm -qa | grep httpd" <!--批量化查看安裝的httpd程式包-->
[WARNING]: Consider using yum, dnf or zypper module rather than running rpm
192.168.100.20 | SUCCESS | rc=0 >>
httpd-2.4.6-67.el7.centos.x86_64
httpd-tools-2.4.6-67.el7.centos.x86_64
192.168.100.30 | SUCCESS | rc=0 >>
httpd-2.4.6-67.el7.centos.x86_64
httpd-tools-2.4.6-67.el7.centos.x86_64
[root@centos01 ~]# ansible web -m shell -a "systemctl start httpd" <!--批量啟動服務-->[root@centos01 ~]# ansible web -m shell -a "netstat -anptu | grep httpd" <!--批量化監聽httpd服務是否啟動成功-->192.168.100.20 | SUCCESS | rc=0 >>
tcp6 0 0 :::80 :::* LISTEN 2072/httpd
192.168.100.30 | SUCCESS | rc=0 >>
tcp6 0 0 :::80 :::* LISTEN 3098/httpd
管理端只是發送yum指令到被管理端,被管理端要存在可用的yum倉庫才可以成功安裝,
6)service模塊
service模塊為用來管理遠程主機上的服務的模塊,常見的引數如下:
name:被管理的服務名稱;
state=started|stopped|restarted:動作包含啟動,關倍訓重啟;
enable=yes|no:表示是否設定該服務開機自啟動;
- runlevel:如果設定了enabled開機自啟動,則要定義在哪些運行目標下自動啟動;
示例如下:
[root@centos01 ~]# ansible web -m service -a "name=httpd enabled=yes state=restarted"<!--設定httpd服務重新啟動和開機自動啟動-->
7)user模塊
user模塊主要用于管理遠程主機上的用戶賬號,常見的引數如下:
name:必選引數,賬號名稱;
state=present|absent:創建賬號或者洗掉賬號,present表示創建,absent表示洗掉;
system=yes|no:是否為系統賬戶;
uid:用戶UID;
group:用戶的基本組;
groups:用戶的附加組;
shell:默認使用的shell;
home:用戶的家目錄;
mve_home=yes|no:如果設定的家目錄已經存在,是否將已存在的家目錄進行移動;
pssword:用戶的密碼,建議使用加密后的字串;
comment:用戶的注釋資訊;
- remore=yes|no:當state=absent時,是否要洗掉用戶的家目錄;
創建用戶示例如下:
[root@centos01 ~]# ansible web -m user -a "name=user01 system=yes uid=502 group=root groups=root shell=/etc/nologin home=/home/user01 password=pwd@123"<!--在web組的所有主機上新建一個系統用戶,UID為502, 屬組是root,名字是user01,密碼是pwd@123-->
四、playbook組態檔
1、執行組態檔
playbook組態檔使用YAML語法,具有簡潔明了、結構清晰等特點,playbook組態檔類似于shell腳本,是一個YAML格式的檔案,用于保存針對特定需求的任務串列,上面介紹的ansible命令雖然可以完成各種任務,但是當配置一些復雜任務時,逐條輸入就顯得效率非常低下,更有效的方案是在playbook組態檔中放置所有的任務代碼,利用ansible-playbook命令執行該檔案,可以實作自動化運維,YAML檔案的擴展名通常為.yaml或.yml,
YAML語法與其他高級語言類似,其結構通過縮進來展示,通過“-”來代表項;“:”用來分隔鍵和值;整個檔案以“---”開頭并以“...”結尾,如下所示:
[root@centos01 ~]# grep -v ^# /etc/ansible/hosts | grep -v ^$ <!--查看hosts中的分組資訊-->[web1]
192.168.100.20
[web2]
192.168.100.30
[root@centos01 ~]# vim /etc/ansible/a.yml
<!--創建a.yml檔案,寫入以下內容-->---
- hosts: web1 <!--針對web1組中的操作-->
remote_user: root <!--遠端執行用戶身份為root-->
tasks: <!--任務串列-->
- name: adduser <!--任務名稱-->
user: name=user1 state=present <!--執行user模塊,創建用戶-->
tags: <!--創建tag標簽-->
- aaa <!--tag標簽為aaa-->
- name: addgroup <!--任務名稱-->
group: name=root system=yes <!--執行group模塊,創建組-->
tags: <!--創建tag標簽-->
- bbb <!--tag標簽為bbb-->- hosts: web2 <!--針對web2組中的操作-->
remote_user: root <!--遠端執行用戶身份為root-->
tasks: <!--任務串列-->
- name: copy file to web <!--任務名稱-->
copy: src=https://www.cnblogs.com/etc/passwd dest=/home
tags:
- ccc ...
所有的“-”和“:”后面均有空格,而且注意縮進和對齊,如下圖所示:
playbook的核心元素包含:
hosts:任務的目標主機,多個主機用冒號分隔,一般呼叫/etc/ansible/hosts中的分組資訊;
remote_user:遠程主機上,運行此任務的默認身份為root;
tasks:任務,即定義的具體任務,由模塊定義的操作串列;
handlers:觸發器,類似tasks,只是在特定的條件下才會觸發的任務,某任務的狀態在運行后為changed時,可通過“notify”通知給相應的handlers進行觸發執行;
- roles:角色,將hosts剝離出去,由tasks、handlers等所組成的一種特定的結構集合;
playbook檔案定義的任務需要通過ansible-playbook命令進行呼叫并執行,ansible-playbook命令用法如下:
ansible-playbook [option] /PATH/TO/PLAYBOOK.yaml
其中,[option]部分的功能包括:
--syntax-check:檢測yaml檔案的語法;
-C(--check):預測驗,不會改變目標主機的任何設定;
--list-hosts:列出yaml檔案影響的主機串列;
--list-tasks:列出yaml檔案的任務串列;
--list-tags:列出yaml檔案中的標簽;
-t TAGS(--tags=TAGS):表示只執行指定標簽的任務;
- --skip-tags=SKIP_TAGS:表示除了指定標簽的任務,執行其他任務;
--start-at-task=START_AT:從指定的任務開始往下運行;
執行playbook的示例如下:
[root@centos01 ~]# ansible-playbook --syntax-check /etc/ansible/a.yml <!--語法檢測-->playbook: /etc/ansible/a.yml <!--表示沒有報錯-->[root@centos01 ~]# ansible-playbook -C /etc/ansible/a.yml <!--對a.yml進行預測驗-->
.................<!--省略部分內容-->192.168.100.20 : ok=3 changed=1 unreachable=0 failed=0
192.168.100.30 : ok=2 changed=1 unreachable=0 failed=0
<!--回傳結果表示沒有錯誤,全部可以執行成功,-->[root@centos01 ~]# ansible-playbook --list-hosts /etc/ansible/a.yml
<!--列出a.yml檔案中的主機-->[root@centos01 ~]# ansible-playbook --list-tasks /etc/ansible/a.yml
<!--列出任務-->[root@centos01 ~]# ansible-playbook --list-tags /etc/ansible/a.yml <!--列出標簽-->[root@centos01 ~]# ansible-playbook /etc/ansible/a.yml <!--執行任務-->[root@centos01 ~]# ssh 192.168.100.20 tail -1 /etc/passwd <!--確認執行結果-->user1:x:1001:1001::/home/user1:/bin/bash
[root@centos01 ~]# ssh 192.168.100.30 ls -ld /home/passwd
-rw-r--r--. 1 root root 2342 7月 23 16:06 /home/passwd<!--一般情況先執行“-C”命令進行預測驗,沒有問題后再執行.yml檔案,-->
通常情況下先執行ansible-playbook -C /PATH/TO/PLAYBOOK.yaml命令進行測驗,測驗沒問題后再執行ansible-playbook /PATH/TO/PLAYBOOK.yml命令,
2、觸發器
需要觸發才能執行的任務,當之前定義在tasks中的任務執行成功后,若希望在此基礎上觸發其他任務,這時就需要定義handlers,例如,當通過ansible的模塊對目標主機的組態檔進行修改之后,如果任務執行成功,可以觸發一個觸發器,在觸發器中定義目標主機的服務重啟操作,以使組態檔生效,handlers觸發器具有以下特點:
handlers是Ansible提供的條件機制之一,handlers和task很類似,但是它只在被task通知的時候才會觸發執行,
- handlers只會在所有任務執行完成后執行,而且即使被通知了很多次,它也只會執行一次,handlers按照定義的順序依次執行,
handlers觸發器的使用示例如下:
[root@centos01 ~]# ssh 192.168.100.20 netstat -anpt | grep 80 <!--查詢100.20主機監聽的埠-->tcp6 0 0 :::80 :::* LISTEN 94858/httpd
<!--可以看到是監聽80埠,現在通過腳本改為8080埠,并使其生效,-->[root@centos01 ~]# vim /etc/ansible/httpd.yml <!--編輯httpd.yml檔案,寫入以下內容-->---
- hosts: web1
remote_user: root
tasks:
- name: change port
command: sed -i 's/Listen\ 80/Listen\ 8080/g' /etc/httpd/conf/httpd.conf
notify: <!--配置觸發條件-->
- restart httpd server <!--完成該任務后呼叫名為“restart httpd server”的觸發器-->
handlers: <!--配置觸發器-->
- name: restart httpd server <!--指定觸發器名字,要和上面“notify”指定的觸發器名字一樣-->
service: name=httpd state=restarted<!--觸發任務為重啟httpd服務-->...<!--撰寫完成后,保存退出即可-->[root@centos01 ~]# ansible-playbook -C /etc/ansible/httpd.yml <!--進行預測驗-->[root@centos01 ~]# ansible-playbook /etc/ansible/httpd.yml <!--執行腳本-->[root@centos01 ~]# ssh 192.168.100.20 netstat -anpt | grep 8080 <!--遠端主機已經運行8080埠-->tcp6 0 0 :::8080 :::* LISTEN 103594/httpd
3、角色
將多種不同的tasks的檔案集中存盤在某個目錄下,則該目錄就是角色,角色一般存放在/etc/ansible/roles/目錄,可通過ansible的組態檔來調整默認的角色目錄,/etc/ansible/roles/目錄下有很多子目錄,其中每一個子目錄對應一個角色,每個角色也有自己的目錄結構,如下圖所示:
/etc/ansible/roles/為角色集合,該目錄下有自定義的各個子目錄:
mariadb:mysql角色;
Apache:httpd角色;
- Nginx:Nginx角色;
每個角色的定義,以特定的層級目錄結構進行組織,以mariadb(mysql角色)為例:
files:存放由copy或script等模塊呼叫的檔案;
templates:存放template模塊查找所需要的模板檔案的目錄,如mysql組態檔模板;
tasks:任務存放的目錄;
handlers:存放相關觸發執行的目錄;
vars:變數存放的目錄;
meta:用于存放此角色元資料;
- default:默認變數存放的目錄,檔案中定義了此角色使用的默認變數;
上述目錄中,tasks、handlers、vars、meta、default至少應該包含一個main.yml檔案,該目錄下也可以有其他.yml檔案,但是需要在main.yml檔案中用include指令將其他.yml檔案包含進來,
有了角色后,可以直接在yaml檔案(playbook組態檔)中呼叫角色,示例如下:
- hosts: web remote_user: root roles: - mysql <!--呼叫角色名--> - httpd <!--呼叫角色名-->
可以只呼叫一個角色,也可以呼叫多個角色,當定義了角色后,用ansible-playbook PALYBOOK檔案執行即可,此時ansible會到角色集合的目錄(/etc/ansible/roles)去找mysql和httpd目錄,然后依次運行mysql和httpd目錄下的所有代碼,
下面來個安裝及配置mariadb資料庫的實體
需求分析:
要求被管理主機上自動安裝mariadb,安裝完成后上傳提前準備好的組態檔至遠端主機,重啟服務,然后新建testdb資料庫,并允許test用戶對其擁有所有權限,
- 被管理主機配置yum倉庫,自行配置,若被管理端可以連接互聯網,那么直接將yum倉庫指向互聯網即可,
開始在ansible服務器上實施:
[root@centos01 /]# mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
mkdir: 已創建目錄 "/etc/ansible/roles/mariadb"
mkdir: 已創建目錄 "/etc/ansible/roles/mariadb/files"
mkdir: 已創建目錄 "/etc/ansible/roles/mariadb/tasks"
mkdir: 已創建目錄 "/etc/ansible/roles/mariadb/handlers"
[root@ansible /]# cd /etc/ansible/roles/mariadb/tasks/ <!--切換至指定目錄-->[root@centos01 tasks]# ls
[root@centos01 tasks]# vim main.yml <!--撰寫main.yml檔案-->---
- name: install mariadb
yum: name=mariadb-server state=present
- name: move config file
shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
- name: provide a new config file
copy: src=https://www.cnblogs.com/createwell/p/my.cnf dest=/etc/my.cnf
- name: reload mariadb
shell: systemctl restart mariadb
- name: create database testdb
shell: mysql -u root -e"create database testdb;grant all on testdb.* to 'test'@'192.168.100.%' identified by 'test123';flush privileges;"
notify:
- restart mariadb
...<!--撰寫完畢,保存退出即可-->[root@centos01 tasks]# cd ../handlers/ <!--切換至觸發器目錄-->[root@centos01 handlers]# vim main.yml <!--撰寫main.yml檔案,寫入以下內容-->---
- name: restart mariadb
service: name=mariadb state=restarted
...<!--撰寫完畢,保存退出即可-->[root@centos01 handlers]# cd ../files <!--進入mariadb角色檔案夾的files-->[root@centos01 files]# pwd
/etc/ansible/roles/mariadb/files
[root@centos01 files]# ls <!--準備好配置好的mysql資料庫組態檔,需要分發到遠程主機的-->my.cnf
[root@centos01 files]# cd /etc/ansible/
[root@centos01 ansible]# vim mariadb.yml <!--撰寫.yml檔案-->---
- hosts: web
remote_user: root
roles:
- mariadb
...<!--撰寫完畢,保存退出即可-->[root@centos01 ansible]# ansible-playbook -C mariadb.yml <!--進行預檢測-->
........................ <!--省略部分內容-->PLAY RECAP ***************************************************************************
192.168.100.20 : ok=3 changed=1 unreachable=0 failed=0
<!--回傳結果表示沒問題-->[root@centos01 ansible]# ansible-playbook mariadb.yml <!--執行安裝-->
待安裝完成后,在遠端主機上自行測驗,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/96460.html
標籤:其他
上一篇:好用的黑白配色法
