ansible批量管理常見的配置方法


 

7 ansible的管理

7.1 ansible概念的介紹

  • ansible-playbook –syntax            檢查語法
  • ansible-playbook -C                模擬執行劇本
  • ansible-doc -l                        列出ansible的一些模塊名字
  • ansible-doc -s 模塊名                詳細查看指定的模塊參數
  • ansible-doc 模塊名                詳細查看指定的模塊用法

======================================================================

  • 黃色                            對系統數據信息有改變
  • 綠色                            對系統進行查看操作時
  • 紅色                            操作過程有嚴重錯誤
  • 紫色                            建議或者忠告
  • 藍色                            操作執行過程信息

7.1.1 ansible的概念

  1. ansible是基於python開發的,一個批量管理服務器的軟件

7.1.2 ansible使用的一些意義

  1. 可以批量管理服務器
  2. 可以節約公司維護成本
  3. 可以減少做一些重復性的工作
  4. 提高工作效率,提高工作的精確度

7.1.3 ansible擁有哪些服務

  1. ansible可以批量分發數據信息
  2. ansible可以批量部署服務
  3. ansible可以批量的進行公司資產的統計
  4. ansible可以進行自動管理(代碼上線,服務重啟)

7.1.4 ansible服務的一些特點

  1. ansible服務不需要啟動
  2. ansible軟件安裝簡單
  3. ansible軟件功能強大(管理模塊眾多,劇本編寫實現自動化)
  4. 客戶端不需要配置

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 冒號后面要有空格(如果是冒號后面會在下面一行輸入內容,則不需要)

- hosts: 主機清單                冒號后面要有1個空格

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 主機清單中設置
  1. 單個主機設置變量

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 ~] #

  1. 多個主機設置變量

[backup]                    3141創建用戶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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM