第7章 ansible的管理
7.1 ansible概念的介紹
- ansible-playbook –syntax 檢查語法
- ansible-playbook -C 模擬執行劇本
- ansible-doc -l 列出ansible的一些模塊名字
- ansible-doc -s 模塊名 詳細查看指定的模塊參數
- ansible-doc 模塊名 詳細查看指定的模塊用法
======================================================================
- 黃色 對系統數據信息有改變
- 綠色 對系統進行查看操作時
- 紅色 操作過程有嚴重錯誤
- 紫色 建議或者忠告
- 藍色 操作執行過程信息
7.1.1 ansible的概念
- ansible是基於python開發的,一個批量管理服務器的軟件
7.1.2 ansible使用的一些意義
- 可以批量管理服務器
- 可以節約公司維護成本
- 可以減少做一些重復性的工作
- 提高工作效率,提高工作的精確度
7.1.3 ansible擁有哪些服務
- ansible可以批量分發數據信息
- ansible可以批量部署服務
- ansible可以批量的進行公司資產的統計
- ansible可以進行自動管理(代碼上線,服務重啟)
7.1.4 ansible服務的一些特點
- ansible服務不需要啟動
- ansible軟件安裝簡單
- ansible軟件功能強大(管理模塊眾多,劇本編寫實現自動化)
- 客戶端不需要配置
7.2 ansible部署過程
7.2.1 服務的安裝
[root@m01 ~] # yum -y install ansible
7.2.2 服務版本的檢查
[root@m01 ~] # ansible --version
ansible 2.8.5
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, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
[root@m01 ~] #
7.3 ansible的主機清單講解
7.3.1 根據主機IP地址來進行設置主機清單
7.3.1.1 編輯配置文件,將主機IP地址放入配置文件最后一行
[root@m01 ~] # vim /etc/ansible/hosts
## db-[99:101]-node.example.com
172.16.1.41
172.16.1.7
7.3.1.2 使用ansible命令來測試這幾個服務器是否正常
[root@m01 ~] # ansible all -m ping 查看IP地址是否正常
172.16.1.41 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong" 出現ping:pong就是正常的情況
}
172.16.1.7 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@m01 ~] #
7.3.2 根據分組來進行設置主機清單
7.3.2.1 只查看網站web服務器的情況
[root@m01 ~] # vim /etc/ansible/hosts
172.16.1.41
[web_server] 將網站服務器分組,組名為[web_server]
172.16.1.7
"/etc/ansible/hosts" 50L, 1067C written
You have new mail in /var/spool/mail/root
[root@m01 ~] # ansible web_server -m ping 查找指定的組來進行測試
172.16.1.7 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@m01 ~] #
7.3.3 根據內置環境變量設置主機清單
7.3.3.1 秘鑰不正常,需要使用密碼的情況
7.3.3.1.1 破壞分發的公鑰
[root@web01 ~] # vim ~/.ssh/authorized_keys
-dss AAAAB3NzaC1kc3MAAACBAP2/LmC3aM8WowMU81f1PYTFR5l08hATO3LR13RSa6XBw8laM5ih2tqe66FwUOwgpKfEczvOcqtbohCg87ZF3B/1sT25lKrsePysmn7Jr93htinjAMrP36pS5+MG
7.3.3.1.2 查看ssh連接看是否秘鑰還否正常
[root@backup ~] # ssh 172.16.1.7 秘鑰已經不正常
root@172.16.1.7's password:
7.3.3.1.3 使用ansible來測試
[root@m01 ~] # ansible 172.16.1.7 -m ping
172.16.1.7 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,password).", 連接失敗
"unreachable": true
}
[root@m01 ~] #
172.16.1.7 ansible_user=root ansible_password=123456 ansible_port=22 設置內置變量來定義用戶,密碼,端口
"/etc/ansible/hosts" 50L, 1125C written
[root@m01 ~] # ansible 172.16.1.7 -m ping
172.16.1.7 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong" 連接成功
}
[root@m01 ~] #
- ansible_user 指定被管理主機連接的用戶信息
- ansible_password 指定被管理主機連接的密碼信息
- ansible_port 指定被管理主機連接的端口信息
- ansible_host 指定被管理主機IP對應的的用戶名 信息
7.3.3.2 使用用戶名來設置主機清單
web01 ansible_host=172.16.1.7 ansible_user=root ansible_password=123456 ansible_port=22
"/etc/ansible/hosts"^[[A 50L, 1144C written 使用ansible_host來進行設置IP對應的主機名
[root@m01 ~] # ansible web01 -m ping
web01 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@m01 ~] #
7.3.3.3 用戶提權來設置主機清單
web01 ansible_host=172.16.1.7 ansible_user=oldboy10 ansible_password=123456 ansible_port=22
~
"/etc/ansible/hosts" 51L, 1343C written
[root@m01 ~] # ansible web01 -m command -a "cat /etc/shadow"
web01 | FAILED | rc=1 >>
cat: /etc/shadow: Permission deniednon-zero return code 權限拒絕,因為是普通用戶,沒有權限打開
[root@m01 ~] #
[root@m01 ~] # vim /etc/ansible/hosts
[web_server]
web01 ansible_host=172.16.1.7 ansible_user=oldboy10 ansible_password=123456 ansible_port=22 ansible_become=yes ansible_become_method=su ansible_becom
e_user=root ansible_become_password=123456 是否開啟提權操作使用什么方法來進行提權使用什么用戶進行提權密碼是多少
[root@m01 ~] # ansible web01 -m command -a "cat /etc/passwd" 查看主機名為web01的/etc/passwd,用戶為普通用戶
web01 | CHANGED | rc=0 >>
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
- ansible_become 是否進行提權(yes/no)(true/false)
- ansible_become_method 提權選擇的方法(su/sudo)
- ansible_become_user 使用什么用戶進行提權
- ansible_become_password 指定提權用戶密碼
7.3.4 根據組變量來設置主機清單
[web_server]
web01 ansible_host=172.16.1.7 ansible_user=oldboy10 ansible_password=123456 ansible_port=22
[web_server:vars] 設置他的組變量參數為vars
ansible_become=yes
ansible_become_method=su
ansible_become_user=root
ansible_become_password=123456
[root@m01 ~] # ansible web01 -m command -a "cat /etc/shadow"
web01 | CHANGED | rc=0 >>
root:$6$pn3juE2N$C9kmnucSJh08QQ.84BOTUNPqy3MSLez2YFG70N4NHD9gU40ibY8mdT6P05xUiaim2xcuRkjgB1rBohhZ8Y.To.:18178:0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
adm:*:17834:0:99999:7:::
lp:*:17834:0:99999:7:::
sync:*:17834:0:99999:7:::
7.3.5 根據組與子組來設置主機清單
[web_backup:children] 將多個模塊合在一起進行查看(children:可以說成是web_backup主模塊的子模塊配置)
backup_server
web_server
[backup_server]
172.16.1.41
[web_server]
172.16.1.7 ansible_user=root ansible_password=123456 ansible_port=22
[root@m01 ~] # ansible web_backup -m ping
172.16.1.41 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
172.16.1.7 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@m01 ~] #
7.3.6 根據序列來設置主機清單
[seq_server] 連續的情況下使用這個方法
172.16.1.[41:45]
"/etc/ansible/hosts" 59L, 1222C written
[root@m01 ~] # ansible seq_server -m ping
172.16.1.41 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
172.16.1.42 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: connect to host 172.16.1.42 port 22: No route to host",
"unreachable": true
}
172.16.1.44 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: connect to host 172.16.1.44 port 22: No route to host",
"unreachable": true
}
[root@m01 ~] #
7.4 ansible的模塊講解(相當於linux命令行的命令)
7.4.1 命令模塊的講解
7.4.1.1 command命令模塊講解(默認模塊)
7.4.1.1.1 作用
批量管理多個數據執行命令,默認不支持特殊符號的使用
7.4.1.1.2 語法
ansible 主機名 -m command -a "hostname"
7.4.1.1.3 使用command來查看各個服務器的主機名
[root@m01 ~] # ansible web_server -m command -a "hostname" 查看主機名
172.16.1.7 | CHANGED | rc=0 >>
web01
[root@m01 ~] #
7.4.1.1.4 使用command來切換目錄
[root@m01 ~] # ansible web_server -m command -a "chdir=/tmp pwd" 切換目錄
172.16.1.7 | CHANGED | rc=0 >>
/tmp
You have new mail in /var/spool/mail/root
[root@m01 ~] #
7.4.1.1.5 使用command來創建文件
- creates:判斷文件數據是否存在,如果存在,則跳過下次的創建,所以不創建33.txt
[root@m01 ~] # ansible web_server -m command -a "creates=/tmp/aa.txt touch33.txt"
172.16.1.7 | SUCCESS | rc=0 >>
skipped, since /tmp/aa.txt exists 跳過,現在aa.txt已經存在,跳過創建33.txt
[root@m01 ~] #
[root@web01 tmp] # ll
total 0
-rw-r--r-- 1 root root 0 Oct 30 16:33 aa.txt
[root@web01 tmp] #
- removes:如果文件存在,才會進行創建,現在oldboy.txt文件不存在,所以不會創建
[root@m01 ~] # ansible 172.16.1.41 -m command -a "removes=/tmp/oldboy.txt touch /tmp/aa.txt"
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /tmp/oldboy.txt does not exist
[root@m01 ~] #
[root@backup ~] # ll /tmp 文件不存在
total 4
-rw-r--r-- 1 root root 0 Oct 30 11:19 aa.txt
-rw-r--r-- 1 oldboy01 oldboy01 390 Oct 17 19:10 hosts
7.4.1.2 shell命令模塊的講解(萬能模塊)
7.4.1.2.1 作用
批量管理多個數據執行命令,默認支持特殊符號,但是這個命令執行一次就廢了,簡稱冪等法
7.4.1.2.2 語法
ansible 主機名 -m shell-a "echo oldboy66 > /tmp/aa.txt"
7.4.1.2.3 將備份服務器/tmp/aa.txt里面加入數據信息oldboy66
[root@m01 ~] # ansible 172.16.1.41 -m shell -a "echo oldboy66 > /tmp/aa.txt"
172.16.1.41 | CHANGED | rc=0 >>
[root@m01 ~] #
[root@backup ~] # cat /tmp/aa.txt
oldboy66 數據已經重定向成功
[root@backup ~] #
7.4.1.3 script命令模塊的講解(腳本模塊)
7.4.1.3.1 作用
可以遠程執行腳本文件
7.4.1.3.2 語法
ansible IP地址 -m script -a "/server/scripts/1.sh"
7.4.1.3.3 將/server/scripts/1.sh分發到備份服務器上創建出腳本中執行的內容
[root@m01 scripts] # ansible 172.16.1.41 -m script -a "/server/scripts/1.sh"
172.16.1.41 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 172.16.1.41 closed.\r\n",
"stderr_lines": [
"Shared connection to 172.16.1.41 closed."
],
"stdout": "",
"stdout_lines": []
}
7.4.2 文件模塊的講解
7.4.2.1 copy模塊的講解
7.4.2.1.1 作用
- 將管理主機上的數據分發到其他被管理主機上
- 可以將被管理主機上的數據進行復制的操作
7.4.2.1.2 語法
- ansible 172.16.1.41 -m copy -a "src=路徑 dest=路徑 mode=權限 owner=屬主 group=屬組"
- ansible 172.16.1.41 -m copy -a "src=路徑 dest=路徑 remote_src=yes/no mode=權限 owner=屬主 group=屬組"
- ansible 172.16.1.41 -m copy -a "content=內容 dest=路徑 mode=權限 owner=屬主 group=屬組"
- ansible 172.16.1.41 -m copy -a "content=內容 dest=路徑 mode=權限 owner=屬主 group=屬組 backup=yes/no"
7.4.2.1.3 參數講解
- src 要復制到遠程服務器的文件路徑
- dest 指定保存到遠程服務器哪個路徑下面
- remote_src true:表示src文件在遠程服務器上,false表示src文件在本 地上
- backup 傳輸文件之前,對可能要備份覆蓋的文件做備份操作
- mode 傳輸文件之后對文件權限進行修改操作
- owner 傳輸文件之后對文件的屬主進行修改操作
- group 傳輸文件之后對文件的屬組進行修改操作
- content 在被管理的主機創建文件並且添加新的額內容
7.4.2.1.4 將批量管理服務器的hosts文件備份到備份服務器的backup目錄下面
[root@m01 scripts] # ansible 172.16.1.41 -m copy -a "src=/etc/hosts dest=/backup/ mode=666 owner=oldboy10 group=oldboy10"
172.16.1.41 | CHANGED => {
"gid": 1004,
}
[root@m01 scripts] #
[root@backup scripts] # cd /backup/
[root@backup backup] # ll
total 4
-rw-rw-rw- 1 oldboy10 oldboy10 390 Oct 30 19:32 hosts 屬主.屬組修改為了oldboy10,權限為666
[root@backup backup] #
7.4.2.1.5 將備份服務器文件/etc/hosts文件移動到/tmp目錄下面
[root@m01 scripts] # ansible 172.16.1.41 -m copy -a "src=/etc/hosts dest=/backup/ mode=777 remote_src=yes"
172.16.1.41 | CHANGED => { remote_src代表的是遠程源是否開啟
"ansible_facts": {
"changed": true
[root@backup backup] # ll
total 4
-rwxrwxrwx 1 root root 390 Oct 17 19:10 hosts
[root@backup backup] #
7.4.2.1.6 將oldboy66放入到遠程備份服務器的/tmp/hosts文件中
[root@m01 backup] # ansible 172.16.1.41 -m copy -a "content=oldboy66 dest=/backup/hosts mode=777 "
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
[root@backup backup] # cat hosts
oldboy66 內容輸出正確
7.4.2.1.7 將/etc/hosts傳輸到備份服務器backup目錄下
[root@m01 backup] # ansible 172.16.1.41 -m copy -a "src=/etc/hosts dest=/backup/hosts mode=111 backup=yes "
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"backu
[root@backup backup] # ll
total 8
---x--x--x 1 root root 390 Oct 30 19:49 hosts 傳輸成功
-rwxrwxrwx 1 root root 9 Oct 30 19:45 hosts.9266.2019-10-30@19:49:30~
You have new mail in /var/spool/mail/root
[root@backup backup] #
7.4.2.2 file模塊的講解
7.4.2.2.1 作用
對已有數據信息進行數據屬性的修改
在多台主機上面可以進行創建或者刪除的操作
7.4.2.2.2 語法
ansible 172.16.1.41 -m file -a "path=指定數據的路徑信息 mode=要修改成的權限 owner=要修改成的屬主 group=要修改成的屬組"
ansible 172.16.1.41 -m file -a "path=指定數據的路徑信息/要創建的文件 state=touch"
ansible 172.16.1.41 -m file -a "path=指定數據的路徑信息/要創建的目錄 state=directory"
ansible 172.16.1.41 -m file -a "src=遠程的文件 path=指定數據的路徑信息/要創建硬鏈接 state=hard"
ansible 172.16.1.41 -m file -a " src=遠程的文件 path=指定數據的路徑信息/要創建軟鏈接 state=link"
ansible 172.16.1.41 -m file -a "path=指定數據的路徑信息/要刪除的文件 state=absent"
ansible 172.16.1.41 -m file -a "path=指定數據的路徑信息/要刪除的目錄 state=absent"
7.4.2.2.3 參數講解
path 指定要遠程創建的文件的具體路徑信息
src 指定源文件是哪個
state 指定對查找到的路徑下面的文件進行什么操作(touch,directory.,hard,link)
mode 指定文件的權限信息
owner 指定文件的屬主信息
group 指定文件的屬組信息
7.4.2.2.4 將遠程172.16.1.41服務器的/backup/hosts文件權限修改為644,並且屬主.屬組為oldboy10
[root@m01 backup] # ansible 172.16.1.41 -m file -a "path=/backup/hosts mode=644 owner=oldboy10 group=oldboy10"
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
[root@backup backup] # ll
total 8
-rw-r--r-- 1 oldboy10 oldboy10 390 Oct 30 19:49 hosts 修改成功
7.4.2.2.5 在遠程主機172.16.1.4的/backup/目錄下面創建文件為oldboy10.txt
[root@m01 backup] # ansible 172.16.1.41 -m file -a "path=/backup/oldboy10.txt state=touch"
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
[root@backup backup] # ll
total 8
-rw-r--r-- 1 oldboy10 oldboy10 390 Oct 30 19:49 hosts
-rw-r--r-- 1 root root 0 Oct 30 20:28 oldboy10.txt 創建成功
7.4.2.2.6 在遠程主機172.16.1.4的/backup/目錄下面創建目錄為oldboy
[root@m01 backup] # ansible 172.16.1.41 -m file -a "path=/backup/oldboy state=directory"
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
[root@backup backup] # ll
total 8
-rw-r--r-- 1 oldboy10 oldboy10 390 Oct 30 19:49 hosts
drwxr-xr-x 2 root root 6 Oct 30 20:31 oldboy 創建目錄成功
7.4.2.2.7 在遠程主機172.16.1.4的/backup/目錄下面創建硬鏈接文件為hard_oldboy.txt
[root@m01 backup] # ansible 172.16.1.41 -m file -a "src=/backup/oldboy10.txt path=/backup/hard_oldboy.txt state=hard"
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
69620303 -rw-r--r-- 3 root root 0 Oct 30 20:28 hard_oldboy.txt 創建硬鏈接成功
69620303 -rw-r--r-- 3 root root 0 Oct 30 20:28 oldboy10.txt
7.4.2.2.8 在遠程主機172.16.1.4的/backup/目錄下面創建軟鏈接文件為link_oldboy.txt
[root@m01 backup] # ansible 172.16.1.41 -m file -a "src=/backup/oldboy10.txt path=/backup/link_oldboy01.txt state=link "
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
[root@backup backup] # ll
total 12
lrwxrwxrwx 1 root root 20 Oct 30 20:50 link_oldboy01.txt -> /backup/oldboy10.txt 創建成功
-rw-r--r-- 4 root root 0 Oct 30 20:28 oldboy10.txt
7.4.2.2.9 在遠程主機上將oldboy10.txt刪除
[root@m01 backup] # ansible 172.16.1.41 -m file -a " path=/backup/oldboy10.txt state=absent"
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
[root@backup backup] # ll 發現沒有oldboy10.txt文件了
total 12
-rw-r--r-- 2 oldboy10 oldboy10 390 Oct 30 19:49 aa
-rw-r--r-- 3 root root 0 Oct 30 20:28 hard_oldboy.txt
[root@backup backup] #
7.4.2.2.10 在遠程主機上將oldboy目錄刪除
[root@m01 backup] # ansible 172.16.1.41 -m file -a " path=/backup/oldboy state=absent"
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
}
You have new mail in /var/spool/mail/root
[root@m01 backup] #
[root@backup backup] # ll 發現沒有oldboy10目錄
total 12
-rw-r--r-- 2 oldboy10 oldboy10 390 Oct 30 19:49 aa
-rw-r--r-- 3 root root 0 Oct 30 20:28 hard_oldboy.txt
[root@backup backup] #
7.4.2.3 fetch模塊的講解
7.4.2.3.1 作用
將被管理端主機數據進行拉取保存到管理主機上
7.4.2.3.2 語法
ansible 172.16.1.41 -m fetch -a " src=被管理機的目錄下面的數據信息 dest=管理機指定的目錄下面 "
7.4.2.3.3 將/etc/hosts文件拿到批量管理服務器上的/backup目錄里面
[root@m01 backup] # ansible 172.16.1.41 -m fetch -a " src=/etc/hosts dest=/backup/"
172.16.1.41 | CHANGED => {
"changed": true,
"remote_md5sum": null
}
[root@m01 backup] # ll /backup
total 16
drwxr-xr-x 3 root root 17 Oct 30 20:58 172.16.1.41
[root@m01 backup] # cd 172.16.1.41
[root@m01 172.16.1.41] # ll
total 0
drwxr-xr-x 2 root root 19 Oct 30 20:58 etc 成功
[root@m01 172.16.1.41] #
7.4.3 系統模塊的講解
7.4.3.1 yum模塊的講解
7.4.3.1.1 作用
可以用於批量安裝軟件
7.4.3.1.2 語法
ansible 主機IP -m yum -a "name=htop state=intsalled"
ansible 主機IP -m yum -a "name=htop state=removed"
7.4.3.1.3 參數講解
name 指定遠程主機要安裝的軟件信息
state 是否安裝軟件(installed)或者卸載軟件(removed)
7.4.3.1.4 批量安裝htop軟件
[root@m01 ansible_playbook] # ansible 172.16.1.41 -m yum -a "name=htop state=installed"
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"changes": {
"installed": [
"htop"
[root@backup ~] # rpm -qa htop
htop-2.2.0-3.el7.x86_64 安裝成功
[root@backup ~] #
7.4.3.1.5 批量卸載htop軟件
[root@m01 ansible_playbook] # ansible 172.16.1.41 -m yum -a "name=htop state=removed"
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"changes": {
"removed": [
"htop"
[root@backup ~] # rpm -qa htop 卸載成功
7.4.3.2 service模塊的講解
7.4.3.2.1 作用
可以批量啟動/停止/重啟/重載服務程序
7.4.3.2.2 語法
ansible 主機IP -m service -a "name=啟動的服務名稱 state=啟動/停止/重啟/重載"
ansible 主機IP -m service -a "name=啟動的服務名稱 enabled=yes/no"
7.4.3.2.3 參數講解
name 指定遠程主機需要批量啟動/停止/重啟/重載的服務程序
state 指定你要將服務的狀態怎么樣
enabled 指定是否要開啟開機自啟服務
7.4.3.2.4 啟動/停止/重啟rsync服務
ansible 172.16.1.41 -m service -a "name=rsyncd state=started" 啟動
[root@backup ~] # systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2019-10-31 15:52:23 CST; 8s ago
Main PID: 3404 (rsync)
ansible 172.16.1.41 -m service -a "name=rsyncd state=stopped" 停止
[root@backup ~] # systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Thu 2019-10-31 15:52:44 CST; 4s ago
ansible 172.16.1.41 -m service -a "name=rsyncd state=restarted" 重啟
[root@backup ~] # systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2019-10-31 15:53:00 CST; 3s ago
7.4.3.2.5 開機自啟rsync服務
[root@backup ~] # systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; disabled; vendor preset: disabled) 發現沒有開啟
Active: active (running) since Thu 2019-10-31 15:53:00 CST; 7min ago
[root@m01 ansible_playbook] # ansible 172.16.1.41 -m service -a "name=rsyncd enabled=yes"
[root@backup ~] # systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled) 開啟成功
Active: active (running) since Thu 2019-10-31 15:53:00 CST; 8min ago
7.4.3.3 cron模塊的講解
7.4.3.3.1 作用
批量設置定時任務
7.4.3.3.2 語法
ansible 主機IP -m cron -a "name=注釋信息 minute=*/5 job=執行的任務"
ansible 主機IP -m cron -a " minute=*/5 job=執行的任務"
ansible 主機IP -m cron -a "name=注釋信息 minute=*/5 job=執行的任務 state=absent/disable"
7.4.3.3.3 參數講解
minute 每分鍾(0-59)
hour 每小時(0-23)
day 每天(1-31)
month 每月(1-12)
weekday 每周(0-6)
name 注釋的信息
job 指定的任務參數
state 定義此定時任務的狀態信息
7.4.3.3.4 在備份服務器上定義每5分鍾更新下時間
[root@m01 ansible_playbook] # ansible 172.16.1.41 -m cron -a "name=定時任務更新時間 minute=*/5 job='/usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null'"
[DEPRECATION WARNING]: The 'name' parameter will be required in future releases.. This
]
}
[root@m01 ansible_playbook] #
[root@backup ~] # crontab -l
#Ansible:定時任務更新時間
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null 添加成功
[root@backup ~] #
7.4.3.3.5 在備份服務器上將添加的定時任務注釋掉
[root@m01 ansible_playbook] # ansible 172.16.1.41 -m cron -a "name=定時任務更新 minute=*/5 job='/usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null' disabled=yes"
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
[root@backup ~] # crontab -l
#Ansible: 定時任務更新
#*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null 注釋成功
[root@backup ~] #
7.4.3.3.6 在備份服務器上將定時任務更新任務刪除
[root@m01 ansible_playbook] # ansible 172.16.1.41 -m cron -a "name=定時任務更新 minute=*/5 job='/usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null' state=absent"
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
[root@backup ~] # crontab -l 發現定時任務已經刪除
#時間同步
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
#nfs打包發送給備份服務
0 20 * * * /bin/sh /server/scripts/backup_server.sh
[root@backup ~] #
7.4.3.4 mount模塊的講解
7.4.3.4.1 作用
可以批量的掛載和卸載操作
7.4.3.4.2 語法
ansible 主機IP -m mount -a "src=172.16.1.31:/data01 path=/mnt fstype=nfs state=掛載;卸載 "
7.4.3.4.3 參數講解
src 指定要掛載的設備文件/網絡文件
path 指定要掛載在哪個目錄上
fstype 指定掛載設備的文件類型
state 指定目前你需要的掛載操作
mounted 掛載(臨時掛載和永久掛載)
unmounted 卸載(臨時卸載)
present 掛載(永久掛載)
absent 卸載(臨時卸載和永久卸載)
7.4.3.4.4 將服務端的data01掛載到客戶端/mnt目錄上(mounted狀態的時候)
[root@m01 ansible_playbook] # ansible 172.16.1.41 -m mount -a "src=172.16.1.31:/data01 path=/mnt fstype=nfs state=mounted"
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
[root@backup ~] # df -h 臨時掛載成功
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 99G 5.3G 93G 6% /
172.16.1.31:/data01 99G 5.3G 93G 6% /mnt
[root@backup ~] # tail /etc/fstab
#
#UUID=27104df9-3f54-4b94-acb7-0890b452e99f / xfs defaults 0 0
172.16.1.31:/data01 /mnt nfs defaults 0 0 永久掛載成功
[root@backup ~] #
7.4.3.4.5 將服務端的data01掛載到客戶端/mnt目錄上(persent狀態的時候)
[root@m01 ansible_playbook] # ansible 172.16.1.41 -m mount -a "src=172.16.1.31:/data01 path=/mnt fstype=nfs state=present"
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
[root@backup ~] # df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 99G 5.3G 93G 6% /
devtmpfs 471M 0 471M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 8.4M 478M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 197M 160M 37M 82% /boot
tmpfs 98M 12K 98M 1% /run/user/42
tmpfs 98M 0 98M 0% /run/user/0
[root@backup ~] # tail -1 /etc/fstab 發現只有永遠掛載,不會臨時掛載
172.16.1.31:/data01 /mnt nfs defaults 0 0
[root@backup ~] #
7.4.3.4.5 將客戶端的掛載點/mnt卸載(unmounted)
[root@m01 ansible_playbook] # ansible 172.16.1.41 -m mount -a "src=172.16.1.31:/data01 path=/mnt fstype=nfs state=unmounted"
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
[root@backup ~] # df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 99G 5.4G 93G 6% /
devtmpfs 471M 0 471M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 8.4M 478M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 197M 160M 37M 82% /boot
tmpfs 98M 12K 98M 1% /run/user/42
tmpfs 98M 0 98M 0% /run/user/0 發現只能臨時卸載,不能永久卸載
[root@backup ~] # tail -1 /etc/fstab
172.16.1.31:/data01 /mnt nfs defaults 0 0 永久卸載失敗
[root@backup ~] #
7.4.3.4.6 將客戶端的掛載點/mnt卸載(absent)
[root@m01 ansible_playbook] # ansible 172.16.1.41 -m mount -a "src=172.16.1.31:/data01 path=/mnt fstype=nfs state=absent"
172.16.1.41 | FAILED! => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"msg": "Error rmdir /mnt: [Errno 39] Directory not empty: '/mnt'"
}
[root@backup ~] # df -h 卸載成功
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 99G 5.4G 93G 6% /
devtmpfs 471M 0 471M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 8.4M 478M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 197M 160M 37M 82% /boot
tmpfs 98M 12K 98M 1% /run/user/42
tmpfs 98M 0 98M 0% /run/user/0
[root@backup ~] # tail -1 /etc/fstab 卸載成功
#/dev/sdb1 /mnt ext4 user 0 0
[root@backup ~] #
7.4.3.5 user模塊的講解
7.4.3.5.1 作用
可以批量生成用戶信息
7.4.3.5.2 語法
ansible 主機IP地址 -m user -a 'name=創建用戶名稱 shell=是否進行登錄 create_home=yes/no password="密文信息"'
7.4.3.5.3 參數講解
name 指定遠程要創建的用戶名稱
shell 指定用戶登錄的方式
create_home 指定用戶是否創建家目錄
password 指定設置用戶的密碼,需要使用密文信息來設置密碼
uid 指定創建的用戶的uid'值
group 指定創建的用戶的主組信息
groups 指定創建的用戶的附屬組信息
7.4.3.5.4 創建olddog用戶
[root@m01 ansible_playbook] #
[root@m01 ansible_playbook] # ansible 172.16.1.41 -m user -a "name=olddog"
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true
[root@backup ~] # id olddog
uid=1015(olddog) gid=1018(olddog) groups=1018(olddog) 創建用戶成功
You have new mail in /var/spool/mail/root
[root@backup ~] #
7.4.3.5.5 創建虛擬用戶oldgirl用戶
[root@m01 ansible_playbook] # ansible 172.16.1.41 -m user -a "name=oldgirl shell=/sbin/nologin create_home=no"
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
[root@backup ~] # id oldgirl 創建虛擬用戶成功
uid=1016(oldgirl) gid=100(users) groups=100(users)
You have new mail in /var/spool/mail/root
[root@backup ~] # ll /home/oldgirl 家目錄找不到
ls: cannot access /home/oldgirl: No such file or directory
[root@backup ~] # grep oldgirl /etc/passwd
oldgirl:x:1016:100::/home/oldgirl:/sbin/nologin 不可以進行用戶登錄
[root@backup ~] #
7.4.3.5.6 創建用戶並且設置密碼
[root@m01 ansible_playbook] # ansible 172.16.1.41 -m user -a "name=oldgirl shell=/bin/bash create_home=no password=123456"
[WARNING]: The input password appears not to have been hashed. The 'password' argument must be encrypted for this module to work properly.
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"append": false,
"changed": true,
[root@backup ~] # grep oldgirl /etc/shadow
oldgirl:123456:18200:0:99999:7::: 密碼是明文的,設置用戶密碼的時候使用密文信息,不正確
[root@backup ~] #
-
創建密文密碼信息
- 方式一:利用ansible命令來設置密文信息
[root@m01 ansible_playbook] # ansible 172.16.1.41 -m debug -a "msg={{'123456'|password_hash('sha512','oldboy') }}"
172.16.1.41 | SUCCESS => {
"msg": "$6$oldboy$MVd3DevkLcimrBLdMICrBY8HF82Wtau5cI8D2w4Zs6P1cCfMTcnnyAmmJc7mQaE9zuHxk8JFTRgYMGv9uKW7j1"
}
-
方式二:使用python語言來生成密碼信息
- 安裝pip軟件
yum install -y python-pip
- pip安裝passlib軟件
pip install passlib
[root@m01 ansible_playbook] # python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))" 使用python語言來設置密文信息
Password: 設置明文密碼
$6$XavoWtpBWnfV2sRL$3H8B1SeY76Dca8b.y6OQlBFVVeSHCwM71MQNwcV7Z1ApGVxIGFX9DNGVZU/k.J0/Vo2Rijrbasaku3nuR7qML1
- 重新設定oldtea密碼信息
[root@m01 ansible_playbook] # ansible 172.16.1.41 -m user -a 'name=oldgirl shell=/bin/bash create_home=no password="$6$XavoWtpBWnfV2sRL$3H8B1SeY76Dca8b.y6OQlBFVVeSHCwM71MQNwcV7Z1ApGVxIGFX9DNGVZU/k.J0/Vo2Rijrbasaku3nuR7qML1"' 添加密文信息
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
[root@backup ~] # grep oldgirl /etc/shadow 查看發現添加成功
oldgirl:$6$XavoWtpBWnfV2sRL$3H8B1SeY76Dca8b.y6OQlBFVVeSHCwM71MQNwcV7Z1ApGVxIGFX9DNGVZU/k.J0/Vo2Rijrbasaku3nuR7qML1:18200:0:99999:7:::
[root@backup ~] #
7.5 ansible的劇本講解(相當於linux編寫的腳本)
7.5.1 劇本的概念
將多個模塊進行整合靈活的使用,實現一鍵批量化的安裝軟件
簡化了操作的流程
提高了工作效率
降低的公司維護的成本
實現了服務端額自動部署
7.5.2 劇本編寫的注意點(yaml語法)
7.5.2.1 縮進規范:2個空格表示一個縮進
- hosts: 主機清單
tasks:
- name: 01 安裝服務
7.5.2.2 冒號后面要有空格(如果是冒號后面會在下面一行輸入內容,則不需要)
tasks: 冒號后面不需要有1個空格
- name: 01 安裝服務
7.5.2.3 短橫線后面需要有空格
- hosts: 主機清單
tasks:
- name: 01 安裝服務 空格后面有一個空格
7.5.3 劇本編寫常見的格式
7.5.3.1 劇本執行方法
7.5.3.1.1 劇本測試語法方法
[root@m01 auto_yaml] # ansible-playbook --syntax-check auto_rsync_news.yaml 測試方法
playbook: auto_rsync_news.yaml
7.5.3.1.2 劇本模擬測試方法
[root@m01 auto_yaml] # ansible-playbook -C auto_rsync_news.yaml 模擬執行方法
PLAY [backup] **************************************************************************************************************************************
7.5.3.1.3 劇本執行方法
[root@m01 auto_yaml] # ansible-playbookauto_rsync_news.yaml 執行方法
PLAY [backup] **************************************************************************************************************************************
7.5.3.2 列表格式的編寫
- hosts: nfs_server
tasks:
- name: 01:install software
yum: name=nfs-utils state=installed
yum: name=rpcbind state=installed
- name: 02:push conf_file to server
copy: src=./nfs/exports dest=/etc/
- name: 03:create data dir
file: path=/data state=directory owner=nfsnobody group=nfsnobody
- name: 04:boot server
service: name=rpcbind state=started enabled=yes
service: name=nfs state=started enabled=yes
- hosts: nfs_client
tasks:
- name: 01:install software
yum: name=nfs-utils state=installed
- name: 02:mount data dir
shell: mount -t nfs 172.16.1.31:/data /mnt
7.5.3.3 字典格式的編寫
- hosts: nfs_server
tasks:
- name: 01:install software
yum:
name:
- nfs-utils
- rpcbind
state: installed
- name: 02:push conf_file to server
copy:
src: ./nfs/exports
dest: /etc/
- name: 03:create data dir
file:
path: /data
state: directory
owner: nfsnobody
group: nfsnobody
- name: 04:boot server rpc
service:
name: rpcbind
state: started
enabled: yes
- name: 05:boot server nfs
service:
name: nfs
state: started
enabled: yes
- hosts: nfs_client
tasks:
- name: 01:install software
yum:
name: nfs-utils
state: installed
- name: 02:mount data dir
shell: mount -t nfs 172.16.1.31:/data /mnt
7.5.3.4 json格式的編寫(???)
7.5.4 劇本編寫擴展功能
7.5.4.1 劇本中的判斷功能(when)
7.5.4.1.1 劇本中設置變量判斷的信息
ansible_all_ipv4_addresses: 僅顯示ipv4的信息。
ansible_devices: 僅顯示磁盤設備信息。
ansible_distribution: 顯示是什么系統,例:centos,suse等。
ansible_distribution_major_version: 顯示是系統主版本。
ansible_distribution_version: 僅顯示系統版本。
ansible_machine: 顯示系統類型,例:32位,還是64位。
ansible_eth0: 僅顯示eth0的信息。
ansible_hostname: 僅顯示主機名。
ansible_kernel: 僅顯示內核版本。
ansible_lvm: 顯示lvm相關信息。
ansible_memtotal_mb: 顯示系統總內存。
ansible_memfree_mb: 顯示可用系統內存。
ansible_memory_mb: 詳細顯示內存情況。
ansible_swaptotal_mb: 顯示總的swap內存。
ansible_swapfree_mb: 顯示swap內存的可用內存。
ansible_mounts: 顯示系統磁盤掛載情況。
ansible_processor: 顯示cpu個數(具體顯示每個cpu的型號)。
ansible_processor_vcpus: 顯示cpu個數(只顯示總的個數)。
7.5.4.1.2 判斷單個判斷信息
[root@m01 test] # vim playbook_判斷功能.yaml
- hosts: nfs_server
tasks:
- name: 01 查看df -h信息
shell: df -h
register: oldboy
- name: check info
debug: msg={{ oldboy.stdout_lines }}
when: ansible_eth1.ipv4.address == "172.16.1.31" 設置單個變量when
7.5.4.1.3 設置多個判斷信息
- 使用or/and來組合
[root@m01 test] # vim playbook_判斷功能.yaml
- hosts: nfs_server
tasks:
- name: 01 查看df -h信息
shell: df -h
register: oldboy
- name: check info
debug: msg={{ oldboy.stdout_lines }}
when: (ansible_eth1.ipv4.address == "172.16.1.31") or/and (ansible_hostname == "nfs") 使用or/and來判讀
- 使用[]來組合
- hosts: nfs
tasks:
- name: 01 查看df -h信息
shell: "systemctl status sshd"
register: oldboy
- name: check info
debug: msg={{ oldboy.stdout_lines }}
when: (ansible_eth1.ipv4.address == ["172.16.1.31","172.16.1.41"]) 使用[]來判斷
7.5.4.1.4 取反操作
[root@m01 test] # vim playbook_判斷功能.yaml
- hosts: nfs_server
tasks:
- name: 01 查看df -h信息
shell: df -h
register: oldboy
- name: check info
debug: msg={{ oldboy.stdout_lines }}
when: ansible_eth1.ipv4.address != "172.16.1.31" 設置單個變量when,排除31
7.5.4.2 劇本中的循環功能(loop/with_items)
7.5.4.2.1 循環的內容指定的時候
- name: 04:重啟nfs服務
service: name={{ item }} state=started enabled=yes 設置循環的變量
loop:
- rpcbind 設置循環的內容
- nfs
when: ansible_eth1.ipv4.address == "172.16.1.31"
7.5.4.2.2 循環的內容每次不同的時候
- hosts: nfs
tasks:
- name: 01:創建存儲目錄
file: path={{ item.path }} state={{ item.state }} owner={{ item.owner }} group={{ item.group }} 取出你要得到的值
loop: 循環模塊
- {path: '/data', state: 'directory', owner: 'nfsnobody', group: 'nfsnobody'} 設置循環的內容
- {path: '/data01', state: 'directory', owner: 'nfsnobody', group: 'nfsnobody'}
- {path: '/data02', state: 'directory', owner: 'oldboy01', group: 'oldboy01'}
when: ansible_eth1.ipv4.address == "172.16.1.31"
7.5.4.3 劇本中的標簽功能(tags:調試劇本)
ansible-playbook test_標簽功能配置.yml -t oldboy100 只執行標記任務ansible-playbook test_標簽功能配置.yml --skip-tags oldboy100 跳過標記任務
- hosts: nfs
tasks:
- name: 01:創建用戶oldboy
user: name=oldboy1000
tags: oldboy100 -t:只執行這個模塊 --skip-tags:忽略掉這個模塊
- name: 02:查看用戶oldboy是否創建成功
shell: id oldboy
register: oldboy1000
- name: 03:check info
debug: msg={{ oldboy1000.stdout_lines }}
7.5.4.4 劇本中的忽略錯誤功能(ignore_errors: yes)
- name: 01:創建用戶oldboy
user: name=oldboy1000 state=installed
ignore_errors: yes 忽略上面模塊參數的錯誤,會繼續往下面執行
- name: 02:查看用戶oldboy是否創建成功
shell: id oldboy
register: oldboy1000
- name: 03:check info
debug: msg={{ oldboy1000.stdout_lines }}
7.5.4.5 劇本中的觸發器功能
- 提示: 觸發器任務會在所有任務執行完畢之后才執行
[root@m01 test] # vim playbook_觸發器.yaml
- hosts: 172.16.1.41
tasks:
- name: 01 安裝rsync服務
yum: name=rsync state=installed
- name: 02 將文件傳送過去
copy: src=/etc/ansible/ansible_playbook/test/rsyncd.conf dest=/etc
notify: 如果傳輸或者執行的結果有變化,都會觸發
- restart_server
- display news info
- check info
- name: 03 重啟
service: name=rsyncd state=started
- name: display news info
shell: netstat -anptu | grep rsync
register: oldboy
- name: check info
debug: msg={{ oldboy.stdout_lines }}
handlers: 觸發器
- name: restart_server 第一個需要觸發的事情
service: name=rsyncd state=restarted
- name: display news info 第二個需要觸發的事情
shell: netstat -anptu | grep rsync
register: oldboy
- name: check info 第三個需要觸發的事情
debug: msg={{ oldboy.stdout_lines }}
7.5.4.6 劇本中的注冊功能(register:顯示指定輸出的信息)
[root@m01 test] # vim playbook_注冊信息.yaml
- hosts: 172.16.1.31
tasks:
- name: 01 查看df -h信息
shell: df -h
register: oldboy 注冊信息,輸出的信息以oldboy變量來顯示
- name: check info
debug: msg={{ oldboy.stdout_lines }} 將信息輸出來
[root@m01 test] # ansible-playbook playbook_設置變量.yaml
PLAY [172.16.1.31] ********************************************************************************************
ok: [172.16.1.31]
TASK [01 查看df -h信息] *********************************************************************************************************************************
changed: [172.16.1.31]
TASK [check info] ***********************************************************************************************************************************
ok: [172.16.1.31] => { 執行的結果已經顯示出來
"msg": [
"Filesystem Size Used Avail Use% Mounted on",
"/dev/sda3 99G 5.3G 94G 6% /",
"devtmpfs 471M 0 471M 0% /dev",
"tmpfs 487M 0 487M 0% /dev/shm",
"tmpfs 487M 16M 472M 4% /run",
"tmpfs 487M 0 487M 0% /sys/fs/cgroup",
"/dev/sda1 197M 160M 37M 82% /boot",
"tmpfs 98M 16K 98M 1% /run/user/988",
"tmpfs 98M 0 98M 0% /run/user/0"
]
7.5.4.7 劇本中的設置變量功能(vars)
7.5.4.7.1 劇本中設置
[root@m01 test] # vim playbook_設置變量.yaml
- hosts: 172.16.1.31
vars:
name: oldboy100 設置變量
tasks:
- name: 01 創建oldboy100用戶
user: name={{ name }} 調用變量
[root@nfs01 ~] # id oldboy100 查看是否創建成功
uid=1000(oldboy100) gid=1004(oldboy100) groups=1004(oldboy100)
You have new mail
7.5.4.7.2 命令行中設置
[root@m01 test] # ansible-playbook -e name=oldboy50 playbook_設置變量.yaml 使用-e指定變量
PLAY [172.16.1.31] **********************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************
ok: [172.16.1.31]
TASK [01 創建oldboy50用戶] *****************************************************************************************************************************
changed: [172.16.1.31]
PLAY RECAP ******************************************************************************************************************************************
172.16.1.31 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@nfs01 ~] # id oldboy50 查看用戶是否創建成功
uid=1001(oldboy50) gid=1001(oldboy50) groups=1001(oldboy50)
[root@nfs01 ~] #
7.5.4.7.3 主機清單中設置
- 單個主機設置變量
172.16.1.31 name=oldboy20 只給主機31設置了變量oldboy20
172.16.1.41
[root@m01 test] # ansible-playbook playbook_設置變量.yaml
PLAY [172.16.1.31] **********************************************************************************************************************************
TASK [Gathering Facts]
[root@nfs01 ~] # id oldboy20 發現31已經創建成功
uid=1002(oldboy20) gid=1005(oldboy20) groups=1005(oldboy20)
You have new mail in /var/spool/mail/root
[root@backup ~] # id oldboy20 發現41 沒有創建成功
id: oldboy20: no such user
You have new mail in /var/spool/mail/root
[root@backup ~] #
- 多個主機設置變量
[backup] 將31和41創建用戶oldboy30
172.16.1.41
172.16.1.31
[backup:vars]
name=oldboy30
[root@m01 test] # ansible-playbook playbook_設置變量.yaml
PLAY [172.16.1.31] **********************************************************************************************************************************
TASK [Gathering Facts]
[root@nfs01 ~] # id oldboy30 發現31已經創建成功
uid=1002(oldboy30) gid=1005(oldboy30) groups=1005(oldboy30)
You have new mail in /var/spool/mail/root
[root@backup ~] # id oldboy30 發現41創建成功
uid=1002(oldboy30) gid=1005(oldboy30) groups=1005(oldboy30)
You have new mail in /var/spool/mail/root
[root@backup ~] #
7.5.4.7.4 變量設置的優先級最終結論
將3個變量oldboy10、oldboy60 和oldboy80分別設置變量為命令的,主機清單的和劇本中
通過執行發現首先創建oldboy10,其次oldboy80,最后oldboy60
結論:
- 變量中設置在命令行中第一個執行
- 變量中設置在劇本中的第二個執行
- 變量在主機清單中的是最后一個執行
7.5.4.8 劇本執行優化(gather_facts)
7.5.4.8.1 使用gather_facts=no來解決
- hosts: 172.16.1.41
gather_facts: no 添加一行,來提高劇本的執行速度(切記:這個是不需要收集服務器信息了,但是如果你是需要判斷的,是不能添加的)
tasks:
7.5.4.8.2 影響劇本執行速度的快慢的原因
- ssh遠程連接沒有優化,內有將DNS反向解析關閉
- yum下載軟件使用的是外網,也會導致,建議自己搭建倉庫
- 劇本執行的時候會收集服務器的信息也會導致運行比較慢
7.5.5 劇本的整合功能
7.5.5.1 include:xxx.yml
- include:auto_rsync.yaml
- include:auto_nfs.yaml
7.5.5.2 - import_playbook:
- import_playbook: auto_rsync.yaml
- import_playbook: auto_nfs.yaml
7.6 劇本的角色功能
7.6.1 角色的作用
- 可以使劇本編寫更加的規范
- 可以使劇本的編寫更加的簡單
- 可以在匯總劇本中看到主機的信息
7.6.2 怎么配置角色功能
7.6.2.1 創建主機清單
[root@m01 roles] # vim /etc/ansible/roles/hosts
[rsync_server]
172.16.1.41
[rsync_client]
172.16.1.31
172.16.1.7
[nfs_server]
172.16.1.31
[nfs_client]
172.16.1.41
172.16.1.7
7.6.2.2 創建角色功能的目錄
7.6.2.2.1 創建第一級目錄,這個可以自己定義
[root@m01 roles] # mkdir /etc/ansible/roles/rsync
[root@m01 roles] # mkdir /etc/ansible/roles/nfs
[root@m01 roles] # mkdir /etc/ansible/roles/inotify
[root@m01 roles] # mkdir /etc/ansible/roles/nginx
[root@m01 roles] #
7.6.2.2.2 創建第二級目錄,這個不能自定義
[root@m01 roles] # ansible-galaxy init --force rsync 使用這個命令來創建子目錄
- rsync was created successfully
You have new mail in /var/spool/mail/root
[root@m01 roles] # ls
hosts inotify nfs nginx rsync
[root@m01 roles] # cd rsync/ 創建的子目錄
[root@m01 rsync] # ll
total 4
drwxr-xr-x 2 root root 22 Nov 2 17:41 defaults 保存定義變量的文件(不經常變化的)
drwxr-xr-x 2 root root 6 Nov 2 17:41 files 保存要分發的文件
drwxr-xr-x 2 root root 22 Nov 2 17:41 handlers 保存目錄中要觸發的事件
drwxr-xr-x 2 root root 22 Nov 2 17:41 meta
-rw-r--r-- 1 root root 1328 Nov 2 17:41 README.md
drwxr-xr-x 2 root root 22 Nov 2 17:41 tasks 定義任務中的劇本信息
drwxr-xr-x 2 root root 6 Nov 2 17:41 templates 目錄中保存模板的文件
drwxr-xr-x 2 root root 39 Nov 2 17:41 tests
drwxr-xr-x 2 root root 22 Nov 2 17:41 vars 保存定義變量的文件(經常變化的)
[root@m01 rsync] #
7.6.2.3 配置角色目錄中的劇本信息
7.6.2.3.1 編寫tasks/main.yaml文件
- 完整的保存下來
[root@m01 tasks] # vim main.yml
- name: 01 安裝rsync服務
yum: name={{ install_software }} state=installed
- name: 02 將文件傳送過去
copy: src=/etc/ansible/ansible_playbook/test/rsyncd.conf dest=/etc
notify:
- restart_server
- display news info
- check info
- name: 03 重啟
service: name=rsyncd state=started
- name: display news info
shell: netstat -anptu | grep rsync
register: oldboy
- name: check info
debug: msg={{ oldboy.stdout_lines }}
- 將每個模塊進行文件的分割
[root@m01 tasks] # cat install.yaml 安裝服務的模塊文件
- name: 01 安裝rsync服務
yum: name={{ install_software }} state=installed
[root@m01 tasks] # cat transfer.yaml 傳輸文件的模塊文件
- name: 02 將文件傳送過去
copy: src=rsyncd.conf dest=/etc
notify:
- restart_server
- display news info
- check info
[root@m01 tasks] # cat restart_server.yaml 重啟服務的文件
- name: 03 重啟
service: name=rsyncd state=started
- name: display news info
shell: netstat -anptu | grep rsync
register: oldboy
- name: check info
debug: msg={{ oldboy.stdout_lines }}
[root@m01 tasks] # cat main.yml 整合幾個模塊
- include_tasks: install.yaml
- include_tasks: transfer.yaml
- include_tasks: restart_server.yaml
[root@m01 tasks] #
7.6.2.3.2 將需要分發的文件或者目錄放入file目錄中
[root@m01 rsync] # cp -rf ../../../ansible/ansible_playbook/test/rsyncd.conf ./files/
You have new mail in /var/spool/mail/root
[root@m01 rsync] # cd files/
[root@m01 files] # ll
total 4
-rw-r--r-- 1 root root 577 Nov 2 17:55 rsyncd.conf
[root@m01 files] #
7.6.2.3.3 編寫vars/main.yaml文件
[root@m01 vars] # vim main.yml
install_software: rsync
7.6.2.3.4 編寫handlers/main.yaml文件
- name: restart_server
service: name=rsyncd state=restarted
- name: display news info
shell: netstat -anptu | grep rsync
register: oldboy
- name: check info
debug: msg={{ oldboy.stdout_lines }}
7.6.2.4 調取角色信息
- hosts: 172.16.1.41
roles:
- rsync
~
7.6.2.5 執行角色匯總劇本
[root@m01 roles] # ansible-playbook site.yaml
7.6.2.6 templates模板功能的使用(擴展)
7.6.2.6.1 將需要改變的文件移動到templates目錄下
mv ../files/rsyncd.conf ../templates/
7.6.2.6.2 將rsyncd.conf文件需要變化的端口信息設置成變量
[root@m01 roles] # cat rsync/templates/rsyncd.conf
uid = rsync
gid = rsync
port = {{ port }} 設置變量為port
fake super = yes
use chroot = no
max connections = 200
7.6.2.6.3 將端口配置到vars目錄下的main.yaml里面
[root@m01 roles] # cat rsync/vars/main.yml
install_software: rsync
port: 879 定義端口號為879
[root@m01 roles] #
7.6.2.6.4 修改傳輸模塊
- template 可以解析你傳輸的文件里面的變量信息
- copy 所見即所得
- name: 02 將文件傳送過去
template: src=rsyncd.conf dest=/etc 可以解析你傳輸的文件里面的變量信息
notify:
- restart_server
- display news info
- check info