Ansible——模組

不太聪明的大鹅發表於2024-03-08

Ansible介紹

Ansible是一個同時管理多個遠端主機的軟體(任何可以透過SSH協議登入的機器),因此Ansible可以管理遠端虛擬機器、物理機,也可以是本地主機(linux、windows)。

Ansible透過SSH協議實現管理節點、遠端節點的通訊。

只要是能夠SSH登入的主機完成的操作,都可以通Ansible自動化操作,比如批次複製、批次刪除、批次修改、批次檢視、批次安裝、重啟、更新等。

Anisble架構

Ansible命令語法

ansible批次管理命令主要涉及6部分

ansible主命令
指定ansible管理的主機資訊,可以是主機組名、主機ip地址、或是all
呼叫ansible的模組引數 -m
指定用哪一個功能模組,模組的名字,如shell模組
呼叫對應模組的功能引數,-a
執行對應模組中的哪些功能,如hostname

ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批次系統配置、批次程式部署、批次執行命令等功能。

Options:
  -a MODULE_ARGS, --args=MODULE_ARGS    
             #module arguments
             #指定執行模組使用的引數  
  --ask-vault-pass      
             #ask for vault password
             #加密playbook檔案時提示輸入密碼
  -B SECONDS, --background=SECONDS
             #run asynchronously, failing after X seconds(default=N/A)
             #後臺執行超時時間,非同步執行,X秒之後失敗
  -C, --check           
             #don't make any changes; instead, try to predict some of the changes that may occur
             #模擬執行,不會真正在機器上執行(檢視執行會產生什麼變化)
  -D, --diff            
             #when changing (small) files and templates, show the differences in those files; works great with --check
             #當更新的檔案數及內容較少時,該選項可顯示這些檔案不同的地方,該選項結合-C用會有較好的效果
  -e EXTRA_VARS, --extra-vars=EXTRA_VARS
             #set additional variables as key=value or YAML/JSON
             #執行命令時新增額外引數變數
  -f FORKS, --forks=FORKS
             #specify number of parallel processes to use(default=5)
             #並行任務數。FORKS被指定為一個整數,預設是5
  -h, --help            
             #show this help message and exit
             #開啟幫助文件API
  -i INVENTORY, --inventory-file=INVENTORY
             #specify inventory host path(default=/etc/ansible/hosts) or comma separated host list.
             #指定要讀取的Inventory檔案
  -l SUBSET, --limit=SUBSET
             #further limit selected hosts to an additional pattern
             #限定執行的主機範圍
  --list-hosts          
             #outputs a list of matching hosts; does not execute anything else
             #列出執行匹配到的主機,但並不會執行
  -m MODULE_NAME, --module-name=MODULE_NAME
             #module name to execute (default=command)
             #指定執行使用的模組,預設使用 command 模組
  -M MODULE_PATH, --module-path=MODULE_PATH
             #specify path(s) to module library (default=None)
             #要執行的模組的路徑
  --new-vault-password-file=NEW_VAULT_PASSWORD_FILE
             #new vault password file for rekey
             #    
  -o, --one-line        
             #condense output
             #壓縮輸出,摘要輸出.嘗試一切都在一行上輸出
  --output=OUTPUT_FILE  
             #output file name for encrypt or decrypt; use - for stdout
             #
  -P POLL_INTERVAL, --poll=POLL_INTERVAL
             #set the poll interval if using -B (default=15)
             #設定輪詢間隔,每隔數秒。需要- B
  --syntax-check        
             #perform a syntax check on the playbook, but do not execute it
             #檢查Playbook中的語法書寫
  -t TREE, --tree=TREE  
             #log output to this directory
             #將日誌內容儲存在該輸出目錄,結果儲存在一個檔案中在每臺主機上
  --vault-password-file=VAULT_PASSWORD_FILE
             #vault password file
             #
  -v, --verbose         
             #verbose mode (-vvv for more, -vvvv to enable connection debugging)
             #執行詳細輸出
  --version             
             #show program's version number and exit
             #顯示版本


  Connection Options:
    control as whom and how to connect to hosts


    -k, --ask-pass      
             #ask for connection password
             #
    --private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE
             #use this file to authenticate the connection
             #
    -u REMOTE_USER, --user=REMOTE_USER
             #connect as this user (default=None)
             #指定遠端主機以USERNAME執行命令
    -c CONNECTION, --connection=CONNECTION
             #connection type to use (default=smart)
             #指定連線方式,可用選項paramiko (SSH)、ssh、local,local方式常用於crontab和kickstarts
    -T TIMEOUT, --timeout=TIMEOUT
             #override the connection timeout in seconds(default=10)
             #SSH連線超時時間設定,預設10s
    --ssh-common-args=SSH_COMMON_ARGS
             #specify common arguments to pass to sftp/scp/ssh (e.g.ProxyCommand)
             #
    --sftp-extra-args=SFTP_EXTRA_ARGS
             #specify extra arguments to pass to sftp only (e.g. -f, -l)
             #
    --scp-extra-args=SCP_EXTRA_ARGS
             #specify extra arguments to pass to scp only (e.g. -l)
             #
    --ssh-extra-args=SSH_EXTRA_ARGS
             #specify extra arguments to pass to ssh only (e.g. -R)
             #


  Privilege Escalation Options:
    control how and which user you become as on target hosts


    -s, --sudo          
             #run operations with sudo (nopasswd) (deprecated, use become)
             #相當於Linux系統下的sudo命令
    -U SUDO_USER, --sudo-user=SUDO_USER
             #desired sudo user (default=root) (deprecated, use become)
             #使用sudo,相當於Linux下的sudo命令
    -S, --su            
             #run operations with su (deprecated, use become)
             #
    -R SU_USER, --su-user=SU_USER
             #run operations with su as this user (default=root) (deprecated, use become)
             #
   -b, --become        
             #run operations with become (does not imply password prompting)
             #
    --become-method=BECOME_METHOD
             #privilege escalation method to use (default=sudo),valid choices: [ sudo | su | pbrun | pfexec | doas |dzdo | ksu | runas ]
             #
    --become-user=BECOME_USER
             #run operations as this user (default=root)
             #
    --ask-sudo-pass     
             #ask for sudo password (deprecated, use become)
             #
    --ask-su-pass       
             #ask for su password (deprecated, use become)
             #
    -K, --ask-become-pass
             #ask for privilege escalation password
             #

ansible安裝部署

master-61管理機安裝

yum install epel-release ansible libselinux-python -y  前提是配置好了阿里雲的epel源

版本檢視

ansible --version

主機清單配置檔案

vim /etc/ansible/hosts
[web]
172.16.1.7
172.16.1.8
[nfs]
172.16.1.31

ansible主機登入認證

兩種方式:
傳統的密碼認證
金鑰管理
ansible基於公私鑰認證
1.將master61機器的公鑰,分發給想免密登入的機器
2.後續在對該機器操作,就直接進行ssh的公鑰認證了,可以免密碼,直接遠端執行

[root@master-61 ~]#ansible web -m ping
172.16.1.8 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

基於密碼認證
在你的客戶端機器、修改了ssh預設埠、以及密碼需要修改主機清單檔案才可以正確連線。
注意你得配置允許密碼登入才能進行如下測試,可以再開一個web-9機器。
ansible主機清單配置檔案語法(重要)

如給rsync機器,進行密碼認證

[root@master-61 ~]#tail -2 /etc/ansible/hosts 
[backup]   可以寫成主機名
172.16.1.41 ansible_port=22999 ansible_user=root ansible_password=123123  

修改被管理機的埠

vim /etc/ssh/sshd_config 將Port 22 改為 22999
測試執行

[root@master-61 ~]#ansible backup -m ping
172.16.1.41 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

新增web機器組的資訊

[root@master-61 ~]#tail /etc/ansible/hosts 

[web]
172.16.1.7 ansible_port=22999 ansible_user=root ansible_password=123123
172.16.1.8 ansible_port=22999 ansible_user=root ansible_password=123123

[nfs]
172.16.1.31

[backup]
172.16.1.41 ansible_ssh_port=22999 ansible_ssh_user=root ansible_ssh_pass=123123

測試執行

ansible web -m ping

同一組連續的ip

[web]
172.16.1.[7:9]

公共變數
當主機清單裡,很多主機組,有相同的變數屬性,可以寫成公共變數 這部分配置是針對web主機組,抽象的變數

[web:vars]
ansible_ssh_port=22999
ansible_ssh_user=root
ansible_ssh_pass=123123
[web]
172.16.1.[7:9]
[nfs]
172.16.1.31 ansible_ssh_port=22999 
[backup]
172.16.1.41 ansible_ssh_port=22999 ansible_ssh_user=root ansible_ssh_pass=123123

測試

ansible web -m ping

所有主機都生效的變數(最終版)
指定主機組名all,即可針對所有主機生效,前提是,你要確保這個資訊是所有主機通用的。

[all:vars]
ansible_port=22999
#ansible_user=root
#ansible_password=123123

[web]
172.16.1.7
172.16.1.8
172.16.1.9

[nfs]
172.16.1.31

[backup]
172.16.1.41

ansible命令執行方式

利用ansible命令實現批次管理(ad-hoc)模式
利用ansible劇本實現批次管理(playbook)模式
ad-hoc模式
該模式通常用來臨時處理一些任務。例如

臨時批次檢視所有被管控機器的記憶體、負載、磁碟
臨時批次分發某個特定檔案

Playbook模式
定製化的批次執行任務,例如

一鍵安裝Rsync
一鍵搭建LNMP叢集等
ansible-doc命令
列出ansible所有支援的模組,這就是ansible這個萬能工具箱所有的零件了。

[root@master-61 ~]#ansible-doc -l |grep ^ping
ping                                                          Try to connect to host, verify a usable python and re...
pingdom                                                       Pause/unpause Pingdom alerts   


[root@master-61 ~]#ansible-doc -l |grep ^shell
shell  


當前ansible支援3387個模組
[root@master-61 ~]#ansible-doc -l |wc -l
3387

檢視某個模組的具體用法

[root@master-61 ~]#ansible-doc -s shell

[root@master-61 ~]#ansible-doc -s ping

ansible執行命令結果(狀態顏色)

綠色:命令以使用者期望的執行了,但是狀態沒有發生改變;

黃色:命令以使用者期望的執行了,並且狀態發生了改變;

紫色:警告資訊,說明ansible提示你有更合適的用法;

紅色:命令錯誤,執行失敗;

藍色: 詳細的執行過程;

官網文件

https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html#plugins-in-ansible-builtin

1 ping測試連通性

命令語法
ansible 主機組 -m 模組名 [模組引數]
檢視模組解釋

[root@master-61 ~]#ansible-doc -s ping
- name: Try to connect to host, verify a usable python and return `pong' on success
  ping:
      data:                  # Data to return for the `ping' return value. If this parameter is set to `crash', the
                               module will cause an exception.
[root@master-61 ~]#

執行

[root@master-61 ~]#ansible web -m ping
172.16.1.8 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

2 command 簡單命令模組

語法

[root@master-61 ~]#ansible-doc -s command

ansible 主機組 -m command -a "需要批次執行的命令"

command模組是ansible命令基本模組

使用command模組執行遠端命令,命令不得用變數($HOME)
不得出現特殊符號< 、>、|、;、&,否則無法識別,需要則使用shell模組實現
也就是無法使用複雜的linux命令

遠端檢視主機名

ansible web -m command -a hostname
172.16.1.7 | CHANGED | rc=0 >>
web-7

簡寫,command是ansible的基礎模組,預設就是-m command

ansible web -a hostname

關閉告警資訊

[root@master-61 ~]#ansible web -m command -a "touch /opt/超哥帶你學linux.log warn=False"

使用command提供的專有命令

Command練習
備份/var/log日誌目錄

[root@master-61 ~]#ansible backup -m command -a "tar -zcf /opt/log.tgz var/log chdir=/"

在/opt下建立chaoge666.log

[root@master-61 ~]#ansible backup -m command -a "touch chaoge666.log chdir=/opt"

備份/etc所有配置檔案到 /backup_config/etc.tgz 。練習removes命令

1.這裡就得提前考慮 /backup_config資料夾是否存在,必須先有資料夾,才能執行該備份命令


2.判斷如果該資料夾不存在,則不執行備份
[root@master-61 ~]#ansible backup -m command -a 'tar -zcf /backup_config/etc.tgz removes=/backup_config'
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /backup_config does not exist


3.你必須先建立該資料夾
[root@master-61 ~]#ansible backup -m command -a 'mkdir /backup_config'

4.再次執行該命令
[root@master-61 ~]#ansible backup -m command -a 'tar -zcf /backup_config/etc.tgz /etc removes=/backup_config'

測試creates命令,如果目標目錄已經存在了,就別建立該目錄了

[root@master-61 ~]#ansible backup -m command -a 'mkdir /opt creates=/opt'
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /opt exists

執行命令,且忽略警告,要求你已經確認該命令是無誤的

[root@master-61 ~]#ansible backup -m command -a 'touch /home/於超老師帶你學ansible.log warn=False'
172.16.1.41 | CHANGED | rc=0 >>

3 shell模組(萬能模組)

shell模組功能:在遠端節點上執行命令(複雜的命令)

Shell練習
遠端過濾ssh程序資訊

[root@master-61 ~]#
[root@master-61 ~]#ansible backup -m shell -a 'ps -ef|grep ssh'
172.16.1.41 | CHANGED | rc=0 >>
root       2088      1  0 16:34 ?        00:00:00 sshd: root@pts/0
root       2128      1  0 16:37 ?        00:00:00 /usr/sbin/sshd -D
root       3951   2128  0 19:36 ?        00:00:00 sshd: root@pts/1
root       5907   2128  0 19:57 ?        00:00:00 sshd: root@pts/2
root       6099   6098  0 19:58 pts/2    00:00:00 /bin/sh -c ps -ef|grep ssh
root       6101   6099  0 19:58 pts/2    00:00:00 /bin/sh -c ps -ef|grep ssh

使用重定向符號,建立檔案

[root@master-61 ~]#ansible backup -m shell -a "echo 超哥帶你學ansible >> /tmp/t1.log"
172.16.1.41 | CHANGED | rc=0 >>

[root@master-61 ~]#ansible backup -m shell -a "echo 超哥帶你學ansible >> /tmp/t1.log"
172.16.1.41 | CHANGED | rc=0 >>

[root@master-61 ~]#ansible backup -m shell -a "cat /tmp/t1.log"
172.16.1.41 | CHANGED | rc=0 >>
超哥帶你學ansible
超哥帶你學ansible

遠端執行復雜linux命令
這個命令就無法在command中執行

透過一條命令,做如下事情

建立資料夾
生成sh指令碼檔案
賦予指令碼可執行許可權
執行指令碼
忽略warning資訊

[root@master-61 ~]#ansible backup -m shell -a "mkdir -p /server/scripts/;echo 'hostname' > /server/scripts/hostname.sh;chmod +x /server/scripts/hostname.sh;/usr/bin/bash /server/scripts/hostname.sh"

[WARNING]: Consider using the file module with state=directory rather than running 'mkdir'.  If you need to use command
because file is insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in
ansible.cfg to get rid of this message.
172.16.1.41 | CHANGED | rc=0 >>
rsync-41

4 copy複製檔案

copy模組是遠端推送資料模組,只能把資料推送給遠端主機節點,無法拉取資料到本地。

既然是檔案複製,可用引數也就是圍繞檔案屬性。

語法

ansible 主機組 -m copy -a "引數"

copy練習
簡單傳送檔案

[root@master-61 ~]#ansible backup -m copy -a 'src=/tmp/chaoge.log dest=/opt/'

[root@master-61 ~]#ansible backup -m shell -a 'ls /opt'
172.16.1.41 | CHANGED | rc=0 >>
chaoge.log

傳送檔案且指定檔案屬性
許可權改為600、修改為www使用者(要求目標機器存在該使用者)

建立www使用者
[root@master-61 ~]#ansible backup -m shell -a "useradd www"

遠端複製檔案,修改許可權
[root@master-61 ~]#ansible backup -m copy -a "src=/opt/master61.log  dest=/tmp/ owner=www group=www mode=600"

遠端檢查檔案資訊
[root@master-61 ~]#ansible backup -m shell -a "ls -l /tmp/master61.log"

傳送檔案且先做好備份
使用backup引數,防止覆蓋遠端檔案,丟失備份,提前備份該目標機器的資料

1.檢查目標機器的檔案
[root@master-61 ~]#ansible backup -m shell -a "cat /opt/master61.log"
172.16.1.41 | CHANGED | rc=0 >>
超哥牛比


2.遠端複製檔案,且做好備份
[root@master-61 ~]#ansible backup -m copy -a "src=/opt/master61.log  dest=/opt/ owner=www group=www mode=600 backup=yes"
172.16.1.41 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "backup_file": "/opt/master61.log.14596.2022-04-25@15:49:21~", 
    "changed": true, 
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "dest": "/opt/master61.log", 
    "gid": 1889, 
    "group": "www", 
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e", 
    "mode": "0600", 
    "owner": "www", 
    "size": 0, 
    "src": "/root/.ansible/tmp/ansible-tmp-1650872960.6-29130-227131703855286/source", 
    "state": "file", 
    "uid": 1889
}

3.發現ansible幫你做好了備份
[root@master-61 ~]#ansible backup -m shell -a "ls /opt -l"
172.16.1.41 | CHANGED | rc=0 >>
total 4
-rw------- 1 www  www   0 Apr 25 15:49 master61.log
-rw-r--r-- 1 root root 13 Apr 25 15:47 master61.log.14596.2022-04-25@15:49:21~

指定資料寫入到遠端檔案中
向rsyncd.conf中填入賬號密碼,覆蓋其原有的檔案內容

[root@master-61 ~]#ansible backup -m copy -a "content='rsync_backup:yuchao666' dest=/etc/rsync.passwd mode=600" 

[root@master-61 ~]#ansible backup -m shell -a "cat /etc/rsync.passwd"
172.16.1.41 | CHANGED | rc=0 >>
rsync_backup:yuchao666

注意像這樣的覆蓋操作,還是新增備份引數更合適

[root@master-61 ~]#ansible backup -m copy -a "content='rsync_backup:chaoge666' dest=/etc/rsync.passwd mode=600 backup=yes" 

[root@master-61 ~]#ansible backup -m shell -a 'ls /etc/rsync*'

複製資料夾,注意結尾斜槓

[root@master-61 ~]#mkdir /opt/yuchao/666/sixsixsix -p


遠端複製/opt/yuchao/下的所有內容
[root@master-61 ~]#ansible backup -m copy -a  "src=/opt/yuchao/ dest=/opt/"


遠端複製/opt/yuchao整個目錄到目標機器
[root@master-61 ~]#ansible backup -m copy -a  "src=/opt/yuchao dest=/opt/"

5 file檔案操作模組

file模組作用是建立、以及設定檔案目錄屬性。

file模組可以幫助我們完成一些對檔案的基本操作,比如,建立檔案或目錄、刪除檔案或目錄、修改檔案許可權等



此處我們介紹一些file模組的常用引數,然後再給出對應示例。

path引數 :必須引數,用於指定要操作的檔案或目錄,在之前版本的ansible中,使用dest引數或者name引數指定要操作的檔案或目錄,為了相容之前的版本,使用dest或name也可以。

state引數 :此引數非常靈活,此引數對應的值需要根據情況設定,比如,當我們需要在遠端主機中建立一個目錄的時候,我們需要使用path引數指定對應的目錄路徑,假設,我想要在遠端主機上建立/testdir/a/b目錄,那麼我則需要設定path=/testdir/a/b,但是,我們無法從"/testdir/a/b"這個路徑看出b是一個檔案還是一個目錄,ansible也同樣無法單單從一個字串就知道你要建立檔案還是目錄,所以,我們需要透過state引數進行說明,當我們想要建立的/testdir/a/b是一個目錄時,需要將state的值設定為directory,"directory"為目錄之意,當它與path結合,ansible就能知道我們要操作的目標是一個目錄,同理,當我們想要操作的/testdir/a/b是一個檔案時,則需要將state的值設定為touch,當我們想要建立軟連結檔案時,需將state設定為link,想要建立硬連結檔案時,需要將state設定為hard,當我們想要刪除一個檔案時(刪除時不用區分目標是檔案、目錄、還是連結),則需要將state的值設定為absent,"absent"為缺席之意,當我們想讓操作的目標"缺席"時,就表示我們想要刪除目標。

src引數 :當state設定為link或者hard時,表示我們想要建立一個軟鏈或者硬鏈,所以,我們必須指明軟鏈或硬鏈連結的哪個檔案,透過src引數即可指定連結源。

force引數  :  當state=link的時候,可配合此引數強制建立連結檔案,當force=yes時,表示強制建立連結檔案,不過強制建立連結檔案分為兩種情況,情況一:當你要建立的連結檔案指向的原始檔並不存在時,使用此引數,可以先強制建立出連結檔案。情況二:當你要建立連結檔案的目錄中已經存在與連結檔案同名的檔案時,將force設定為yes,回將同名檔案覆蓋為連結檔案,相當於刪除同名檔案,建立連結檔案。情況三:當你要建立連結檔案的目錄中已經存在與連結檔案同名的檔案,並且連結檔案指向的原始檔也不存在,這時會強制替換同名檔案為連結檔案。

owner引數 :用於指定被操作檔案的屬主,屬主對應的使用者必須在遠端主機中存在,否則會報錯。

group引數 :用於指定被操作檔案的屬組,屬組對應的組必須在遠端主機中存在,否則會報錯。

mode引數:用於指定被操作檔案的許可權,比如,如果想要將檔案許可權設定為"rw-r-x---",則可以使用mode=650進行設定,或者使用mode=0650,效果也是相同的,如果你想要設定特殊許可權,比如為二進位制檔案設定suid,則可以使用mode=4700,很方便吧。

recurse引數:當要操作的檔案為目錄,將recurse設定為yes,可以遞迴的修改目錄中檔案的屬性。

官網
https://docs.ansible.com/ansible/latest/modules/file_module.html#file-module

遠端建立檔案
ansible每次命令的執行,都會記錄下當前的狀態

[root@master-61 ~]#ansible backup -m file -a 'path=/opt/yuchao666.log state=touch'

建立資料夾

[root@master-61 ~]#ansible backup -m file -a 'path=/opt/yuchao666 state=directory'

建立檔案且設定許可權

[root@master-61 ~]#ansible backup -m file -a 'path=/opt/chaoge.pwd state=touch owner=www group=www mode=700'

建立軟連線檔案
軟連線,也就是在目標機器上,指定原始檔,建立軟連線

[root@master-61 ~]#ansible backup -m file -a "src=/etc/hosts dest=/tmp/hosts_link state=link"

修改已存在檔案/資料夾的屬性

修改檔案
[root@master-61 ~]#ansible backup -m file -a "path=/opt/chaoge.pwd mode=660"

修改資料夾
[root@master-61 ~]#ansible backup -m file -a "path=/opt/yuchao666  mode=660 owner=www group=www"

6 script指令碼模組

官網

https://docs.ansible.com/ansible/latest/collections/ansible/builtin/script_module.html#ansible-collections-ansible-builtin-script-module

模組功能:把本地指令碼傳輸到遠端節點上並執行指令碼

比起shell模組,script模組功能更強大,本地有一份指令碼,就可以在所有機器上執行。

1.管理機建立測試指令碼

cat > echo_server_info.sh <<EOF
#!/bin/bash
echo "$(hostname -I)" >> /tmp/server_info.log
echo "$(uptime)" >> /tmp/server_info.log
echo "$(free -m)" >> /tmp/server_info.log
EOF

2.新增執行許可權
[root@master-61 ~]#chmod +x echo_server_info.sh 


3.遠端執行
[root@master-61 ~]#ansible backup -m script -a "/root/echo_server_info.sh"

4.檢查結果
[root@master-61 ~]#ansible backup -m shell -a 'cat /tmp/server_info.log'

遠端一鍵部署rsync服務
可以先恢復rsync-41機器,再執行如下操作

1.編寫rsync部署指令碼  install_rsync.sh
#!/bin/bash
yum install rsync -y

cat > /etc/rsyncd.conf << 'EOF'
uid = www 
gid = www 
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
[backup]
comment = chaoge rsync backup!
path = /backup
EOF

useradd -u 1000 -M -s /sbin/nologin www
mkdir -p /{backup,data}
chown -R www:www /{backup,data}
echo "rsync_backup:yuchao666" > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
systemctl start rsyncd



2.遠端執行指令碼
[root@master-61 ~]#
[root@master-61 ~]#chmod +x install_rsync.sh 

[root@master-61 ~]#ansible backup -m script -a "/root/install_rsync.sh"


3.檢查rsync服務
[root@master-61 ~]#ansible backup -m shell -a 'systemctl status rsyncd'


4.測試rsync服務
[root@master-61 ~]#export RSYNC_PASSWORD=yuchao666
[root@master-61 ~]#rsync -avzp /tmp/ rsync_backup@172.16.1.41::backup
遠端檢查資料
[root@master-61 ~]#ansible backup -m shell -a 'ls /backup'



5.但是該方式依然是不合理的,shell不會幫你去檢測檔案是否重複性修改,軟體是否重複性安裝,因此我們會將一鍵部署rsync這樣的任務,全部改造為ansible的模組指令碼。

你現在多次執行該指令碼的話,ansible已經盡力在檢查哪些步驟是無須在做的了
[root@master-61 ~]#ansible backup -m script -a "/root/install_rsync.sh"

檢視命令執行詳細過程

[root@master-61 ~]#ansible backup  -vvvvv -m script -a "/root/install_rsync.sh"


[root@master-61 ~]#man ansible
       -v, --verbose
          verbose mode (-vvv for more, -vvvv to enable connection debugging)

7cron定時任務模組

官網文件
https://docs.ansible.com/ansible/latest/modules/cron_module.html#cron-module

cron模組用於管理定時任務的記錄,編寫任務

對比ansible的cron模組,和crontab

新增ntpdate定時任務
新增每5分鐘執行一次和阿里雲時間同步

[root@master-61 ~]#ansible backup -m cron -a "name=chaoge_cron job='/usr/sbin/ntpdate ntp.aliyun.com > /dev/null 2>&1' minute=*/5"


檢視遠端機器的crontab記錄
[root@master-61 ~]#ansible backup -m shell -a "cat /var/spool/cron/root"
172.16.1.41 | CHANGED | rc=0 >>
* * * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1
#Ansible: chaoge_cron
*/5 * * * * /usr/sbin/ntpdate ntp.aliyun.com > /dev/null 2>&1

刪除定時任務
只能基於cron模組指定名字的修改

[root@master-61 ~]#ansible backup -m cron -a "name=chaoge_cron state=absent"
172.16.1.41 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": []
}


[root@master-61 ~]#
[root@master-61 ~]#ansible backup -m shell -a "cat /var/spool/cron/root"
172.16.1.41 | CHANGED | rc=0 >>
* * * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1


[root@master-61 ~]#ansible backup  -a 'crontab -l'
172.16.1.41 | CHANGED | rc=0 >>
* * * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1

建立每分鐘執行的任務
不指定任何時間規則,預設是每分鐘

1.每分鐘定時執行指令碼,注意要求該指令碼存在於目標機器上
[root@master-61 ~]#cat echo_hostname.sh 
#!/bin/bash
echo "$(date +%T) $(hostname)" >> /tmp/hostname.log


2.遠端複製指令碼
[root@master-61 ~]#ansible backup -m copy -a "src=/root/echo_hostname.sh dest=/opt/echo_hostname.sh"


3.設定定時任務,多次執行該命令,會覆蓋同name的任務
[root@master-61 ~]#ansible backup -m cron -a "job='/bin/bash /opt/echo_hostname.sh' name=chaoge_cron_hostname"

修改指定名稱的定時任務

[root@master-61 ~]#ansible backup -a "crontab -l"

[root@master-61 ~]#ansible backup -a "cat /tmp/hostname.log"

修改定時任務為每天晚上11點15分執行
[root@master-61 ~]#ansible backup -m cron -a "name='chaoge_cron_hostname' job='bin/bash /opt/echo_hostname.sh' minute=15 hour=23"

[root@master-61 ~]#ansible backup -a "crontab -l"

8 group模組

https://docs.ansible.com/ansible/latest/modules/group_module.html#group-
官網文件

語法

模組引數    引數描述
name    建立指定的組名
gid        組的GID
state        absent,移除遠端主機的組
             present,建立遠端主機的組

建立chaoge_ops組,gid=1234

[root@master-61 ~]#ansible backup -m group -a "name=chaoge_ops gid=1234"

[root@master-61 ~]#ansible backup -a "grep chaoge_ops /etc/group"
172.16.1.41 | CHANGED | rc=0 >>
chaoge_ops:x:1234:

刪除組

[root@master-61 ~]#ansible backup -m group -a "name=chaoge_ops gid=1234 state=absent"

[root@master-61 ~]#ansible backup -a "grep chaoge_ops /etc/group"

9 user使用者模組

使用者管理,也就是關於使用者的

uid
使用者名稱
使用者主組
使用者附加組
建立使用者
刪除使用者
建立關於使用者的公私鑰
使用者過期時間
使用者密碼過期時間

https://docs.ansible.com/ansible/latest/modules/user_module.html#user-module
官網文件

語法引數

例項用法
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/user_module.html#examples


建立chaoge01使用者,uid為8888

[root@master-61 ~]#ansible backup -m user -a "name=chaoge01 uid=8888"

[root@master-61 ~]#ansible backup -a "grep chaoge01 /etc/passwd"
172.16.1.41 | CHANGED | rc=0 >>
chaoge01:x:8888:8888::/home/chaoge01:/bin/bash

建立使用者cc01
uid、gid為1777
沒有家目錄、不允許登入

注意該使用者組是否存在,否則報錯
[root@master-61 ~]#ansible backup -m group -a "name=cc01 gid=1777"

建立使用者,設定許可權
[root@master-61 ~]#ansible backup -m user -a "name=cc01 uid=1777 group=1777 create_home=no shell=/sbin/nologin"


檢查使用者
[root@master-61 ~]#ansible backup -a 'grep cc01 /etc/passwd'
172.16.1.41 | CHANGED | rc=0 >>
cc01:x:1777:1777::/home/cc01:/sbin/nologin

10 yum安裝軟體



官網文件示例用法

https://docs.ansible.com/ansible/latest/collections/ansible/builtin/yum_module.html#examples

安裝net-tools最新版本 latest引數也用於升級軟體包

[root@master-61 ~]#ansible backup -m yum -a "name=net-tools state=latest"

解除安裝net-tools軟體

[root@master-61 ~]#ansible backup -m yum -a "name=net-tools state=absent"

安裝rsync服務

[root@master-61 ~]#ansible backup -m yum -a "name=rsync state=installed"


檢查rsync
[root@master-61 ~]#ansible backup -m shell -a "rpm -qa rsync"

11 service/systemd模組

該模組作用是針對yum包管理

service適用於centos6前的系統

systemd命令應用於centos7系統

要注意的是service模組依舊對centos7有效,但是建議大家使用systemd模組

systemd模組引數

如果使用systemctl 管理程式的話,可以使用systemd模組,systemctl 可以 控制程式啟/停,reload,開機啟動,觀察程式狀態(status)等,掌握使用後管理就更方便了

主要引數
daemon_reload:在執行任何其他操作之前執行守護程序重新載入,以確保systemd已經讀取其他更改
enabled:服務是否開機自動啟動yes|no。enabled和state至少要有一個被定義
masked:是否將服務設定為masked狀態,被mask的服務是無法啟動的
name:必選項,服務名稱
no_block(2.3後新增):不要同步等待操作請求完成
state:對當前服務執行啟動,停止、重啟、重新載入等操作(started,stopped,restarted,reloaded)
user:使用服務的呼叫者執行systemctl,而不是系統的服務管理者

安裝、啟動nginx服務

1.安裝nginx服務
[root@master-61 ~]#ansible 172.16.1.7 -m yum -a "name=nginx state=installed"

2.啟動服務
[root@master-61 ~]#ansible web -m systemd -a "name=nginx state=started"

3.查詢狀態,這裡ansible未直接提供status引數,你可以藉助command模組即可
[root@master-61 ~]#ansible web -a "systemctl status nginx"

4.停止nginx服務
[root@master-61 ~]#ansible web -m systemd -a "name=nginx state=stopped"

5.設定nginx開機自啟
[root@master-61 ~]#ansible web -m systemd -a "name=nginx state=started enabled=yes"

6.檢查nginx狀態
[root@master-61 ~]#ansible web -a "systemctl is-enabled nginx"

[root@master-61 ~]#ansible web -a "systemctl status nginx"

7.關閉開機自啟、且停止服務
[root@master-61 ~]#ansible web -m systemd -a "name=nginx state=stopped  enabled=no"

8.再次檢查狀態
[root@master-61 ~]#ansible web  -m shell -a "systemctl is-enabled nginx;systemctl status nginx"

12 mount掛載模組

官網
https://docs.ansible.com/ansible/latest/collections/ansible/posix/mount_module.html#mount-

給web-7機器掛載nfs目錄(只寫入/etc/fstab而不掛載)

[root@master-61 ~]#ansible web -m mount -a "src='172.16.1.1:/nfs-nginx-data' path=/usr/share/nginx/html fstype=nfs state=present"

給web-7機器掛載nfs目錄(立即掛載且寫入/etc/fstab)

[root@master-61 ~]#ansible web -m mount -a "src='172.16.1.31:/nfs-nginx-data' path=/usr/share/nginx/html fstype=nfs state=mounted"

檢查
[root@master-61 ~]#ansible web -a "df -h"

[root@master-61 ~]#ansible web -a "cat /etc/fstab"

取消掛載,以及刪除fstab記錄

[root@master-61 ~]#ansible web -m mount -a "src='172.16.1.31:/nfs-nginx-data' path=/usr/share/nginx/html fstype=nfs state=absent"

驗證
[root@master-61 ~]#ansible web -a "df -h"
[root@master-61 ~]#ansible web -a "cat /etc/fstab"

取消掛載,不刪除fstab記錄

[root@master-61 ~]#ansible web -m mount -a "src='172.16.1.31:/nfs-nginx-data' path=/usr/share/nginx/html fstype=nfs state=umounted"

總結引數

mounted 掛載裝置且寫入fstab
present 僅寫入fstab 不掛載
absent  解除安裝且刪除fstab記錄
umounted 只解除安裝不刪除fstab記錄

13 archive壓縮模組

官網文件
https://docs.ansible.com/ansible/latest/collections/community/general/archive_module.html

支援壓縮型別

bz2

gz ← (default)

tar

xz

zip 

用法文件
https://docs.ansible.com/ansible/latest/collections/community/general/archive_module.html#examples
指定format即可

壓縮/etc配置檔案到指定路徑

[root@master-61 ~]#ansible web -m archive -a "path=/etc dest=/opt/etc.tgz"
[root@master-61 ~]#ansible web -a "ls /opt -l"
[root@master-61 ~]#ansible web -a "file /opt/etc.tgz"

壓縮/var/log為zip型別到指定路徑

[root@master-61 ~]#ansible web -m archive -a "path=/var/log dest=/opt/log.zip format=zip"

[root@master-61 ~]#ansible web -a "file /opt/log.zip"

14 unarchive解壓縮模組

https://docs.ansible.com/ansible/latest/collections/ansible/builtin/unarchive_module.html#examples

解壓縮etc.tgz到指定目錄(遠端解壓)
remote_src遠端資料來源

指定目錄必須存在
[root@master-61 ~]#ansible web -m file -a "path=/opt/etc_file state=directory"


解壓縮
[root@master-61 ~]#ansible web -m unarchive -a "src=/opt/etc.tgz dest=/opt/etc_file/ remote_src=yes"

檢視
[root@master-61 ~]#ansible web -a "ls /opt/etc_file/etc/"

將管理機的壓縮包,解壓到遠端機器上
將master-61的壓縮檔案,解壓到web-7機器上

1.生成etc.tgz資料
[root@master-61 ~]#cd / && tar -zcf /opt/etc.tgz etc


2.遠端解壓到web-7機器上
[root@master-61 /]#ansible web -m unarchive -a "src=/opt/etc.tgz  dest=/tmp/"

3.檢查
[root@master-61 /]#ansible web -a "ls /tmp/etc/"

相關文章