命令總結
ansible-playbook test.yaml --syntax-check ## 執行腳本語法檢查
ansible-playbook test.yaml -C ## 預執行腳本
ansible-playbook test.yaml ## 執行腳本
ansible-playbook test.yaml -v ## 顯示執行腳本
ansible-playbook test.yaml -vv ## 顯示執行腳本(更詳細,最多四個v,ansible-playbook test.yaml -vvvv)
00. 介紹部分
- ansible批量管理服務概念
- ansible批量管理服務特點
- ansible批量管理服務部署
- ansible批量管理服務應用---模塊應用
- ansible模塊命令語法
- ansible常用模塊
01. 知識回顧
-
遠程管理服務介紹
ssh 數據加密 22
telnet 數據明文 23 -
SSH遠程管理服務工作原理
私鑰 公鑰
用途1: 對數據進行加密處理
用途2: 對用戶訪問進行認證 -
SSH遠程連接的方式
a 基於口令的方式進行連接
b 基於秘鑰的方式進行連接
c 基於秘鑰連接的工作原理3.1 基於秘鑰的連接部署方式 第一個歷程: 創建秘鑰對(管理端服務器) ssh-keygen -t 秘鑰的類型(dsa|rsa) 第二個歷程: 將公鑰進行分發(被管理端服務器) ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31 如何批量分發公鑰: 01. 需要輸入連接確認信息 yes/no ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31 "-o StrictHostKeyChecking=no" 02. 需要第一次連接輸入密碼 yum install -y sshpass sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31 "-o StrictHostKeyChecking=no" 03. 遠程服務器SSH服務端口號改動了 sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31 -p 52113 "-o StrictHostKeyChecking=no" 3.2 基於秘鑰連接排錯思路: 01. 利用命令進行連接測試 02. 檢查公鑰在被管理主機上是否存在,並且與管理端公鑰信息是否相同 03. 利用公鑰分發命令重新分發公鑰 04. 檢查腳本的編寫 05. 調試腳本功能 sh -x
-
SSH遠程服務防范入侵案例
-
SSH服務的配置文件編寫
監聽地址??? -
SSH服務的相關命令總結
02. ansible批量管理服務介紹
ansible批量管理服務意義
- 提高工作的效率
- 提高工作准確度
- 減少維護的成本
- 減少重復性工作
ansible批量管理服務功能
- 可以實現批量系統操作配置
- 可以實現批量軟件服務部署
- 可以實現批量文件數據分發
- 可以實現批量系統信息收集
03. ansible批量管理服務部署
管理端服務器
第一個歷程: 安裝部署軟件
yum install -y ansible --- 需要依賴epel的yum源
/etc/ansible/ansible.cfg --- ansible服務配置文件
/etc/ansible/hosts --- 主機清單文件 定義可以管理的主機信息
/etc/ansible/roles --- 角色目錄???
第二個歷程: 需要編寫主機清單文件
vim /etc/ansible/hosts ## 定義可以管理的主機信息,主機必須是已經完成秘鑰分發的,秘鑰分發腳本/server/scripts/fenfa_key_pub.sh 172.16.1.41 172.16.1.31 172.16.1.7
第三個歷程: 測試是否可以管理多個主機
腳本測試 hostname,注意需要先關閉selinux服務,負責會報錯
ansible all -a "hostname"
[root@m01 scripts]# ansible all -a "hostname"
顯示結果:
172.16.1.41 | CHANGED | rc=0 >>
backup172.16.1.7 | CHANGED | rc=0 >>
web01172.16.1.31 | CHANGED | rc=0 >>
nfs01---參數-a ,-active或action,表示執行的動作
---參數all,表示所有管理的主機,可以替換為ansible 172.16.1.41,172.16.1.31 -a "hostname"
04. ansible服務架構信息
ansible基本架構圖示:
1) 主機清單配置
2) 軟件模塊信息 OK ---每個模塊只能完成一個功能
3) 基於秘鑰連接主機 OK ---使用ansible批量管理之前需要先完成ssh秘鑰分發認證
4) 主機需要關閉selinux OK
5) 軟件劇本功能 ---將多個模塊組合在一起即是劇本
05. ansible軟件模塊應用
ansible官方網站: https://docs.ansible.com/
模塊的應用語法格式:
ansible 主機名稱/主機組名稱/主機地址信息/all -m(指定應用的模塊信息) 模塊名稱 -a(指定動作信息) "執行什么動作"
命令類型模塊:
掌握第一個模塊: command (默認模塊)
command – Executes a command on a remote node
在一個遠程主機上執行一個命令
簡單用法:
[root@m01 scripts]# ansible 172.16.1.31 -m command -a "hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01
擴展應用:
- chdir Change into this directory before running the command.
在執行命令之前對目錄進行切換ansible 172.16.1.31 -m command -a "chdir=/tmp touch oldboy.txt"
- creates If it already exists, this step won't be run.
如果文件存在了,不執行命令操作;也就是判斷文件不存在時,執行后面的操作ansible 172.16.1.31 -m command -a "creates=/tmp/hosts touch oldboy.txt"
- removes If it already exists, this step will be run.
如果文件存在了, 這個步驟將執行ansible 172.16.1.31 -m command -a "removes=/tmp/hosts chdir=/tmp touch oldboy.txt"
- free_form(required)
The command module takes a free form command to run.
There is no parameter actually named 'free form'. See the examples!
使用command模塊的時候,-a參數后面必須寫上一個合法linux命令信息
注意事項:
有些符號信息無法識別: <", ">", "|", ";" and "&"
需要使用上述符號時,指定shell模塊,如
ansible 172.16.1.31 -m shell -a "cd /data; ls /data"
掌握第二個模塊: shell (萬能模塊)
在遠端運行,相當於在遠端的命令行
shell – Execute commands in nodes
在節點上執行操作
簡單用法:
[root@m01 scripts]# ansible 172.16.1.31 -m command -a "hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01
擴展應用
- chdir Change into this directory before running the command.
在執行命令之前對目錄進行切換
ansible 172.16.1.31 -m shell -a "chdir=/tmp touch oldboy.txt"
- creates If it already exists, this step won't be run.
如果文件存在了,不執行命令操作
ansible 172.16.1.31 -m shell -a "creates=/tmp/hosts touch oldboy.txt"
- removes If it already exists, this step will be run.
如果文件存在了, 這個步驟將執行
ansible 172.16.1.31 -m shell -a "removes=/tmp/hosts chdir=/tmp touch oldboy.txt"
- free_form(required)
The shell module takes a free form command to run.
There is no parameter actually named 'free form'. See the examples!
使用command模塊的時候,-a參數后面必須寫上一個合法linux命令信息
實踐應用: 利用shell執行腳本
第一個步驟: 編寫一個腳本
[root@m01 scripts]# cat yum.sh #!/bin/bash yum install -y htop
第二個步驟: 將腳本發送到遠程主機
[root@m01 scripts]# scp -rp yum.sh 172.16.1.31:/server/scripts yum.sh [root@m01 scripts]# ansible 172.16.1.31 -m command -a "ls /server/scripts/" 172.16.1.31 | CHANGED | rc=0 >> backup.sh yum.sh
第三個步驟: 將腳本權限進行修改(添加執行權限)
[root@m01 scripts]# ansible 172.16.1.31 -m shell -a "/server/scripts/yum.sh" 172.16.1.31 | FAILED | rc=126 >> /bin/sh: /server/scripts/yum.sh: Permission deniednon-zero return code [root@m01 scripts]# ansible 172.16.1.31 -m shell -a "chmod +x /server/scripts/yum.sh" 注意:[root@m01 scripts]# ansible 172.16.1.31 -m shell -a "sh /server/scripts/yum.sh" 不加權限也是可以可以執行的
第四個步驟: 運行ansible命令執行腳本
[root@m01 scripts]# ansible 172.16.1.31 -m shell -a "sh /server/scripts/yum.sh"
掌握第三個模塊: script (萬能模塊)
在遠端節點上運行本地腳本,再將結果傳回本地
第一個步驟: 編寫一個腳本
[root@m01 scripts]# cat yum.sh #!/bin/bash yum install -y htop
第二個步驟: 運行ansible命令執行腳本
[root@m01 scripts]# ansible 172.16.1.31 -m script -a "/server/scripts/yum.sh" 172.16.1.31 | CHANGED => { "changed": true, "rc": 0, "stderr": "Shared connection to 172.16.1.31 closed.\r\n", "stderr_lines": [ "Shared connection to 172.16.1.31 closed." ], ... 注意:使用腳本模塊時需要直接執行腳本,不能用以下命令 [root@m01 scripts]# ansible 172.16.1.31 -m script -a "sh /server/scripts/yum.sh" 172.16.1.31 | FAILED! => { "changed": false, "msg": "Could not find or access 'sh'\nSearched in:\n\t/server/scripts/files/sh\n\t/server/scripts/sh\n\t./files/sh\n\t./sh on the Ansible Controller.\nIf you are using a module and expect the file to exist on the remote, see the remote_src option" }
PS: scripts模塊參數功能和command模塊類似
文件類型模塊:
copy模塊
copy – Copies files to remote locations
將數據信息進行批量分發給遠程的多台主機
基本用法:
[root@m01 scripts]# ansible 172.16.1.31 -m copy -a "src=/etc/hosts dest=/etc" 172.16.1.31 | CHANGED => { --- 對哪台主機進行操作 "changed": true, --- 是否對主機信息進行改變 "checksum": "6ed7f68a1d6b4b36c1418338b2001e421eeba270",---生成一個文件校驗碼=MD5數值 "dest": "/etc/hosts", --- 顯示目標路徑信息 "gid": 0, --- 顯示復制后文件gid信息 "group": "root", --- 顯示復制后文件屬組信息 "md5sum": "7afd7b74854f0aaab646b3e932f427c0", ---生成一個文件校驗碼=MD5數值 "mode": "0644", --- 顯示復制后文件權限信息 "owner": "root", --- 顯示復制后文件屬主信息 "size": 401, --- 顯示文件的大小信息 "src": "/root/.ansible/tmp/ansible-tmp-1557804498.23-26487341925325/source", "state": "file", --- 顯示文件的類型信息 "uid": 0 --- 顯示復制后文件uid信息 }
補充說明: ansible軟件輸出顏色說明:
1. 綠色信息: 查看主機信息/對主機未做改動 2. 黃色信息: 對主機數據信息做了修改 3. 紅色信息: 命令執行出錯了 4. 粉色信息: 忠告信息 5. 藍色信息: 顯示ansible命令執行的過程???
擴展用法:
- 在傳輸文件時修改文件的屬主和屬組信息
[root@m01 rsync]# ansible 172.16.1.31 -m copy -a "src=/etc/ansible/file/rsync/rsync.password dest=/etc/ owner=oldboy group=oldboy"
- 在傳輸文件時修改文件的權限信息
[root@m01 rsync]# ansible 172.16.1.31 -m copy -a "src=/etc/ansible/file/rsync/rsync.password dest=/etc/ mode=1777"
- 在傳輸數據文件信息時對遠程主機源文件進行備份
[root@m01 rsync]# ansible 172.16.1.31 -m copy -a "src=/etc/ansible/file/rsync/rsync.password dest=/etc/ backup=yes"
- 創建一個文件並直接編輯文件的信息,不需要在管理端主機創建出文件
[root@m01 rsync]# ansible 172.16.1.31 -m copy -a "content='oldboy123' dest=/etc/rsync.password"
PS:參數: remote_src directory_mode local_follow
參數: remote_src
1、If no, it will search for src at originating/master machine.
src參數指定文件信息,會在本地管理端服務進行查找,默認remote_src=no[root@m01 rsync]# ansible 172.16.1.31 -m copy -a "src=/etc/rsync.password dest=/data remote_src=yes"
2、If yes it will go to the remote/target machine for the src. Default is no.
src參數指定文件信息,會從遠程主機上進行查找[root@m01 rsync]# ansible 172.16.1.31 -m copy -a "src=/etc/rsync.password dest=/data remote_src=yes" 172.16.1.31 | CHANGED => { ...輸出信息省略... }
PS: ansible軟件copy模塊復制目錄信息
ansible 172.16.1.31 -m copy -a "src=/oldboy dest=/oldboy"
src后面目錄沒有/
: 將目錄本身以及目錄下面的內容都進行遠程傳輸復制[root@m01 ~]# ansible 172.16.1.31 -m copy -a "src=/oldboy dest=/oldboy" 172.16.1.31 | CHANGED => { "changed": true, "dest": "/oldboy/", "src": "/oldboy" } [root@nfs01 ~]# tree /oldboy/ /oldboy/ └── oldboy └── oldboy01 ├── 01.txt ├── 02.txt ├── 03.txt └── oldboy02 3 directories, 3 files
ansible 172.16.1.31 -m copy -a "src=/oldboy/ dest=/oldboy"
src后面目錄有/
: 只將目錄下面的內容都進行遠程傳輸復制[root@m01 ~]# ansible 172.16.1.31 -m copy -a "src=/oldboy/ dest=/oldboy" 172.16.1.31 | CHANGED => { "changed": true, "dest": "/oldboy/", "src": "/oldboy/" } [root@nfs01 ~]# tree /oldboy/ /oldboy/ └── oldboy01 ├── 01.txt ├── 02.txt ├── 03.txt └── oldboy02 2 directories, 3 files
file 模塊
– Sets attributes of files
設置文件屬性信息
基本用法:
ansible 172.16.1.31 -m file -a "dest=/etc/hosts owner=oldboy group=oldboy mode=666"
執行命令前:
[root@nfs01 ~]# ll /etc/hosts
-rw-r--r-- 1 root root 397 Mar 4 09:20 /etc/hosts
執行命令:
[root@m01 ~]# ansible 172.16.1.31 -m file -a "dest=/etc/hosts owner=oldboy group=oldboy mode=644"
172.16.1.31 | CHANGED => {
...輸出信息省略...
}
執行命令后:
[root@nfs01 ~]# ll /etc/hosts
-rw-r--r-- 1 oldboy oldboy 397 Mar 4 09:20 /etc/hosts
[root@nfs01 ~]#
擴展用法:
- 可以利用模塊創建數據信息 (文件 目錄 鏈接文件)
state 參數
=absent --- 缺席/刪除數據信息
=directory --- 創建一個目錄信息
=file --- 檢查創建的數據信息是否存在 綠色存在 紅色不存在
=hard --- 創建一個硬鏈接文件
=link --- 創建一個軟鏈接文件
=touch --- 創建一個文件信息
創建目錄信息:
ansible 172.16.1.31 -m file -a "dest=/oldboy/ state=directory"
ansible 172.16.1.31 -m file -a "dest=/oldboy/oldboy01/oldboy02/ state=directory"
[root@m01 ~]# ansible 172.16.1.31 -m file -a "dest=/oldboy/oldboy01/oldboy02 state=directory"
172.16.1.31 | CHANGED => {
...輸出信息省略...
}
[root@nfs01 ~]# tree /oldboy/
/oldboy/
└── oldboy01
└── oldboy02
2 directories, 0 files
創建文件信息:
ansible 172.16.1.31 -m file -a "dest=/oldboy/oldboy.txt state=touch"
[root@m01 ~]# ansible 172.16.1.31 -m file -a "dest=/oldboy/oldboy01/ansible.txt state=touch"
172.16.1.31 | CHANGED => {
...輸出信息省略...
}
[root@nfs01 ~]# tree /oldboy/
/oldboy/
└── oldboy01
├── ansible.txt
└── oldboy02
2 directories, 1 file
創建鏈接文件信息:
ansible 172.16.1.31 -m file -a "src=/oldboy/oldboy.txt dest=/oldboy/oldboy_hard.txt state=hard"
ansible 172.16.1.31 -m file -a "src=/oldboy/oldboy.txt dest=/oldboy/oldboy_link.txt state=link"[root@m01 ~]# ansible 172.16.1.31 -m file -a "src=/oldboy/oldboy01/ansible.txt dest=/oldboy/ansible_hard.txt state=hard" [root@m01 ~]# ansible 172.16.1.31 -m file -a "src=/oldboy/oldboy01/ansible.txt dest=/oldboy/ansible_soft.txt state=link" 172.16.1.31 | CHANGED => { ...輸出信息省略... } ---hard---看iNode是否一致 [root@nfs01 oldboy]# find . -name "*txt" |xargs ls -li 101838199 -rw-r--r-- 2 root root 0 Mar 4 15:11 ./ansible_hard.txt 101838199 -rw-r--r-- 2 root root 0 Mar 4 15:11 ./oldboy01/ansible.txt ---soft---直接就能看出 [root@nfs01 oldboy]# ll lrwxrwxrwx 1 root root 28 Mar 4 15:25 ansible_soft.txt -> /oldboy/oldboy01/ansible.txt
- 可以利用模塊刪除數據信息
ansible 172.16.1.31 -m file -a "dest=/oldboy/oldboy.txt state=absent"
ansible 172.16.1.31 -m file -a "dest=/oldboy/ state=absent"
自行研究: recurse --- 相當於參數-R,遞歸,如遞歸修改文件目錄及目錄下所有文件的權限
默認resurse=no
預習:
-
預習幾個新的模塊:
yum service cron mount user group unarchive archive -
預習劇本的編寫格式