第2天-自動(dòng)化運(yùn)維利器Ansible基礎(chǔ)
一 、Ansible 介紹及安裝
1. 介紹
Ansible 是一個(gè) IT 自動(dòng)化工具。它能配置系統(tǒng)堰乔、部署軟件伴找、編排更復(fù)雜的 IT 任務(wù)渗饮,如連續(xù)部署或零停機(jī)時(shí)間滾動(dòng)更新姻政。
Ansible 用 Python 編寫呆抑,盡管市面上已經(jīng)有很多可供選擇的配置管理解決方案(例如 Salt岂嗓、Puppet汁展、Chef等),但它們各有優(yōu)劣,而Ansible的特點(diǎn)在于它的簡潔厌殉。讓 Ansible 在主流的配置管理系統(tǒng)中與眾不同的一點(diǎn)便是食绿,它并不需要你在想要配置的每個(gè)節(jié)點(diǎn)上安裝自己的組件。同時(shí)提供的另一個(gè)優(yōu)點(diǎn)公罕,如果需要的話器紧,你可以在不止一個(gè)地方控制你的整個(gè)基礎(chǔ)架構(gòu)。
2. 工作原理
1楼眷、在ANSIBLE 管理體系中铲汪,存在"管理節(jié)點(diǎn)" 和 "被管理節(jié)點(diǎn)" 兩種角色。
2罐柳、被管理節(jié)點(diǎn)通常被稱為"資產(chǎn)"
3掌腰、在管理節(jié)點(diǎn)上,Ansible將 AdHoc 或 PlayBook 轉(zhuǎn)換為Python腳本张吉。
并通過SSH將這些Python 腳本傳遞到被管理服務(wù)器上齿梁。
在被管理服務(wù)器上依次執(zhí)行,并實(shí)時(shí)的將結(jié)果返回給管理節(jié)點(diǎn)肮蛹。
3. 如何安裝
3.1 先決條件
管理節(jié)點(diǎn)
確保存在OpenSSH
確保Python 版本 >= 2.6
確保安裝ansible
被管理節(jié)點(diǎn)
確保存在OpenSSH
確保Python 版本 >= 2.4 //若為2.4 版本勺择,確保安裝了python-samplesjson 擴(kuò)展
不需要安裝ansible
3.2 安裝Ansible
- yum 方式
[root@qfedu.com ~]# yum install epel-release
[root@qfedu.com ~]# yum install ansible
-
pip 方式
這里是使用系統(tǒng)自帶的 python2 的環(huán)境
如果系統(tǒng)中安裝的 pip ,可以直接使用 pip 安裝 ansible
[root@qfedu.com ~]# yum install epel-release
[root@qfedu.com ~]# yum install python2-pip
[root@qfedu.com ~]# pip install ansible
-
查看版本
[root@qfedu.com ~]# ansible --version ansible 2.9.6 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.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Aug 7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
二伦忠、 管理節(jié)點(diǎn)與被管理節(jié)點(diǎn)建立SSH 信任關(guān)系
管理節(jié)點(diǎn)(ansible)中創(chuàng)建密鑰對
[root@qfedu.com ~]# ssh-keygen -t rsa
將本地的公鑰傳輸?shù)奖还芾砉?jié)點(diǎn)
每個(gè)被管理節(jié)點(diǎn)都需要傳遞
過程中需要被管理節(jié)點(diǎn)(這里是 172.18.0.3)的用戶名(這里是 root)及密碼
[root@qfedu.com ~]# ssh-copy-id root@172.18.0.3
三省核、 快速入門
1. 場景假設(shè)
管理節(jié)點(diǎn):
172.18.0.2 主機(jī)名 qfedu.com
被管理節(jié)點(diǎn)(資產(chǎn)):
172.18.0.3
172.17.0.4
且管理節(jié)點(diǎn) 和 被管理節(jié)點(diǎn)之間的節(jié)點(diǎn)已經(jīng)打通 SSH 信任關(guān)系。
2. 場景一
在管理節(jié)點(diǎn)上昆码,測試與所有被管理節(jié)點(diǎn)的網(wǎng)絡(luò)連通性气忠。
# ansible all -i 172.18.0.3,172.18.0.4 -m ping
172.18.0.4 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
172.18.0.3 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
注意
-i
參數(shù)后面接的是一個(gè)列表(List)邓深。因此當(dāng)為一個(gè)被管理節(jié)點(diǎn)時(shí),我們后面一定要加一個(gè)英文逗號(,)笔刹,告知是List# ansible all -i 172.18.0.3, -m ping
3. 場景二
在管理節(jié)點(diǎn)上,確保文件
/tmp/a.conf
發(fā)布到所有被管理節(jié)點(diǎn)
# touch /tmp/a.conf
# ansible all -i 172.18.0.3,172.18.0.4 -m copy -a "src=/tmp/a.conf dest=/tmp/a.conf"
選項(xiàng)參數(shù)解釋
- all 在 ansible 中舌菜, 將其叫做pattern , 即匹配萌壳。我通常稱它為資產(chǎn)選擇器。就是匹配資產(chǎn)(-i 參數(shù)指定) 中的一部分日月。這里的 all 是匹配所有指定的所有資產(chǎn)袱瓮。將在下面資產(chǎn)部分詳細(xì)闡述。
-
-i
指定Ansible 的資產(chǎn)爱咬,也就是被管理服務(wù)器尺借。 -
-m
指定要運(yùn)行的模塊,比如這里的 ping 模塊和 copy 模塊 -
-a
指定模塊的參數(shù), 這里模塊 ping 沒有指定參數(shù)。 模塊 copy 指定了 src 和 dest 參數(shù)精拟。
總結(jié)一句話
ansible 就是用什么模塊燎斩,讓誰去干什么事情。
四蜂绎、 Ansible 資產(chǎn)
在快速入門的場景中栅表,我們一共管理了兩臺(tái)服務(wù)器。但是在實(shí)際場景中师枣,我們要管理的服務(wù)器往往要多得多怪瓶。難道依然要在Ansible 的 -i 參數(shù)后面一個(gè)個(gè)追加IP指定嗎? 這顯然不合乎常理。
因此這一節(jié)我們主要去介紹一下Ansible的資產(chǎn)践美。
Ansible 的資產(chǎn)分為靜態(tài)資產(chǎn)和動(dòng)態(tài)資產(chǎn)洗贰,動(dòng)態(tài)資產(chǎn)會(huì)在后面的高級部分詳細(xì)闡釋。
下面僅介紹靜態(tài)資產(chǎn)
1. 靜態(tài)資產(chǎn)
顧名思義它本身是一個(gè)文本文件陨倡,一個(gè)格式類似INI的文件敛滋。
默認(rèn)情況下,Ansible的資產(chǎn)文件位于 /ect/ansible/hosts
玫膀。pip 安裝的可能沒有這個(gè)文件矛缨,創(chuàng)建一個(gè)即可。
1.1 自定義資產(chǎn)
這個(gè)文件可以自定義帖旨,之后使用相應(yīng)的參數(shù)指定箕昭。
下面給出一個(gè)自定義的靜態(tài)資產(chǎn)實(shí)例,然后再具體解釋其含義解阅。
# cat inventory.ini
1.1.1.1
2.2.2.2
3.3.3.[1:15]
test01.qfedu.com
test03.qfedu.com
test[05:09].qfedu.com
[web_servers]
192.168.1.2
192.168.1.3
192.168.1.5
[dbdb_servers]
192.168.2.2
192.168.2.3
192.168.1.5
[alldb_servers]
[alldb_servers:children]
dbdb_servers
web_servers
Ansible 的資產(chǎn)文件中落竹,可以以IP地址的形式或者主機(jī)名的形式存在。
Ansible 的資產(chǎn)若連續(xù)货抄,可以使用[stat:end] 的形式去表達(dá)述召。
可以將服務(wù)器按照業(yè)務(wù)場景定義成組朱转,比如
dbdb_servers
和web_servers
組和組之間可以存在繼承關(guān)系,比如
dbdb_servers
和web_servers
同時(shí)繼承alldb_servers
組
1.2 如何使用自定義資產(chǎn)
通過 -i
參數(shù)指定自定義資產(chǎn)的位置即可(可以是全路徑积暖,也可以是相對路徑)藤为。
# ansible all -i inventory.ini ... // 偽指令,不可執(zhí)行
1.3 如何驗(yàn)證自定義資產(chǎn)
假如我們剛剛定義的資產(chǎn)為 inventory.ini
-
列舉出所有資產(chǎn)
# ansible all -i inventory.ini --list-hosts hosts (29): 1.1.1.1 2.2.2.2 3.3.3.1 ...略...
-
列舉出選定資產(chǎn)
比如這里列舉出
web_servers
# ansible web_servers -i inventory.ini --list-hosts hosts (3): 192.168.2.2 192.168.2.3 192.168.1.5
注意這里使用的了資產(chǎn)選擇器(pattern)夺刑,不要慌缅疟,將會(huì)在下面對他進(jìn)行詳細(xì)的闡述
2. 資產(chǎn)選擇器
有時(shí)操作者希望只對資產(chǎn)中的一部分服務(wù)器進(jìn)行操作,而不是資產(chǎn)中所有服務(wù)器遍愿。此時(shí)可以使用 Ansible 的資產(chǎn)選擇器 PATTERN存淫。
下面學(xué)習(xí)如何通過資產(chǎn)選擇器,更靈活的選擇想要操作的服務(wù)器沼填。
2.1 基本語法格式
ansible PATTERN -i inventory -m module -a argument
選擇一臺(tái)或者幾臺(tái)服務(wù)器
# ansible 1.1.1.1 -i inventory.ini --list-hosts
hosts (1):
1.1.1.1
# ansible test01.qfedu.com -i inventory.ini --list-hosts
hosts (1):
test01.qfedu.com
# ansible 1.1.1.1,2.2.2.2 -i inventory.ini --list-hosts
hosts (2):
1.1.1.1
2.2.2.2
選擇一組服務(wù)器
# ansible web_servers -i inventory.ini --list-hosts
hosts (3):
192.168.1.2
192.168.1.3
192.168.1.5
使用 * 匹配
# ansible 3.3.3.1* -i inventory.ini --list-hosts
hosts (7):
3.3.3.13
3.3.3.10
3.3.3.11
3.3.3.12
3.3.3.14
3.3.3.15
3.3.3.1
使用邏輯匹配
-
web_servers 和 dbdb_servers 的并集
兩個(gè)組內(nèi)的所有主機(jī)
# ansible 'web_servers:db_servers' -i inventory.ini --list-hosts hosts (5): 192.168.1.2 192.168.1.3 192.168.1.5 192.168.2.2 192.168.2.3
-
web_servers 和 dbdb_servers 的交集
兩個(gè)組共有的主機(jī)
# ansible 'web_servers:&db_servers' -i inventory.ini --list-hosts hosts (1): 192.168.1.5
-
排除
在 web_servers 中桅咆,但是不在 db_servers 中
# ansible 'web_servers:!db_servers' -i inventory.ini --list-hosts hosts (2): 192.168.1.2 192.168.1.3
五、Ansible Ad-Hoc 命令
Ad-hoc 命令是什么呢坞笙? 這其實(shí)是一個(gè)概念性的名字,是相對于寫 Ansible playbook 來說的.類似于在命令行敲入shell命令和 寫shell scripts兩者之間的關(guān)系岩饼。可以用于執(zhí)行一些臨時(shí)命令羞海。
如果我們敲入一些命令去比較快的完成一些事情,而不需要將這些執(zhí)行的命令特別保存下來, 這樣的命令就叫做 ad-hoc 命令忌愚。
Ansible提供兩種方式去完成任務(wù),一是 ad-hoc 命令,一是寫 Ansible playbook(這部分在高級課程中會(huì)詳細(xì)闡釋)。
前者可以解決一些簡單的任務(wù), 后者解決較復(fù)雜的任務(wù)却邓,比如做配置管理或部署。
1. 命令格式
在快速入門中執(zhí)行的 Ansible 命令院水,類似于批量執(zhí)行命令腊徙。
在Ansible 中統(tǒng)稱為Ansible Ad-Hoc
。
命令語法格式如下:
ansible pattern [-i inventory] -m module -a argument
-
pattern
資產(chǎn)選擇器 -
-i
指定資產(chǎn)清單文件的位置 -
-m
指定本次Ansible ad-hoc 要執(zhí)行的模塊檬某∏颂冢可以類別成SHELL 中的命令。 -
-a
模塊的參數(shù). 可以類比成SHELL 中的命令參數(shù)
快速入門中的實(shí)例
# ansible all -i 172.18.0.3,172.18.0.4 -m copy -a "src=/tmp/a.conf dest=/tmp/a.conf"
2. 模塊類型
Ansible 模塊分三種類型: 核心模塊(core module)恢恼、附加模塊(extra module)及用戶自定義模塊(consume module)民傻。
核心模塊是由Ansible 的官方團(tuán)隊(duì)提供的。
附加模塊是由各個(gè)社區(qū)提供的场斑。例如: OPENSTACK 社區(qū)漓踢、DOCKER 社區(qū)等等。
當(dāng)核心模塊和附加模塊都無法滿足你的需求時(shí)漏隐,用戶可以自定義模塊喧半。
默認(rèn)情況下,在安裝Ansible 的時(shí)候青责, 核心模塊和附加模塊都已經(jīng)安裝而無需用戶干預(yù)挺据。
3. 聯(lián)機(jī)幫助
Ansible 的核心模塊和附加模塊取具,數(shù)量有3000+ 。這樣龐大的模塊數(shù)量扁耐,對于任何一個(gè)接觸Ansible 的人都不可能將其完全記住暇检、掌握使用。 因此能夠順利使用Ansible 的幫助文檔婉称,對我們來說是很有必要的占哟。Ansible 的幫助文檔,由它本身提供的命令 ansible-doc 實(shí)現(xiàn)酿矢。
常用幫助參數(shù)
-
列舉出所有的核心模塊和附加模塊
# ansible-doc -l
-
查詢某個(gè)模塊的使用方法
# ansible-doc modulename
-
查詢某個(gè)模塊的使用方法榨乎,比較簡潔的信息
# ansible-doc -s modulename
Example
# ansible-doc yum
# ansible-doc -s yum
4. 常用模塊
為了便于演示和操作,現(xiàn)在把之前的測試主機(jī) IP 172.18.0.3
和 172.18.0.4
保存到 當(dāng)前目錄下的 hosts
文件中瘫筐。
[root@qfedu.com ~]# cat hosts
[dbservers]
172.18.0.3
[webservers]
172.18.0.4
4. 1 command & shell 模塊
兩個(gè)模塊都是在遠(yuǎn)程服務(wù)器上去執(zhí)行命令蜜暑。
但command模塊是ad-hoc的默認(rèn)模塊,在執(zhí)行ad-hoc時(shí),若不指定模塊的名字則默認(rèn)使用此模塊。
# ansible all -i hosts -a "echo 'hello'"
172.18.0.4 | CHANGED | rc=0 >>
hello
172.18.0.3 | CHANGED | rc=0 >>
hello
# ansible all -i hosts -m shell -a "echo 'hello'"
172.18.0.4 | CHANGED | rc=0 >>
hello
172.18.0.3 | CHANGED | rc=0 >>
hello
兩個(gè)模塊的差異
- shell 模塊可以執(zhí)行SHELL 的內(nèi)置命令和 特性(比如管道符)策肝。
- command 模塊無法執(zhí)行SHELL 的內(nèi)置命令和特性
Example
# ansible all -i hosts -m shell -a "echo 'hello'|grep -o 'e'"
172.18.0.3 | CHANGED | rc=0 >>
e
172.18.0.4 | CHANGED | rc=0 >>
e
# ansible all -i hosts -a "echo 'hello'|grep -o 'e'"
172.18.0.4 | CHANGED | rc=0 >>
hello|grep -o e
172.18.0.3 | CHANGED | rc=0 >>
hello|grep -o e
4.2 script 模塊
將管理節(jié)點(diǎn)上的腳本傳遞到被管理節(jié)點(diǎn)(遠(yuǎn)程服務(wù)器)上進(jìn)行執(zhí)行肛捍。
Example
管理節(jié)點(diǎn)上的一個(gè)腳本
# cat /root/a.sh
touch /tmp/testfile
執(zhí)行
[root@qfedu.com ~]# ansible webservers -i hosts -m script -a "/root/a.sh"
172.18.0.4 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 172.18.0.4 closed.\r\n",
"stderr_lines": [
"Shared connection to 172.18.0.4 closed."
],
"stdout": "",
"stdout_lines": []
}
驗(yàn)證
[root@qfedu.com ~]# ansible webservers -i hosts -m shell -a "ls -l /tmp/testfile"
172.18.0.4 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 0 Apr 12 07:17 /tmp/testfile
4.3 copy 模塊
copy 模塊的主要用于管理節(jié)點(diǎn)和被管理節(jié)點(diǎn)之間的文件拷貝。
常用參數(shù):
- src 要復(fù)制到遠(yuǎn)程服務(wù)器的文件的本地路徑之众。
這可以是絕對的拙毫,也可以是相對的。
如果路徑是一個(gè)目錄棺禾,則遞歸地復(fù)制它缀蹄。
在這種情況下,如果路徑以“/”結(jié)尾膘婶,則只有該目錄的內(nèi)部內(nèi)容被復(fù)制到目標(biāo)缺前。
否則,如果不以“/”結(jié)尾悬襟,則復(fù)制包含所有內(nèi)容的目錄本身衅码。
此行為類似于rsync命令行工具。 - dest 指定拷貝文件的目標(biāo)地址
- backup 拷貝文件前脊岳,若原目標(biāo)文件發(fā)生了變化逝段,則對目標(biāo)文件進(jìn)行備份
- woner 指定新拷貝文件的所有者
- group 指定新拷貝文件的所有組
- mode 指定新拷貝文件的權(quán)限
Example
- copy 管理節(jié)點(diǎn)上的
nginx.repo
到被管理節(jié)點(diǎn)上
# cat nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
# ansible webservers -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo"
- copy 前, 在被管理節(jié)點(diǎn)上對原文件進(jìn)行備份
# ansible all -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo backup=yes"
- copy 文件的同時(shí)對文件進(jìn)行用戶及用戶組設(shè)置
# ansible all -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo owner=nobody group=nobody"
- copy 文件的同時(shí)對文件進(jìn)行權(quán)限設(shè)置
# ansible all -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo mode=0755"
4.4 yum_repsitory
添加 YUM 倉庫
常用參數(shù)
name
倉庫名稱割捅,就是倉庫文件中第一行的中括號中名稱奶躯,必須的參數(shù)。description
倉庫描述信息棺牧,添加時(shí)必須的參數(shù)-
baseurl
yum存儲(chǔ)庫 “repodata” 目錄所在目錄的URL巫糙,添加時(shí)必須的參數(shù)。它也可以是多個(gè)URL的列表颊乘。
file
倉庫文件保存到被管理節(jié)點(diǎn)的文件名参淹,不包含.repo
醉锄。 默認(rèn)是name
的值搁骑。state
present 確認(rèn)添加倉庫文件锨阿, absent 確認(rèn)刪除倉庫文件。gpgcheck
是否檢查 GPG yes|no鳄炉, 沒有默認(rèn)值开呐,使用/etc/yum.conf
中的配置烟勋。
Example
添加 epel 源
[root@qfedu.com ~]# ansible dbservers -i hosts -m yum_repository -a "name=epel baseurl='https://download.fedoraproject.org/pub/epel/$releasever/$basearch/' description='EPEL YUM repo'"
172.18.0.3 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"repo": "epel",
"state": "present"
}
刪除 epel 源
[root@qfedu.com ~]# ansible dbservers -i hosts -m yum_repository -a "name=epel state=absent"
172.18.0.3 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"repo": "epel",
"state": "absent"
}
4.5 yum 模塊
等同于 Linux 上的YUM 命令, 對遠(yuǎn)程服務(wù)器上RPM包進(jìn)行管理筐付。
常用參數(shù):
- name 要安裝的軟件包名卵惦, 多個(gè)軟件包以英文逗號(,) 隔開
- state 對當(dāng)前指定的軟件安裝、移除操作(present installed latest absent removed)
支持的參數(shù)
- present 確認(rèn)已經(jīng)安裝瓦戚,但不升級
- installed 確認(rèn)已經(jīng)安裝
- latest 確保安裝沮尿,且升級為最新
- absent 和 removed 確認(rèn)已移除
Example
-
安裝一個(gè)軟件包
# ansible webservers -i hosts -m yum -a "name=nginx state=present" # ansible webservers -i hosts -m yum -a "name=nginx state=latest" # ansible webservers -i hosts -m yum -a "name=nginx state=installed"
-
移除一個(gè)軟件包
# ansible webservers -i hosts -m yum -a "name=nginx state=absent" # ansible webservers -i hosts -m yum -a "name=nginx state=removed"
-
安裝一個(gè)軟件包組
# ansible webservers -i hosts -m yum -a "name='@Development tools' state=present"
4.5 systemd 模塊
Centos6 之前的版本使用
service
模塊。請使用
ansible-doc service
命令自行查看幫助信息较解。
管理遠(yuǎn)程節(jié)點(diǎn)上的 systemd 服務(wù)畜疾,就是由 systemd 所管理的服務(wù)。
常用參數(shù):
- daemon_reload 重新載入 systemd印衔,掃描新的或有變動(dòng)的單元
- enabled 是否開機(jī)自啟動(dòng) yes|no
- name 必選項(xiàng)啡捶,服務(wù)名稱 ,比如 httpd vsftpd
- state 對當(dāng)前服務(wù)執(zhí)行啟動(dòng)奸焙,停止瞎暑、重啟、重新加載等操作(started,stopped,restarted,reloaded)
Example
- 重新加載 systemd
# ansible webservers -i hosts -m systemd -a "daemon_reload=yes"
- 啟動(dòng) Nginx 服務(wù)
# ansible webservers -i hosts -m systemd -a "name=nginx state=started"
- 關(guān)閉 Nginx 服務(wù)
# ansible webservers -i hosts -m systemd -a "name=nginx state=stopped"
- 重啟 Nginx 服務(wù)
# ansible webservers -i hosts -m systemd -a "name=nginx state=restarted"
- 重新加載 Nginx 服務(wù)
# ansible webservers -i hosts -m systemd -a "name=nginx state=reloaded"
- 將 Nginx 服務(wù)設(shè)置開機(jī)自啟動(dòng)
# ansible webservers -i hosts -m systemd -a "name=nginx enabled=yes"
4.6 group 模塊
在被管理節(jié)點(diǎn)上忿偷,對組進(jìn)行管理金顿。
常用參數(shù):
- name 組名稱, 必須的
- system 是否為系統(tǒng)組, yes/no 鲤桥, 默認(rèn)是 no
- state 刪除或這創(chuàng)建,present/absent 渠概,默認(rèn)是present
Example
- 創(chuàng)建普通組 db_admin
# ansible dbservers -i hosts -m group -a "name=db_admin"
4.7 user 模塊
用于在被管理節(jié)點(diǎn)上對用戶進(jìn)行管理茶凳。
常用參數(shù):
name 必須的參數(shù), 指定用戶名
password 設(shè)置用戶的密碼播揪,這里接受的是一個(gè)加密的值贮喧,因?yàn)闀?huì)直接存到 shadow, 默認(rèn)不設(shè)置密碼
update_password 假如設(shè)置的密碼不同于原密碼,則會(huì)更新密碼. 在 1.3 中被加入
home 指定用戶的家目錄
shell 設(shè)置用戶的 shell
comment 用戶的描述信息
create_home 在創(chuàng)建用戶時(shí)猪狈,是否創(chuàng)建其家目錄箱沦。默認(rèn)創(chuàng)建,假如不創(chuàng)建雇庙,設(shè)置為 no谓形。2.5版本之前使用 createhome
group 設(shè)置用戶的主組
-
groups 將用戶加入到多個(gè)其他組中灶伊,多個(gè)用逗號隔開。
默認(rèn)會(huì)把用戶從其他已經(jīng)加入的組中刪除寒跳。
-
append yes|no 和 groups 配合使用聘萨,yes 時(shí),
不會(huì)把用戶從其他已經(jīng)加入的組中刪除
system 設(shè)置為 yes 時(shí)童太,將會(huì)創(chuàng)建一個(gè)系統(tǒng)賬號
expires 設(shè)置用戶的過期時(shí)間米辐,值為時(shí)間戳,會(huì)轉(zhuǎn)為為天數(shù)后,放在 shadow 的第 8 個(gè)字段里
generate_ssh_key 設(shè)置為 yes 將會(huì)為用戶生成密鑰书释,這不會(huì)覆蓋原來的密鑰
ssh_key_type 指定用戶的密鑰類型翘贮, 默認(rèn) rsa, 具體的類型取決于被管理節(jié)點(diǎn)
-
state 刪除或添加用戶, present 為添加,absent 為刪除爆惧;
默認(rèn)值 present
-
remove 當(dāng)與 state=absent 一起使用狸页,刪除一個(gè)用戶及關(guān)聯(lián)的目錄,
比如家目錄检激,郵箱目錄肴捉。可選的值為: yes/no
Example
-
創(chuàng)建用戶并設(shè)置密碼
先生成加密密碼
[root@qfedu.com ~]# pass=$(echo "123456" | openssl passwd -1 -stdin)
執(zhí)行 ansible 命令 創(chuàng)建用戶 foo 并設(shè)置密碼
# ansible all -i hosts -m user -a "name=foo password=${pass}"
-
創(chuàng)建用戶 yangge, 并且為其創(chuàng)建密鑰對叔收,并且密鑰類型為: ecdsa
# ansible all -i hosts -m user -a "name=yangge generate_ssh_key=yes ssh_key_type=ecdsa"
-
創(chuàng)建用 tom, 并且設(shè)置其有效期到 2020年4月15日, 加入到組 db_admin 中, 不改變用戶原有假如的組齿穗。
# ansible dbservers -i hosts -m user -a "name=tom expires=$(date +%s -d 20200415) gorups=db_admin append=yes"
date 命令說明
// 計(jì)算 3 小時(shí)之后是幾點(diǎn)幾分
# date +%T -d '3 hours'
// 任意日期的前 N 天,后 N 天的具體日期
# date +%F -d "20190910 1 day"
# date +%F -d "20190910 -1 day"
// 計(jì)算兩個(gè)日期相差天數(shù), 比如計(jì)算生日距離現(xiàn)在還有多少天
# d1=$(date +%s -d 20180728)
# d2=$(date +%s -d 20180726)
# echo $(((d1-d2)/86400))
4. 8 file 模塊
file 模塊主要用于遠(yuǎn)程主機(jī)上的文件操作饺律。
常用參數(shù):
owner 定義文件/目錄的屬主
group 定義文件/目錄的屬組
mode 定義文件/目錄的權(quán)限
path 必選項(xiàng)窃页,定義文件/目錄的路徑
recurse 遞歸的設(shè)置文件的屬性,只對目錄有效
src 鏈接(軟/硬)文件的源文件路徑复濒,只應(yīng)用于state=link的情況
dest 鏈接文件的路徑脖卖,只應(yīng)用于state=link的情況
-
state
directory 如果目錄不存在,創(chuàng)建目錄
-
file 文件不存在巧颈,則不會(huì)被創(chuàng)建畦木,存在則返回文件的信息,
常用于檢查文件是否存在砸泛。
link 創(chuàng)建軟鏈接
hard 創(chuàng)建硬鏈接
-
touch 如果文件不存在十籍,則會(huì)創(chuàng)建一個(gè)新的文件,如果文件或目錄
已存在唇礁,則更新其最后修改時(shí)間
absent 刪除目錄勾栗、文件或者取消鏈接文件
Example
// 創(chuàng)建一個(gè)文件
# ansible all -i hosts -m file -a "path=/tmp/foo.conf state=touch"
// 改變文件所有者及權(quán)限
# ansible all -i hosts -m file -a "path=/tmp/foo.conf owner=nobody group=nobody mode=0644"
// 創(chuàng)建一個(gè)軟連接
# ansible all -i hosts -m file -a "src=/tmp/foo.conf dest=/tmp/link.conf state=link"
// 創(chuàng)建一個(gè)目錄
# ansible all -i hosts -m file -a "path=/tmp/testdir state=directory"
// 取消一個(gè)連接
# ansible all -i hosts -m file -a "path=/tmp/link.conf state=absent"
// 刪除一個(gè)文件
# ansible all -i hosts -m file -a "path=/tmp/foo.conf state=absent"
4.9 cron 模塊
管理遠(yuǎn)程節(jié)點(diǎn)的CRON 服務(wù)。等同于Linux 中的 計(jì)劃任務(wù)盏筐。
注意:使用 Ansible 創(chuàng)建的計(jì)劃任務(wù)围俘,是不能使用本地
crontab -e
去編輯,否則 Ansible 無法再次操作此計(jì)劃任務(wù)了。
常用參數(shù):
- name 指定一個(gè)cron job 的名字界牡。一定要指定簿寂,便于日之后刪除。
- minute 指定分鐘欢揖,可以設(shè)置成(0-59, *, */2 等)格式陶耍。 默認(rèn)是 * , 也就是每分鐘。
- hour 指定小時(shí)她混,可以設(shè)置成(0-23, *, */2 等)格式烈钞。 默認(rèn)是 * , 也就是每小時(shí)。
- day 指定天坤按, 可以設(shè)置成(1-31, *, */2 等)格式毯欣。 默認(rèn)是 * , 也就是每天。
- month 指定月份臭脓, 可以設(shè)置成(1-12, *, */2 等)格式酗钞。 默認(rèn)是 * , 也就是每周。
- weekday 指定星期来累, 可以設(shè)置成(0-6 for Sunday-Saturday, * 等)格式砚作。默認(rèn)是 *,也就是每星期嘹锁。
- job 指定要執(zhí)行的內(nèi)容葫录,通常可以寫個(gè)腳本领猾,或者一段內(nèi)容米同。
- state 指定這個(gè)job的狀態(tài),可以是新增(present)或者是刪除(absent)摔竿。 默認(rèn)為新增(present)
Example
// 新建一個(gè) CRON JOB 任務(wù)
# ansible all -i hosts -m cron -a "name='create new job' minute='0' job='ls -alh > /dev/null'"
// 刪除一個(gè) CRON JOB 任務(wù)面粮,刪除時(shí),一定要正確指定job 的name參數(shù)继低,以免誤刪除熬苍。
# ansible all -i hosts -m cron -a "name='create new job' state=absent"
登錄任何一臺(tái)管理機(jī)驗(yàn)證cron
# crontab -l
#Ansible: create new job
0 * * * * ls -alh > /dev/null
4.10 debug模塊
debug 模塊主要用于調(diào)試時(shí)使用,通常的作用是將一個(gè)變量的值給打印出來袁翁。
常用參數(shù):
- var 直接打印一個(gè)指定的變量值
- msg 打印一段可以格式化的字符串
Example
- 這里引入了變量冷溃,我們只需了解 debug 模板的使用即可。在學(xué)習(xí)變量梦裂、劇本時(shí),我們會(huì)對它有更深刻的理解盖淡。
# ansible all -i hosts -m debug -a "var=role" -e "role=web"
# ansible all -i hosts -m debug -a "msg='role is {{role}} '" -e "role=web"
4.11 template 模塊
template 模塊使用了Jinjia2格式作為文件模版年柠,可以進(jìn)行文檔內(nèi)變量的替換。文件以 .j2 結(jié)尾。
常用參數(shù):
- src 指定 Ansible 控制端的 文件路徑
- dest 指定 Ansible 被控端的 文件路徑
- owner 指定文件的屬主
- group 指定文件的屬組
- mode 指定文件的權(quán)限
- backup 創(chuàng)建一個(gè)包含時(shí)間戳信息的備份文件冗恨,這樣如果您以某種方式錯(cuò)誤地破壞了原始文件答憔, 就可以將其恢復(fù)原狀。yes/no
Example
用法其實(shí)和 copy 模塊基本一樣掀抹, template 模塊的強(qiáng)大之處就是使用變量替換虐拓,就是可以把傳遞給 Ansible 的變量的值替換到模板文件中。
1. 建立一個(gè) template 文件, 名為 hello_world.j2
# cat hello_world.j2
Hello {{var}} !
2. 執(zhí)行命令傲武,并且設(shè)置變量 var 的值為 world
# ansible all -i hosts -m template -a "src=hello_world.j2 dest=/tmp/hello_world.world" -e "var=world"
3. 在被控主機(jī)上驗(yàn)證
# cat /tmp/hello_world.world
Hello world !
4.12 lineinfile 模塊
在被管理節(jié)點(diǎn)上蓉驹,用正則匹配的方式對目標(biāo)文件的一行內(nèi)容修改刪除等操作。
如果是在一個(gè)文件中把所有匹配到的多行都進(jìn)行統(tǒng)一處理揪利,請參考replace 模塊态兴。
如果想對一個(gè)文件進(jìn)行一次性添加/更新/刪除多行內(nèi)容等操作,參考blockinfile模塊
常用參數(shù)
path 被管理節(jié)點(diǎn)的目標(biāo)文件路徑, 必須疟位。
state 可選值absent 刪除 |present 替換(默認(rèn)值)瞻润。
-
regexp 在文件的每一行中查找的正則表達(dá)式。
對于 state=present ,僅找到的最后一行將被替換甜刻。
line 要在文件中插入/替換的行绍撞。需要
state=present
。create 文件不存在時(shí)得院,是否要?jiǎng)?chuàng)建文件并添加內(nèi)容傻铣。yes/no
Example
- 刪除被控節(jié)點(diǎn)文件里的某一條內(nèi)容
# ansible dbservers -i hosts -m lineinfile -a "path=/etc/sudoers regexp='^%wheel' state=absent"
- 替換某一行
# ansible dbservers -i hosts -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled' state=present"
4.13 blockinfile 模塊
對目標(biāo)文件進(jìn)行多行的添加/更新/刪除操作。
常用參數(shù)
- path 目標(biāo)文件路徑
- block 文件中被操作的塊內(nèi)容
- state 塊內(nèi)容如何處理尿招,absent 刪除矾柜, present 添加/更新(默認(rèn)值)
Example
-
向文件
/etc/ssh/sshd_config
的最后添加幾行內(nèi)容添加的內(nèi)容是
Match User ansible-agent PasswordAuthentication no
ansible dbservers -i hosts -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication no'"
注意:
\n
是換行符的意思。
-
更新之前的內(nèi)容
ansible dbservers -i hosts -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication yes'"
-
刪除文件中的連續(xù)出現(xiàn)幾行內(nèi)容
ansible dbservers -i hosts -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication yes' state=absent"
模塊索引 https://docs.ansible.com/ansible/latest/modules/modules_by_category.html