自動化運維Ansible之常用模組
阿新 • • 發佈:2020-04-05
[TOC]
# 0、Ansible模組語法
在ansible中是指需要快速執行一條命令,並且不需要儲存的命令,對於複雜的命令則為playbook
檢視模組幫助:ansible-doc -l
```bash
// 統計模組數量
$ ansible-doc -l |wc -l
3387 // ansible有大量的模組
```
Ansible模組語法:
```bash
ansible [管理主機資訊或者主機組資訊] -m [模組名稱] -a [相關模組引數]
主機資訊:遠端主機IP地址;遠端主機組名稱;遠端所有主機all
-m:指定相應模組
-a:利用模組中某些引數功能
-f :定義每次輸出內容的數量
```
>Ansible注意事項顏色資訊:
>綠色:對遠端節點不進行相應修改,或者只是對遠端節點資訊進行檢視
>紅色:操作執行命令有異常
>黃色:對遠端節點進行相應修改
>深紫色:表示對命令執行發出警告資訊(可能存在的問題,給你提示建議)
# 1、Command模組
command模組的作用:預設模組,`在遠端主機執行命令`;預設模組,可忽略-m選項
```bash
// chaidr 先切換到特定的目錄,然後在執行命令
[root@m01 ~]# ansible 10.4.7.8 -m command -a "chdir=/tmp/ pwd"
// creates 判斷一個檔案是否存在。檔案如果存在,後面命令則不會執行;如果不存在,則執行
[root@m01 /]# ansible 10.4.7.8 -m command -a "creates=/etc/rsyncd.conf hostname"
// removes 判斷一個檔案是否存在。檔案如果存在,後面命令執行;如果不存在,則不執行
[root@m01 /]# ansible 10.4.7.8 -m command -a "removes=/etc/exports hostname"
// fress_form 使用command模組批量獲取執行hostname命令
[root@m01 /]# ansible sa -m command -a "hostname"
```
該command模組無法和shell一樣,像$HOME變數,和一些像 "<", ">", "|", ";" and "&" 這樣的操作是沒有辦法執行(如果要支援這些特殊符號就必須要使用shell模組)錯誤的演示:
```bash
[root@m01 /]# ansible sa -m command -a "hostname;date"
```
# 2、Shell模組
shell模組作用:shell模組是`萬能模組`,可以滿足command模組所有功能,並且可以`支援識別特殊字元`。
```bash
// 在10.4.7.8的機器的當前目錄下執行ls和pwd命令
[root@m01 /]# ansible 10.4.7.8 -m shell -a "ls;pwd"
```
# 3、Scripts模組
scripts模組作用:`專門執行指令碼模組`,在本地執行指令碼,指令碼產生所有的動作都在遠端主機上執行
```bash
// 編寫指令碼,裡面新增yum安裝keepalived命令,將指令碼執行命令放入到受控端執行
[root@m01 ~]# cat /server/scripts/yum.sh
#!/bin/bash
yum install -y keepalived
[root@m01 ~]# ansible 10.4.7.8 -m script -a "/server/scripts/yum.sh"
[root@m01 ~]# ansible 10.4.7.8 -m shell -a "rpm -qa keepalived"
```
>注意:我們在管理機器上執行的指令碼,遠端(受控端)是不需要存在該指令碼
# 4、Copy模組
copy模組作用:將檔案從本地或遠端機器`複製到遠端機器上`的某個位置
```bash
// 將本端的/etc/hosts檔案推送到遠端,並且重新命名為test.txt
[root@m01 ~]# ansible sa -m copy -a "src=/etc/hosts dest=/tmp/test.txt"
// 本端在/tmp/下建立檔案file01.txt,推送到遠端
[root@m01 ~]# touch /tmp/file01.txt
[root@m01 ~]# ansible 10.4.7.7 -m copy -a "src=/tmp/file01.txt dest=/tmp/"
// 為本端的/tmp/file01.txt檔案追加內容,並推送到遠端,覆蓋時備份原檔案
[root@m01 ~]# cat /tmp/file01.txt
[root@m01 ~]# echo 123456 >/tmp/file01.txt
[root@m01 ~]# cat /tmp/file01.txt
123456
[root@m01 ~]# ansible 10.4.7.7 -m copy -a "src=/tmp/file01.txt dest=/tmp/ backup=yes"
// 在/root/下建立test.txt檔案,在複製的時候修改屬主和屬組為root,許可權644
[root@m01 ~]# ansible 10.4.7.7 -m copy -a "src=/root/test.txt dest=/test/oldboy/ owner=root group=root mode=644"
// 為對端的/tmp/test.txt檔案寫入內容“1”
[root@m01 ~]# ansible 10.4.7.7 -m copy -a "content='1' dest=/tmp/test.txt"
```
**引數**
```bash
- backup # 對推送傳輸過去的檔案,進行備份
- src # 推送資料的原始檔資訊
- dest # 推送資料的目標路徑
- content # 直接批量在被管理端檔案中新增內容
- owner # 將本地檔案推送到遠端,指定檔案屬主許可權
- group # 將本地檔案推送到遠端,指定檔案屬組許可權
- mode # 將本地檔案推送到遠端,指定檔案許可權資訊
```
# 5、File模組
file模組作用:對受控端的`檔案屬性修改/目錄建立/檔案建立`
```bash
// 為遠端主機修改/tmp/file01.txt檔案的屬主和屬組為root,許可權為600
[root@m01 ~]# ansible 10.4.7.7 -m file -a "path=/tmp/file01.txt owner=root group=root mode=600"
// 為遠端主機建立檔案和目錄,遠端建立檔案/tmp/file01.txt
[root@m01 ~]# ansible 10.4.7.7 -m file -a " path =/tmp/file01.txt state=touch"
// 遠端建立目錄/tmp/dir01
[root@m01 ~]# ansible 10.4.7.7 -m file -a "path =/tmp/dir01 state=directory"
// 遞迴修改遠端主機的/data目錄及目錄下的所有檔案的屬主和屬組都為root
[root@m01 /]# ansible 10.4.7.7 -m file -a "path=/data state=directory owner=root group=root recurse=yes"
```
**模組引數**
```bash
- path # 指定遠端主機目錄或檔案資訊
- recurse # 遞迴授權:
yes # 遞迴修改許可權
no # 不遞迴修改許可權(預設)
- state # 指定需要執行的動作:
directory # 在遠端建立目錄
touch # 在遠端建立檔案
hard # 硬連結
link #軟連結
```
# 6、Yum模組
yum模組作用:可以對受控端`執行yum安裝`,`解除安裝和檢視軟體包`等
```bash
// yum安裝iftop軟體包
[root@m01 ~]# ansible 10.4.7.7 -m yum -a "name=iftop state=installed"
// 移除iftop軟體
[root@m01 ~]# ansible 10.4.7.7 -m yum -a "name=iftop state=absent"
// 檢視指定軟體包名的列表
[root@m01 ~]# ansible 10.4.7.7 -m yum -a "list=iftop"
```
**模組引數**
```bash
- name # 執行要安裝軟體的名稱,以及軟體的版本
- state # 指定需要執行的動作:
installed、present # 安裝軟體包
latest # 安裝最新軟體包
removed、absent # 移除軟體包
- list # 指定軟體名稱,檢視軟體是否已經安裝了
```
# 7、Service模組
service模組作用:`管理服務狀態模組`,對受控端進行服務的管理
```bash
// 將遠端的crond服務關閉,並且開機不啟動
[root@m01 ~]# ansible 10.4.7.7 -m service -a "name=crond state=stopped enabled=no"
// 將遠端的crond服務開啟,並且開機自啟動
[root@m01 ~]# ansible 10.4.7.7 -m service -a "name=crond state=started enabled=yes"
```
**模組引數**
```bash
- name # 指定需要管理的服務名稱(管理的服務一定在chkconfig中可以看到)
- state # 指定需要執行的動作:
started # 啟動服務
reloaded # 平滑重啟
restarted # 重啟服務
stopped # 停止服務
running # 執行(啟動)服務
- enable # 設定服務是否開機自啟動:
yes # 服務開機自啟動
no # 服務開機不啟動
```
# 8、Cron模組
cron模組作用:為受控端`新增定時任務`
x x x x x /bin/sh /server/scripts/test.sh >/dev/null 2>&1
將系統命令列的定時任務變成ansilbe的語法
傳統的寫法
```bash
"minute=0 hour=0 daay=* month=* weekday=* job='/bin/sh /server/scripts/test.sh >/dev/null 2>&1'"
```
ansible的寫法(* 號是可以省略的)
```bash
ansible 10.4.7.7 -m cron -a "minute=0 hour=0 job='/bin/sh /server/scripts/test.sh >/dev/null 2>&1'"
```
定時任務示例
```bash
// 新增一條定時任務
[root@m01 ~]# ansible 10.4.7.7 -m cron -a "minute=0 hour=0 job='/bin/sh /server/scripts/test.sh >/dev/null 2>&1'"
// 設定定時任務註釋資訊,防止重複設定
[root@m01 ~]# ansible 10.4.7.7 -m cron -a "name='cron01' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh >/dev/null 2>&1'"
// 刪除指定的name
[root@m01 ~]# ansible 10.4.7.7 -m cron -a "name='cron01' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh >/dev/null 2>&1' state=absent"
// 也可以直接指定定時任務項的名稱,進行定時任務的刪除
[root@m01 ~]# ansible 10.4.7.7 -m cron -a "name='cron02' state=absent"
// 使用 disabled 引數來註釋定時任務
[root@m01 ~]# ansible 10.4.7.7 -m cron -a "name='cron01' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh >/dev/null 2>&1' disabled=yes"
// 取消註釋
[root@m01 ~]# ansible 10.4.7.7 -m cron -a "name='cron01' minute=0 hour=0 job='/bin/sh /server/scripts/test.sh >/dev/null 2>&1' disabled=no"
```
**模組引數**
```bash
- name # 為新的定時任務條目設定名稱(防止定時任務項的重複)
- state # 需要指定的動作:
absent # 新增定時任務
preset # 刪除定時任務
- disabled # 是否禁用定時任務(是否註釋):
yes # 禁用定時任務項(註釋掉)
no # 開啟定時任務項(取消註釋)
# 該引數需要和job一起使用
- minute # 分鐘 0-59
- hour # 小時 0-23
- day # 天數 1-31
- month # 月份 1-12
- weekday # 周 0-6
```
# 9、Group模組
group模組作用:可以為遠端`建立使用者組`
```bash
// 建立組,組名為demo,組id為1012
[root@m01 ~]# ansible 10.4.7.7 -m group -a "name=demo gid=1012"
```
**模組引數**
```bash
- name # 必須引數,指定建立的組名
- gid # 指定使用者的gid
- state
absent # 移除遠端主機的組
present # 建立遠端主機的組(預設)
```
# 10、User模組
user模組作用:可以為遠端進行`建立使用者`、`修改使用者`、`刪除使用者`等
```bash
// 建立使用者名稱test,uid為999,組為test,shell為/sbin/nologin,並且不建立家目錄
[root@m01 ~]# ansible 10.4.7.7 -m user -a "name=test uid=1010 shell=/sbin/nologin createhome=no"
// 建立普通使用者alx,並配置對應的使用者密碼(-1 使用MD5加密)
[root@m01 /]# echo '123456' | openssl passwd -1 -stdin
$1$yGnjv/n3$J.tO.qSIyLy5q547tSisz/
[root@m01 /]# ansible 10.4.7.7 -m user -a 'name=alx password="$1$yGnjv/n3$J.tO.qSIyLy5q547tSisz/"'
```
**模組引數**
```bash
- name # 必須引數,指定使用者名稱
- group # 指定使用者組名稱
- groups # 指定附加組名稱,多個組之間用逗號","分隔
- shell # 指定使用者登入的shell
- uid # 指定使用者的uid
- comment # 指定使用者的註釋資訊
- password # 給使用者新增密碼
- state # 指定使用者是否存在於受控主機中:
preset # 建立使用者(預設)
absent # 刪除使用者
- createhome # 是否建立家目錄:
yes # 建立家目錄(預設)
no # 不建立家目錄
- home # 指定家目錄,需要和createhome互相配合使用
```
>密碼設定:必須要將預先設定的密碼做openssl加密處理後輸出的一串數值,然後還數值就作為新建立使用者的密碼,如果新增的是明文密碼的話是無效的。
# 11、Mount模組
mount模組作用:可以將`掛載引數寫入到/etc/fastb檔案`中
```bash
// 僅將掛載的配置寫入到/etc/fastb,並不會執行掛載
[root@m01 ~]# ansible sa -m mount -a "src=172.16.1.31:/data path=/tmp fstype=nfs opts=defaults state=present"
// 臨時掛載裝置,並將掛載的配置寫入到/etc/fastb
[root@m01 ~]# ansible sa -m mount -a "src=172.16.1.31:/data path=/tmp fstype=nfs opts=defaults state=mounted"
// 臨時解除安裝,不會清理/etc/fstab
[root@m01 ~]# ansible sa -m mount -a "src=172.16.1.31:/data path=/tmp fstype=nfs opts=defaults state=unmounted"
// 解除安裝,不僅臨時解除安裝,同時會清理/etc/fstab
[root@m01 ~]# ansible sa -m mount -a "src=172.16.1.31:/data path=/tmp fstype=nfs opts=defaults state=absent"
```
**模組引數**
```bash
- present # 開機掛載,不會執行掛載指令,僅將掛載的配置寫入到/etc/fastb
- mounted # 掛載裝置,並將掛載的配置寫入到/etc/fastb
- unmounted # 解除安裝裝置,不會清除/etc/fastb寫入的配置
- absent #解除安裝裝置,會清理/etc/fastb寫入的配置
```
>注意:path 所指定的掛載目錄不需要手動建立,當執行掛載命令的時候,會自動的建立並掛載
# 12、Unarchive模組
Unarchive模組作用:解壓縮
該模組有兩種用法:
* 將ansible主機上的壓縮包在本地解壓縮後傳到遠端主機上,這種情況下,copy=yes. 本地解壓縮,解壓縮位置不是預設的目錄,沒找到或傳完刪了 後傳到遠端主機
* 將遠端主機上的某個壓縮包解壓縮到指定路徑下。這種情況下,需要設定copy=no 遠端主機上面的操作,不涉及ansible服務端
```bash
// 將本地的壓縮檔案解壓後傳到遠端主機
[root@m01 ~]# ansible 10.4.7.7 -m unarchive -a "src=/opt/src/apache-tomcat-8.5.53.tar.gz dest=/opt copy=yes mode=0755"
// 將遠端主機的壓縮檔案解壓
[root@m01 ~]# ansible 10.4.7.7 -m unarchive -a "src=/opt/src/apache-tomcat-8.5.53.tar.gz dest=/opt copy=no mode=0755"
```
**模組引數**
```bash
- src # 源壓縮包路徑
- dest # 壓縮包解壓後存放路徑
- copy # yes:本地壓縮,no:遠端壓縮
yes
no
- mode # 解壓後的目錄/檔案許可權
```
# 13、Git模組
Git模組作用:管理git倉庫的git checkout以部署檔案或軟體。
```bash
// 拉取git倉庫commit id 為78d5d96的程式碼到指定目錄
[root@m01 ~]# ansible 10.4.7.7 -m git -a "repo=https://gitee.com/jasonminghao/dubbo-demo-service.git dest=/data/git_repo/dubbo-demo-service version=78d5d96 accept_hostkey=yes"
```
**模組引數**
```bash
- repo # git倉庫地址(https/ssh)
- dest # 將程式碼克隆到指定路徑
- version # 克隆指定版本分支/commit id
- accept_hostkey # 類似於-o StrictHostKeyChecking=no
yes
no
```
# 14、Systemd模組
systemd模組作用:如果使用systemctl 管理程式的話,可以使用systemd模組,systemctl 可以控制程式,reload,start,status,restart等
```bash
// 拉取git倉庫commit id 為78d5d96的程式碼到指定目錄
[root@m01 ~]# ansible 10.4.7.7 -m systemd -a "name=nfs state=started enabled=yes daemon_reload=true"
```
**模組引數**
```bash
- name # 需要管理的服務名稱
- state # 執行動作
reloaded # 平滑重啟
restarted # 重啟
started # 啟動
stopped # 停止
- enabled # 是否開機啟動
- daemon_reload # 在執行任何其他操作之前執行daemon-reload,以確保systemd已經讀取了任何更改。
yes