mycpen

Mycpen

记录学习历程与受益知识
github
telegram
bilibili

23_Linux基礎-ansible2

一。雲計算#

雲計算
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
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。