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/"