一。雲計算#
雲計算
openstack
docker
kvm
虛擬化技術:在本身物理機的基礎上虛擬出雲主機
#唯一的不好是 安全性不高 數據保存在別人那裡的 (影響不大)
#trouble shooting 的能力 問題解答的能力
#注:ssh 開啟 2 種驗證 - 先公鑰認證 再密碼認證 密碼認證失敗 提示 permit deny
二. ansible 不是守護進程#
#ansible 不是守護進程 執行 ansible 命令的時候才會執行 ansible
#守護進程:一直在內存裡面,等待別人連接
#ssh 是守護進程
#執行 1 條命令 命令不是守護進程#ansible 不是一個守護進程(守護進程:起來後一直在內存中運行,等待其他人訪問)
#ansible 就是一個命令腳本,使用 Python 寫的#[root@cPen_A ansible]# sudo -i # 注:直接回到 root 用戶
三. ansible 的模塊#
ansible 的模塊
1. copy 模塊#
從本地 copy 文件分發到目錄主機路徑
參數說明:
src= 源文件路徑 # 注:source 源 dest= 目標路徑 # 注:destination 目的地
注意 src= 路徑後面帶 / 表示帶裡面的所有內容複製到目標目錄下,不帶 / 是目錄遞歸複製過去
content= 自行填充的文件內容
owner 屬主
group 屬組
mode 權限
示例1:shell模塊、copy模塊
---------------------------------------------------------------------------------------------------------------------------------
#示例1:使用ansible 在B、C主機創建/lianxi 目錄
#-m 指定模塊
#-a 傳的參數
ansible 接 指定主機 -m 指定模塊 -a 執行的參數
[root@cPen_A ansible]# ansible all -m shell -a "mkdir /lianxi -p"
#注:rc ==> return code --> 為0表示執行成功
#注:rc ==> return code --> 為1表示執行失敗
#示例2:將ansible-copy文件 複製到主機B、C/lianxi/ansible目錄下,指定權限屬主數組
[root@cPen_A lianxi]# vim ansible-copy
[root@cPen_A lianxi]# ansible all -m copy -a "src=/lianxi/ansible-copy dest=/lianxi/ansible mode=777 owner=sanchuang group=sanchuang"
#注:確認B、C主機 指定的用戶sanchuang和組sanchuang存在
#md5sum 一般來說 是 信息的摘要 判定文件是否被修改
示例2:指定webser組,將/etc/passwd 赋值到主機/tmp目錄下,指定權限777
---------------------------------------------------------------------------------------------------------------------------------
[root@cPen_A lianxi]# ansible webser -m copy -a "src=/etc/passwd dest=/tmp mode=777"
===========================================================================================
示例3:copy src路徑後面帶/不帶/的區別
---------------------------------------------------------------------------------------------------------------------------------
#注:src= 路徑後面帶/ 表示帶裡面的所有內容複製到目標目錄下,不帶/是目錄遞歸複製過去
#注:不帶/
[root@cPen_A copy_dir]# ansible all -m copy -a "src=/lianxi/copy_dir dest=/lianxi/ansible"
#注:帶/
[root@cPen_A copy_dir]# ansible all -m copy -a "src=/lianxi/copy_dir/ dest=/lianxi/ansible"
#帶/表示拷貝目錄下的子文件或者子文件夾
#不帶/表示拷貝整個目錄
2. fetch 模塊#
#注:從遠程主機拉取文件到本地
示例
---------------------------------------------------------------------------------------------------------------------------------
[root@cPen_A lianxi]# ansible webser -m fetch -a "src=/etc/hostname dest=/lianxi mode=644"
192.168.0.22 | CHANGED => {
"changed": true,
"checksum": "c468f7340237d9f531122f5b03345ce8ac5641b4", # 注:拉去下來後會比較
"dest": "/lianxi/192.168.0.22/etc/hostname",
"md5sum": "8d23b0947f191eb9c20728677271eb4d",
"remote_checksum": "c468f7340237d9f531122f5b03345ce8ac5641b4", # 注:和遠程比較 內容是否變更
"remote_md5sum": null
}
#注:大文件傳送中途 突然斷掉了 ,文件沒有傳完 保存的md5sum和它的md5sum不一樣
#注:如果2個值一致 說明傳完了
[root@cPen_A lianxi]# ls # 注:路徑自動加了個以ip地址為名的文件夾
192.168.0.20 192.168.0.22 ansible-copy copy_dir
[root@cPen_A lianxi]# cd 192.168.0.20
[root@cPen_A 192.168.0.20]# ls
etc
從遠程主機拉取文件到本地
fetch會自動的在dest指定目錄後加上遠程主機命名的目錄結構後面接src目錄結構
fetch存儲到本地的目錄結構 dest + 遠程主機名 + src
#注:md5可以判定 1、文件是否修改;2、文件是否傳完
#注:或者使用任何hash算法中的其中一種,去比較值是否相等
3. command 模塊#
在遠程主機上執行命令,屬於裸執行,非鍵值對顯示;不進行 shell 解析
示例1:command、shell
---------------------------------------------------------------------------------------------------------------------------------
[root@cPen_A 192.168.0.20]# ansible all -m command -a "ifconfig"
[root@cPen_A 192.168.0.20]# ansible all -m shell -a "ifconfig"
示例2:command裸執行 (後面傳的參數不會做解析)
---------------------------------------------------------------------------------------------------------------------------------
#注:把ifconfig|grep inet整個當做1個命令去執行
[root@cPen_A 192.168.0.20]# ansible all -m command -a "ifconfig|grep inet"
192.168.0.22 | FAILED | rc=2 >>
[Errno 2] 沒有那個文件或目錄
#屬於裸執行,不會解析它的管道符號 會認為ifconfig|grep inet 是一個命令
#注:shell可以 (後面傳的參數會做解析)
[root@cPen_A 192.168.0.20]# ansible all -m shell -a "ifconfig|grep inet"
============================================================================================
[root@cPen_A ansible]# ifconfig # 注:查看網卡(看的東西多一點)
#注:可以看接收包、返回包、字節,有多少錯誤
[root@cPen_A ansible]# ip a # 注:查看網卡
4. shell 模塊#
示例
---------------------------------------------------------------------------------------------------------------------------------
[root@cPen_A 192.168.0.20]# ansible all -m shell -a "ifconfig|grep inet"
跟command一樣,只不過shell模塊可以解析管道之類的功能
5. file 模塊#
設置文件屬性 (創建文件)
常用參數:
path 目標路徑
state directory 為目錄,link 為軟鏈接
group 目錄屬組
owner 屬主
等,其他參數通過 ansible-doc -s file 獲取state --
absent 刪除文件和目錄的
directory 目錄
touch 新建空文件
link 軟鏈接
hard 硬鏈接
示例1:查看file文件幫助信息
--------------------------------------------------------------------------------------------
[root@cPen_A lianxi]# ansible-doc -s file # 注:查看file文件幫助信息
============================================================================================
示例2:在目標主機/tmp目錄下創建目錄
#注:創建文件目錄
---------------------------------------------------------------------------------------------------------------------------------
[root@cPen_A lianxi]# ansible all -m file -a "path=/tmp/sanchuang state=directory"
============================================================================================
示例3:設置修改文件屬性
---------------------------------------------------------------------------------------------------------------------------------
[root@cPen_A lianxi]# ansible all -m file -a "path=/tmp/passwd owner=sanchuang"
6. cron 模塊#
通過 cron 模塊對目標主機生成計劃任務
常用參數:
除了分 (minute) 時 (hour) 日 (day) 月 (month) 周 (week) 外
name: 本次計劃任務的名稱
state: present 生成 (默認) |absent 刪除 (基於 name)
#注:首先查看程序有沒有起來
[root@cPen_A ~]# ps -ef |grep crond
root 702 1 0 10:59 ? 00:00:00 /usr/sbin/crond -n
root 3582 3553 0 14:41 pts/3 00:00:00 grep --color=auto crond
#注:學會看日誌
[root@cPen_A ~]# cd /var/log/
[root@cPen_A log]# less cron
Nov 25 12:01:01 cPen_A run-parts(/etc/cron.hourly)[3498]: finished 0anacron
示例1:添加計劃任務
---------------------------------------------------------------------------------------------------------------------------------
#注:每三分鐘輸出當前時間,到/tmp/time.txt文件中
[root@cPen_A log]# ansible all -m cron -a "minute=*/3 job='date >>/tmp/time.txt' name=date_test state=present" # 注:minute=*/3 指定每3分鐘 date >>/tmp/time.txt 命令
[root@cPen_B ~]# crontab -l
#Ansible: date_test
*/3 * * * * date >>/tmp/time.txt
[root@cPen_A log]# ansible 192.168.0.20 -m cron -a "minute=*/3 job='date >>/tmp/time.txt' name=date_test state=present" # 注:可以單獨為某個主機設置 並非一定批量處理
============================================================================================
示例2:刪除計劃任務
---------------------------------------------------------------------------------------------------------------------------------
[root@cPen_A log]# ansible 192.168.0.20 -m cron -a "name=date_test state=absent"
ntp服務是一個時間管理服務器
示例:ntp服務 系統時間管理服務
[root@cPen_A log]# yum install ntp # 注:centos7
[root@cPen_B ~]# yum install chrony # 注:centos8裡面 ntp已被 chrony取代
[root@cPen_A log]# ntpdate ntp1.aliyun.com # 注:同步阿里雲的時間
#注:使用ntp客戶端 同步ntp的服務器 把時間同步
7. yum 模塊#
顧名思義就是 yum 安裝軟件包的模塊;
常用參數說明:
enablerepo,disablerepo 表示啟用與禁用某 repo 庫
name 安裝包名
state (present' orinstalled', latest') 表示安裝,(absent' or `removed') 表示刪除
#注:name 安裝的包名 state 安裝還是卸載
示例:安裝wget
[root@cPen_A log]# ansible all -m yum -a "name=wget state=installed"
示例:卸載wget
[root@cPen_A log]# ansible all -m yum -a "name=wget state=absent"
8. service 模塊#
服務管理模塊
常用參數:
name: 服務名
state: 服務狀態 started(啟動) stopped(關閉) restarted(重啟) reloaded(重新加載)
enabled: 是否開機啟動 true|false
runlevel: 啟動級別 (systemed 方式忽略)
#安裝文件傳輸服務vsftpd
[root@cPen_A log]# ansible all -m yum -a "name=vsftpd state=installed"
示例:關閉vsftpd服務
[root@cPen_A log]# ansible all -m service -a "name=vsftpd state=stopped"
示例:開啟vsftpd服務
[root@cPen_A log]# ansible all -m service -a "name=vsftpd state=started"
9. script 模塊#
1、把本地的腳本傳到遠端執行;前提是到遠端可以執行,不要把 Linux 下的腳本同步到 windows 下執行;
#注:只在遠程服務器執行腳本,不上傳腳本到遠程服務器
[root@cPen_A ~]# vim test.sh
#!/bin/bash
echo "test ansible" >>/tmp/ansible.txt
[root@cPen_A ~]# ansible all -m script -a "/root/test.sh" # 注:/root/test.sh腳本路徑
--------------------------------------------------------------------------------------------
示例:執行慢 機器多 怎麼解決
答:可以使用多進程去執行
-f 6 指定6個進程去執行
command模塊不能識別管道符號、shell模塊 可以識別
copy模塊 推送
script模塊 不需要上傳腳本,在遠程服務器執行腳本
四。查看系統版本#
示例:查看系統版本
[root@cPen_B ~]# uname -r # 注:查看系統內核
4.18.0-193.el8.x86_64
[root@cPen_B ~]# cat /etc/redhat-release # 注:查看/etc/redhat-release 去查看系統版本
CentOS Linux release 8.2.2004 (Core)
五。鏈接#
示例:軟鏈接
[root@cPen_A lianxi]# ln -s ansible-copy ansible-copy-likcs-s #注:前面原文件 後面鏈接文件
[root@cPen_A lianxi]# ls -al # 注:-s soft軟
lrwxrwxrwx 1 root root 12 11月 25 11:30 ansible-copy-likcs-s -> ansible-copy
#注:軟連接 相當於快捷方式
#注:軟鏈接刪掉不會影響原文件,軟鏈接的原文件刪掉了會影響鏈接文件
示例:硬鏈接
[root@cPen_A lianxi]# ln ansible-copy ansible-copy-link
[root@cPen_A lianxi]# ls -al
-rw-r--r-- 2 root root 20 11月 25 10:12 ansible-copy-link
rm -rf 刪除源文件 硬鏈接文件 依舊沒事
#注:硬鏈接 可以去做備份
#注:硬鏈接的原文件刪掉了不會影響鏈接文件
#軟鏈接、硬鏈接
#創建一個硬鏈接 文件的鏈接數會+1
#刪除硬鏈接文件或者是源文件 只是把文件的鏈接數-1 文件不會被真正刪除
#創建一個硬鏈接
[root@cPen_A lianxi]# ls -al
-rw-r--r-- 2 root root 20 11月 25 10:12 ansible-copy # 注:鏈接為2
#注:軟鏈接
lrwxrwxrwx 1 root root 12 11月 25 11:30 ansible-copy-likcs-s -> ansible-copy # 注:鏈接為1
#注:硬鏈接
-rw-r--r-- 2 root root 20 11月 25 10:12 ansible-copy-link # 注:鏈接為2
符號鏈接數 1 是
rm -rf 刪除的是 文件名 和 磁碟裡面data的鏈接
data還存在於磁碟裡 ,過一段時間 新的數據會覆蓋 data
#注:為1表示刪除後就沒有了,為2表示刪除後還有
六. playbook#
如果 ansible 的各模塊 (能實現各種功能) 是車間裡的各工具;playbook 就是指導手冊,目標遠程主機就是庫存和原料對象
#注:語法 yaml 格式配置
1、playbook 的核心元素
hosts : playbook 配置文件作用的主機
tasks: 任務列表
variables: 變量
templates: 包含模板語法的文本文件
handlers : 由特定條件觸發的任務
roles : 用於層次性、結構化地組織 playbook。roles 能夠根據層次型結構自動裝載變量文件、tasks 以及 handlers 等
2、playbook 運行方式
ansible-playbook --check 只檢測可能會發生的改變,但不真執行操作
ansible-playbook --list-hosts 列出運行任務的主機
ansible-playbook --syntax-check playbook.yaml 語法檢測
ansible-playbook -t TAGS_NAME playbook.yaml 只執行 TAGS_NAME 任務
ansible-playbook playbook.yaml 運行
示例:編寫/執行 playbook
--------------------------------------------------------------------------------------------
#注:把A機器的/etc/passwd複製到其他機器的/tmp/passwd_tmp下
[root@cPen_A ~]# vim ansible_playbook_sc.yaml #注:編寫playbook
- hosts: all
remote_user: root
tasks:
- name: up file
copy: src=/etc/passwd dest=/tmp/passwd_tmp
#執行playbook
[root@cPen_A ~]# ansible-playbook ansible_playbook_sc.yaml
============================================================================================
示例:yaml文件怎麼去編寫
--------------------------------------------------------------------------------------------
#第1步 先安裝python3:yum install python3
#第2步 使用pip3安裝PyYaml模塊
[root@cPen_A ~]# pip3 install PyYaml
[root@cPen_A ~]# python3
>>> import yaml
>>> fp = open("ansible_playbook_sc.yaml")
>>> dict = yaml.load(fp)
>>> dict
[{'hosts': 'all', 'remote_user': 'root', 'tasks': [{'name': 'up file', 'copy': 'src=/etc/passwd dest=/tmp/passwd_tmp'}]}]
#注:使用
1、創建yaml文件
[root@cPen_A ~]# cat ansible_playbook_sc.yaml # 注:類似於字典形式 - 相當於list ;裡面相當於字典
- hosts: all # 注:對所有主機生效(什麼組)
remote_user: root # 注:root用戶執行
tasks: # 注:讓它做什麼事情
- name: up file # 注:事情名字叫up file
copy: src=/etc/passwd dest=/tmp/passwd_tmp # 注:使用copy模塊 執行源 目的地址
2、可以使用Python解析yaml
>>> import yaml
>>> fp = open("ansible_playbook_sc.yaml")
>>> dict = yaml.load(fp)
>>> dict
[{'hosts': 'all', 'remote_user': 'root', 'tasks': [{'name': 'up file', 'copy': 'src=/etc/passwd dest=/tmp/passwd_tmp'}]}]
#注:使用copy模塊 來指定src dest
示例:多個操作
--------------------------------------------------------------------------------------------
[root@cPen_A ~]# vim ansible_playbook_sc.yaml # 注:編寫
- hosts: all
remote_user: root
tasks:
- name: up file
copy: src=/etc/passwd dest=/tmp/passwd_tmp
- name: download redis
yum: name=redis state=installed
- hosts: webser
tasks:
- name: remove file
shell: rm -rf /tmp/passwd_tmp
[root@cPen_A ~]# ansible-playbook ansible_playbook_sc.yaml # 注:運行
七。總結#
ansible 通過常用模塊在命令行就可以針對主機清單來管理配置遠程主機,無需要代理客戶端程序,但需要目標主機有 ssh 和 python2.4+; 基於 ssh 協議既可以通過用戶名和密碼,也可以通過私鑰,推薦使用私鑰;
windows 上需要安裝 powershell 及 winrm 服務也可以做到,關於這方面 可以參考我之前的博客 ansible 自動化管理 windows
通過 ansib-doc 來獲取模塊信息及指定模塊幫助信息;
ansible-playbook 基於 YAML 語法配置;可以對 playbook 文件進行測試,解析並執行應用於指定無端主機;非常方便我們統一編排分發管理遠程主機;
八。練習#
示例:每天凌晨1點 檢查/etc/passwd 文件是否被修改,並且生成檢查報告
示例:編寫腳本 實現ansible node節點(管理的主機)服務器備份 備份/var/log/messages日誌 備份到/backup目錄下,並且取名2020-11-25-01-log.tar.gz,每一個小時執行一次
############################################################################################
示例:每天凌晨1點 檢查/etc/passwd 文件是否被修改,並且生成檢查報告
-----------------------------------------------------------------------------------------------------------
方法1 md5sum 檢查文件是否修改 md5sum -c --status
check_file.sh
md5sum -c --status d.md5 &&echo "文件未被修改" ||echo "文件已被修改"
md5sum /etc/passwd &> d.md5 #注:文件名必須是 d.md5
-----------------------------------------------------------------------------------------------------------
方法2
check_ectpasswd.sh
a='md5sum /etc/passwd' #注:現在的md5值
b='tail -n1 /root/b' #注:上次的md5值
[[ $a==$b ]]&&echo "文件未被修改!" >> /root/c||echo "文件已被修改!" >> /root/c
$a >> /root/b
-----------------------------------------------------------------------------------------------------------
方法3
touch /tmp/passwd.log
touch /tmp/passwd.txt
a=`md5sum /etc/passwd`
b=`md5sum /tmp/passwd.txt`
c=${a:0:32} #注:因為md5sum是任意長度的輸入 固定長度的輸出
d=${b:0:32}
if [ $c = $d ]
then
echo "$(date)文件未被修改" >>/tmp/passwd.log
cat /etc/passwd >/tmp/passwd.txt
else
echo "$(date)文件已被修改" >>/tmp/passwd.log
cat /etc/passwd >/tmp/passwd.txt
fi
===========================================================================================================
ansible_playbook_zuoye.yaml
- hosts: all
remote_user: root
tasks:
- name: check file
cron: hour=1 day=*/1 job='/usr/bin/bash ~/check_file.sh'
#注:需要把腳本file到各個虛擬機,沒有寫這一步
示例:編寫腳本 實現ansible node節點(管理的主機)服務器備份 備份/var/log/messages日誌 備份到/backup目錄下,並且取名2020-11-25-01-log.tar.gz,每一個小時執行一次
- hosts: all
remote_user: root
tasks:
- name: backup messages
cron: hour=1 job='tar czf /backup/$(date +%Y-%m-%d-%H-log.tar.gz) /var/log/messages'
示例:md5sum 檢查文件是否修改 md5sum -c --status
[root@cPen_A lianxi]# man md5sum
-c, --check
read MD5 sums from the FILEs and check them
--status
don't output anything, status code shows success
[root@cPen_A lianxi]# md5sum /etc/passwd > d.md5 #注:寫進這個文件 文件名必須是這個 不能變
[root@cPen_A lianxi]# cat d.md5
28b2503e7fb565ddc0b8ec1f9ad6a9c7 /etc/passwd
[root@cPen_A lianxi]# md5sum -c --status d.md5 #注:檢查文件是否修改
[root@cPen_A lianxi]# echo $? #注:文件未修改,返回0
0
[root@cPen_A lianxi]# useradd chen223344
[root@cPen_A lianxi]# md5sum -c --status d.md5
[root@cPen_A lianxi]# echo $? #注:文件修改,返回1
1