1.模塊介紹
明確一點:模塊的執行就類似是linux命令的一條命令,就單單的是為了執行一條語句,不是批量的操作,批量操作需要用到playbook內類似shell編寫腳本進行批量。
1.1 模塊的使用方法
查看ansible支持的所有模塊:ansible-doc -l 然后在 ansible-doc -l | grep [ module_name ] 找到想用的模塊名字 ;再使用ansible-doc -s [module_name]來查看此模塊的用法,也可以使用ansible-doc help module來查看該模塊更詳細的信息。下面給出
官方模塊列表和說明:https://docs.ansible.com/ansible/latest/modules_by_category.html
1.2 模塊注意事項
關於模塊的使用方法,需要注意的是"state"。很多模塊都會有該選項,且其值幾乎都包含有"present"和"absent",表示肯定和否定的意思,
另ansible的多數的模塊都是具有冪等性的,只有極少數模塊如shell和command模塊不具備冪等性。所謂的冪等性是指多次執行同一個操作不會影響最終結果,ansible具有冪等性的模塊在執行時,都會自動判斷是否要執行。
例如: file模塊創建目錄時,如果創建過的目錄已經創建過了,則再次或多次執行安裝操作都不會真正的執行下去。
再例如:copy模塊拷貝文件時,如果目標主機上已經有了完全相同的文件,則多次執行copy模塊不會真正的拷貝。
2.常用模塊
2.1 setup和ping 模塊
功能:收集遠端主機的系統信息,如網絡,硬件,等
setup:
1 ansible-doc -s setup 2 - name: Gathers facts about remote hosts 3 setup: 4 gather_timeout #設置收集的主機信息默認超時時間(秒)
ping:用於ping 測主機是否連通
1 ansible-doc -s ping 2 - name: Try to connect to host, verify a usable python and return `pong' on success 3 ping:
使用方法:
1 [root@log1 ~]# ansible all -m ping -o 2 192.168.188.136 | SUCCESS => {"changed": false, "ping": "pong"}
2.2 command 和shell 模塊
默認的ansible使用的摸塊是command,用法是一樣的,好多場景的是shell模塊他們兩個很像,但是shell要比command強大
1 ansible-doc -s command 2 - name: Executes a command on a remote node 3 command: 4 chdir: #在執行命令之前,先切換到指定的目錄 5 creates: #判斷該命令是否執行,如果指定的文件存在(支持通配符)命令不執行 6 removes: #判斷該命令是否執行,如果指定的文件不存在(支持通配符)命令不執行 7 executable: #切換shell來執行指令,該執行路徑必須是一個絕對路徑
注意:
(1)使用Command模塊執行腳本時,要注意規范,shebang機制,否則將執行失敗
(2)不支持管道“|”,變量“$”,“&”,以及重定向,需使用shell模塊替代
(3)在使用這2個模塊的時候,因為他們沒有冪等性,多次執行會導致重復執行一條語句,但是有特殊場景是不可以這樣做的例如:mysql初始化的時候,執行一次就可以的了,多次執行會導致不必要的麻煩,這里就需要使用模塊的creates和removes選項進行判斷,但無論如何,在執行這兩個模塊的時候都需要考慮要執行的命令是否應該實現冪等性。
2.3 Hostname模塊
功能:
1 ansible-doc -s hostname 2 - name: Manage hostname 3 hostname: 4 name: # 修改后的主機名名稱
使用方法:
1 ansible all -m hostname -a “name=webserver1”
注意:
(1)Host模塊不會修改/etc/hosts文件中的主機名解析,注意修改
(2)批量修改主機名時最好加變量,防止所有主機名一致
2.4 copy復制模塊
功能:復制文件到遠端主機
1 ansible-doc -s copy 2 - name: Copies files to remote locations 3 copy 4 owner: #設置文件的所有者 5 mode: #設置遠程文件的權限。使用數值表示時不能省略第一位,如0644。# 也可以使用'u+rwx'或'u=rw,g=r,o=r'等方式設置。 6 backup=[yes|no] #在覆蓋之前將原文件備份,備份文件包含時間信息。有兩個選項:yes|no,默認為no 7 content: #用於替代"src",可以直接設定指定文件的值 8 dest: #必選項。要將源文件復制到的遠程主機的絕對路徑,如果源文件是一個目錄,那么該路徑也必須是個目錄 9 directory_mode: #遞歸的設定目錄的權限,默認為系統默認權限 10 force=[yes|no] #如果目標主機包含該文件,但內容不同,如果設置為yes,則強制覆蓋,如果為no,則只有當目標主機的目標位置不存在該文件時,才復制。默認為yes 11 others: #所有的file模塊里的選項都可以在這里使用 12 src: #要復制到遠程主機的文件在本地的地址,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,它將遞歸復制。
在這種情況下,如果路徑使用"/"來結尾,則只復制目錄里的內容,
如果沒有使用"/"來結尾,則包含目錄在內的整個內容全部復制,類似於rsync。
使用方法:
將本地的host.sh 復制到遠端的/tmp 目錄下,如果文件存在就優先備份。
1 [root@log1 ~]# ansible all -m copy -a "src=/root/host.sh dest=/tmp/ backup=yes" 2 192.168.188.136 | SUCCESS => { 3 "changed": true, 4 "checksum": "4080c03edf24ad1ca3a9e83c54a363236df4432b", 5 "dest": "/tmp/host.sh", 6 "gid": 0, 7 "group": "root", 8 "md5sum": "6c65510d520b68b9ef4d5f76552e8a98", 9 "mode": "0644", 10 "owner": "root", 11 "size": 21, 12 "src": "/root/.ansible/tmp/ansible-tmp-1568616290.57-158008154450274/source", 13 "state": "file", 14 "uid": 0 15 }
驗證遠端文件是否復制成功:
1 [root@log1 ~]# ansible all -m shell -a "ls /tmp" 2 192.168.188.136 | SUCCESS | rc=0 >> 3 host.sh ===>復制過來的文件
content 簡單生成文件內容:
1 [root@log1 ~]# ansible all -m copy -a "content='test content\n' dest=/tmp/test_content.txt " 2 192.168.188.136 | SUCCESS => { 3 "changed": true, 4 "checksum": "4fe2b8dd12cd9cd6a413ea960cd8c09c25f19527", 5 "dest": "/tmp/test_content.txt", 6 "gid": 0, 7 "group": "root", 8 "md5sum": "d6eb32081c822ed572b70567826d9d9d", 9 "mode": "0644", 10 "owner": "root", 11 "size": 13, 12 "src": "/root/.ansible/tmp/ansible-tmp-1568617451.79-5160211289281/source", 13 "state": "file", 14 "uid": 0 15 } 16 17 驗證文件內容: 18 [root@log1 ~]# ansible all -m shell -a "cat /tmp/test_content.txt " 19 192.168.188.136 | SUCCESS | rc=0 >> 20 test content ===>生成的文件內容
2.5 File文件模塊
功能:創建目錄,管理目錄和文件屬性。
1 ansible-doc -s file 2 - name: Sets attributes of files 3 file: 4 force=[yes|no]#需要在兩種情況下強制創建軟鏈接,一種是源文件不存在但之后會建立的情況下;另一種是目標軟鏈接已存在,需要先取消之前的軟鏈,然后創建新的軟鏈, 5 group: #定義文件/目錄的屬組 6 mode: #定義文件/目錄的權限 7 owner: #定義文件/目錄的屬主 8 path: #必選項,定義文件/目錄的路徑 9 name: #定義文件/目錄的路徑 (不用path的時候) 10 recurse: #遞歸的設置文件的屬性,只對目錄有效 11 src: #要被鏈接的源文件的路徑,只應用於state=link的情況 12 dest: #被鏈接到的路徑,只應用於state=link的情況 13 state: 14 directory: #如果目錄不存在,創建目錄 15 file: #即使文件不存在,也不會被創建 16 link: #創建軟鏈接 17 hard: #創建硬鏈接 18 touch: #如果文件不存在,則會創建一個新的文件,如果文件或目錄已存在,則更新其最后修改時間 19 absent: #刪除目錄、文件或者取消鏈接文件
注意:
file模塊可以遞歸創建目錄,但是不能在不存在的目錄中創建文件,只能先創建目錄,再在此目錄中創建文件。
使用方法:
1 創建新目錄: 2 ansible all -m file -a 'name=/data state=directory' 3 創建新文件: 4 ansible all -m file -a 'name=/data/f3 state=touch' 5 刪除文件: 6 ansible all -m file -a 'name=/data/f3 state=absent' 7 刪除目錄下的所有文件:(建議使用shell好用) 8 ansible all -m shell -a 'rm -rf /data/*' 9 創建目錄: 10 ansible all -m file -a 'name=/data/dir1 state=directory' 11 刪除目錄: 12 ansible all -m file -a 'name=/data/dir1 state=absent' 13 創建軟連接 14 ansible all -m file -a 'src=/etc/fstab dest=/data/fstab.link state=link' 15 ansible all -m file -a 'dest=/data/fstab.link state=absent' 16 創建文件指定所有者,權限: 17 ansible all -m file -a 'path=/root/a.sh owner=liych mode=755' 18 ansible all -m file -a 'src=/data/testfile dest=/data/testfile-link state=link'
2.6 Fetch 拉取文件模塊
功能:拉取遠端文件到本地控制端,和cop工作模式相反。
1 ansible-doc -s fetch 2 - name: Fetches a file from remote nodes 3 action: fetch 4 dest= # 本地存儲拉取文件的目錄。例如dest=/data,src=/var/log/messages 5 # 遠程主機名192.168.188.136,則保存的路徑為/data/192.168.188.136/var/log/messages 6 fail_on_missing=[yes|no] # 當設置為yes時,如果拉取的源文件不存在,則此任務失敗。在2.4以前是默認為no。2.4中默認為yes 7 8 flat=[yes|no] # 允許您重寫將主機名/路徑/文件/文件附加到目的地的默認行為。如果dest以“/”結尾,則將使用源文件的基名稱,類似於復制模塊。很明顯這很方便,如果文件名是唯一的。
# 顯然,應該考慮多個主機拉取時的文件覆蓋情況,不建議使用。 9 src= # 遠程主機上的源文件。只能是文件,不支持目錄。在未來的版本中可能會支持目錄遞歸拉取。 10 validate_checksum # 獲取文件后驗證源和目標校驗和是否匹配
使用方法:
默認拉取存的路徑。
[root@log1 data]# ansible all -m fetch -a "src=/root/checkport.py dest=/data" 192.168.188.136 | SUCCESS => { "changed": true, "checksum": "2507bb0864955618080ebb8123749d256733689d", "dest": "/data/192.168.188.136/root/checkport.py", "md5sum": "31408377a8a5acf9fa69ea1f8f973038", "remote_checksum": "2507bb0864955618080ebb8123749d256733689d", "remote_md5sum": null } 檢驗本地是否存在: [root@log1 root]# ll /data/192.168.188.136/root/checkport.py ===》默認存格式 -rw-r--r-- 1 root root 1925 9月 16 15:58 /data/192.168.188.136/root/checkport.py ===>已經存在
指定目錄存儲:
需要注意的dest=/tmp/ 需要/ 為結尾,否則會報錯。
指定目錄儲存: [root@log1 root]# ansible all -m fetch -a "src=/etc/fstab dest=/tmp/ flat=yes" 192.168.188.136 | SUCCESS => { "changed": true, "checksum": "7ea9f3eb5cc7823805111e1b08b5855718c473b5", "dest": "/tmp/fstab", "md5sum": "c1925b75df004697fc46f525a6f81656", "remote_checksum": "7ea9f3eb5cc7823805111e1b08b5855718c473b5", "remote_md5sum": null } [root@log1 root]# ll /tmp/fstab ===》指定目錄存儲 -rw-r--r-- 1 root root 609 9月 16 16:27 /tmp/fstab ===>已經拉取到文件
指定目錄存儲格式:
使用參數
調用inventory_hostname #host的主機
[root@log1 root]# ansible all -m fetch -a "src=/etc/fstab dest=/tmp/fstab-{{inventory_hostname}} flat=yes" 192.168.188.136 | SUCCESS => { "changed": true, "checksum": "7ea9f3eb5cc7823805111e1b08b5855718c473b5", "dest": "/tmp/fstab-192.168.188.136", "md5sum": "c1925b75df004697fc46f525a6f81656", "remote_checksum": "7ea9f3eb5cc7823805111e1b08b5855718c473b5", "remote_md5sum": null } [root@log1 root]# ll /tmp/fstab-192.168.188.136 ===》格式存儲 fstab-192.168.188.136
注意:拉取多個文件的時候,需要將多個遠端文件打包,之后再拉取。
2.7 yum 模塊
ansible-doc -s yum - name: Manages packages with the `yum' package manager yum: config_file: # yum的配置文件 disable_gpg_check: # 關閉gpg_check disable_gpg_check # 安裝包時禁止gpgcheck,僅在state=present或latest時生效。 disablerepo # 禁用指定的repoid,多個repoid使用逗號分隔。 enablerepo # 明確使用該repoid為源啟用 exclude # 排除哪些包不安裝,僅在state=present或latest時生效。 list # 類似於yum list name= # 指定安裝的包名,可帶上版本號.也可以傳遞一個url或者一個本地的rpm包的路徑 state # 狀態。('present'、'installed','latest')用於安裝包,('absent'、'removed')用於移除已安裝包。 update_cache # 強制更新yum的cache。
使用方法:
yum安裝vsftpd包:(默認state=installd) 列出和ansible相關的包。 ansible all -m yum -a "list=ansible" ansible all -m yum -a ‘name=nginx’ 安裝多個包用逗號隔開: ansible all -m yum -a ‘name=nginx,vsftpd’ 顯示所有已安裝的包: ansible all -m yum -a ‘name=vsftpd list=installd’ 卸載vsftpd包: ansible all -m yum -a ‘name=nvsftpd state=removed’ 安裝從互聯網下載的包: ansible all -m yum -a 'name=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm state=present' 安裝本地的包,且排除某些包不安裝。 ansible all -m yum -a "name=/tmp/*.rpm exclude=*unix* state=present" 更新緩存: ansible all -m yum -a ‘update_cache=yes’ 更新緩存同時安裝dstat包 ansible all -m yum -a ‘name=dstat update_cache=yes’
name=[Package name] 需要和state使用。狀態。('present'、'installed','latest')用於安裝包,('absent'、'removed')用於移除已安裝包。在命令介紹的時候就說過,state的狀態在很多模塊中都會用到,需要特別注意。
2.8 service模塊
功能:管理服務
ansible-doc -s service - name: Manage services. service: enabled=[yes|no] #是否開機啟動 默認no name: #必選項,服務名稱 pattern: #定義一個模式,如果通過status指令來查看服務的狀態時,沒有響應,就會通過ps指令在進程中根據該模式進行查找,如果匹配到,則認為該服務依然在運行 sleep: #如果執行了restarted,在則stop和start之間沉睡幾秒鍾 state: #對當前服務執行啟動,停止、重啟、重新加載等操作 #(started,stopped,restarted,reloaded)
使用方法:
停止httpd服務: ansible all -m service -a ‘name=httpd state=stopped’ 開啟httpd服務: ansible all -m service -a ‘name=httpd state=started’ 重新加載httod服務: ansible all -m service -a ‘name=httpd state=reloaded’ 重啟httpd服務: ansible all -m service -a ‘name=httpd state=restarted’ 開啟ftp服務,同時設置開機自動啟動: ansible all -m service -a ‘name=vsftpd state=started enabled=yes’ 重啟ftp服務: ansible all -m service -a ‘name=vsftpd state=restarted’
2.9 cron 定時任務
功能:設置管理定時任務。
ansible-doc -s cron - name: Manage cron.d and crontab entries. cron: backup=[yes|no] # 如果已設置,請在修改crontab之前創建它的備份。備份的位置由以下命令在“backup_file”變量中返回 cron_file # 自定義cron_file的文件名,使用相對路徑則在/etc/cron.d中。必須同時指定user選項,文件名部分僅由大寫和小寫字母、數字、下划線。 user # 修改其crontab的特定用戶。 minute # 分(0-59, *, */N),不寫時,默認為* hour # 時(0-23, *, */N),不寫時,默認為* day # 日(1-31, *, */N),不寫時,默認為* month # 月(1-12, *, */N),不寫時,默認為* weekday # 周(0-6 for Sunday-Saturday, *),不寫時,默認為* disabled # 禁用crontab中的某個job,要求state=present env # (yes/no)設置一個環境變量,將添加在crontab的頂端。使用name和value定義變量名和值 job # 需要執行的命令。如果設置了env,則表示環境變量的值,此時job="XXXX"等價於value="XXXX"。 # 要求state=present name # 定時任務的備注名。但如果設置的是env,則name為環境變量的名稱。要求state=absent # 注意,若未設置name,且state=present,則總會創建一個新job條目,而不管現有條目如何 special_time # 定時任務的別稱,用於定義何時運行job條目。 # 有效值有reboot/hourly/daily/weekly/monthly/yearly/annually。 state # job或者env的狀態是present(默認)還是absent。present用於創建,absent用於移除
使用方法:
1.1 計划任務存在默認crontal -l即可查看
創建計划任務:每周1,3,5,每分鍾打印warning,任務名稱:test ansible all -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/wall warning" name=test' 注釋禁用cronname=test的計划任務:也可以用yes/no ansible all -m cron -a 'disabled=true job="/usr/bin/wall warning" name=test' 給cronname=test的計划任務去掉注釋:也可以用yes/no ansible all -m cron -a 'disabled=false job="/usr/bin/wall warning" name=test' 刪除計划任務: ansible all -m cron -a 'job="/usr/bin/wall warning" name=test state=absent' 查看計划任務: ansible all -m shell -a 'crontab -l'
執行過程:
root@log1 ~]# ansible all -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/wall warning" name=test' -o 192.168.188.136 | SUCCESS => {"changed": true, "envs": [], "jobs": ["test"]} [root@log1 ~]# ansible all -m shell -a 'crontab -l' 192.168.188.136 | SUCCESS | rc=0 >> #Ansible: test * * * * 1,3,5 /usr/bin/wall warning [root@log1 ~]# ansible all -m cron -a 'disabled=true job="/usr/bin/wall warning" name=test' 192.168.188.136 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "test" ] } [root@log1 ~]# ansible all -m shell -a 'crontab -l' 192.168.188.136 | SUCCESS | rc=0 >> #Ansible: test #* * * * * /usr/bin/wall warning [root@log1 ~]# ansible all -m cron -a 'disabled=false job="/usr/bin/wall warning" name=test' 192.168.188.136 | SUCCESS => { "changed": true, "envs": [], "jobs": [ "test" ] } [root@log1 ~]# ansible all -m shell -a 'crontab -l' 192.168.188.136 | SUCCESS | rc=0 >> #Ansible: test * * * * * /usr/bin/wall warning [root@log1 ~]# ansible all -m cron -a 'job="/usr/bin/wall warning" name=test state=absent' 192.168.188.136 | SUCCESS => { "changed": true, "envs": [], "jobs": [] } [root@log1 ~]# ansible all -m shell -a 'crontab -l' 192.168.188.136 | SUCCESS | rc=0 >>
1.2 自定義的定時任務不能使用crontab-l查看
創建一個job,每5分鍾進行一次時間同步,並且自定義cron_file。 ansible all -m cron -a 'name="ntpdate_time" job="/usr/sbin/ntpdate ntp1.aliyun.com" cron_file=ntpdate_cron user=root minute=*/5' -o 移除一個job,要求name必須匹配,需要同時指定cron_file和user。 ansible all -m cron -a 'name="ntpdate_time" state=absent cron_file=ntpdate_cron user=root' -o #查看定時任務 ansible all -m shell -a 'cat /etc/cron.d/ntpdate_cron'
執行過程: [root@log1 ~]# ansible all -m cron -a 'name="ntpdate_time" job="/usr/sbin/ntpdate ntp1.aliyun.com" cron_file=ntpdate_cron user=root minute=*/5' -o 192.168.188.136 | SUCCESS => {"changed": true, "cron_file": "ntpdate_cron", "envs": [], "jobs": ["ntpdate_time"]} [root@log1 ~]# ansible all -m shell -a 'cat /etc/cron.d/ntpdate_cron' 192.168.188.136 | SUCCESS | rc=0 >> #Ansible: ntpdate_time */5 * * * * root /usr/sbin/ntpdate ntp1.aliyun.com [root@log1 ~]# ansible all -m cron -a 'name="ntpdate_time" state=absent cron_file=ntpdate_cron user=root' -o 192.168.188.136 | SUCCESS => {"changed": true, "cron_file": "ntpdate_cron", "envs": [], "jobs": []} [root@log1 ~]# ansible all -m shell -a 'cat /etc/cron.d/ntpdate_cron' 192.168.188.136 | SUCCESS | rc=0 >>