運維05:自動化

人工運維時代

運維人員早期需要維護眾多的機器,因此需要執行很多重復的勞動,很多機器需要同時部署相同的服務或者是執行相同的命令,還得反復地登錄不同的機器,執行重復的動作

自動化運維時代

早期運維人員會結合ssh免密登錄,以及shell腳本來完成自動化的部署操作

系統管理員面臨的問題主要是:配置管理系統、遠程執行命令、批量安裝服務,啟停服務等等

后來也誕生了眾多的自動化運維軟件,比如 Ansible

自動化運維的好處

  • 減少重復的操作,提高工作效率
  • 減少了人為出錯的可能性
  • ansible支持數據化管理,數據化追源,找到問題的源頭

?Ansible介紹

ansible是一個同時管理多個遠程主機的軟件,必須是任意可以通過ssh登錄的機器,因為ansible可以管理的機器,包括:

  • 遠程虛擬機
  • 物理機
  • 本機機器

ansible通過ssh協議實現了,管理節點(安裝了ansible服務的機器)和被管理節點的通信。

只要是通過ssh協議登錄的主機,就可以完成ansible自動化部署操作

  • 批量文件分發
  • 批量數據復制
  • 批量數據修改、刪除
  • 批量自動化安裝軟件服務
  • 批量服務啟動、停止
  • 腳本化,自動批量服務部署

ansible特點

  • 安裝部署簡單
  • 管理主機便捷、支持多臺主機并行管理
  • 無須安裝被管理節點的客戶端(no agent),且無需占用客戶端的其他端口,僅僅使用ssh服務即可
  • 不僅僅支持python,還支持其他語言的二次開發
  • 不用root用戶也可執行,降低系統權限

Ansible實踐部署

  • 準備好虛擬機?

準備好3個Linux虛擬機,配置在同一個局域網內,然后設置好靜態ip地址

childA? ? ? ? 192.168.xxx.129????????????????被管理機器

childB? ? ? ??192.168.xxx.130? ? ? ? ? ? ? ? 被管理機器(配置好ssh服務,以及關閉防火墻等等)

master01? ?192.168.xxx.128? ? ? ? ? ? ? ? 管理機器(安裝了ansible的服務器)?

  • 先準備ansible管理機器
#選擇yum自動化安裝(前提:已經安裝好了阿里云yum、epel源)
yum install epel-release
yum install ansible#檢查ansible軟件安裝情況,查詢配置文件和可執行命令
rpm -ql ansible | grep -E '^/etc|^/usr/bin'#檢查ansible版本
ansible --version
  • 再準備ansible被管理機器
yum install epel-release libselinux-python -y

Ansible管理方式

ansible管理主機的方式有2種

  • 傳統的輸入ssh密碼驗證
  • 密鑰管理

配置好ansible的配置文件,添加被管理機器的ip地址,或者主機名

#主節點備份現有的配置文件
cp /etc/ansible/hosts /etc/ansible/hosts.ori#添加ansible需要管理的機器地址(節點A和節點B的ip地址)
[root@192 ansible]# vim hosts
[root@192 ansible]# tail -3 /etc/ansible/hosts
[qiujie]
192.168.xxx.129
192.168.xxx.130

ssh密碼認證方式管理機器

ansible是直接利用linux本地的ssh服務,以及一些遠程的ssh操作,一般情況下客戶端的ssh服務默認都是開啟的,無須額外管理

步驟:

①在master01機器上,執行如下命令

#在主機器上,告訴其他被管理的機器,你要執行什么命令,以及用什么用戶去執行
ansible qiujie -m command -a 'hostname' -k -u root

qiujie? ? /etc/ansible/hosts 文件中定義的主機組,還可以寫主機的ip地址,以及通配符

-m? ? ? ? 指定功能模塊,默認就是command模塊

-a? ? ? ? ?告訴模塊需要執行的參數

-k? ? ? ? ?詢問密碼驗證

-u? ? ? ? ?指定運行的用戶

運行命令之后報錯了:?

報錯原因:

使用了密碼方式登錄,在主機Host Key檢查激活情況下,sshpass不支持該用法,得在master01機器的 ~/.ssh/known_hosts 文件中,添加客戶端機器的指紋密鑰

?②手動ssh登錄,對主機進行連接,即可使用ansible命令操作了

ssh root@192.168.xxx.129
ssh root@192.168.xxx.130

連接之后,再查看? ~/.ssh/known_hosts 文件,發現

③此時可以在master01機器上,再次執行ansible命令

ansible qiujie -m command -a 'hostname' -k -u root

配置免密登錄

每次執行ansible命令的時候,都需要輸入ssh的認證密碼,也就是root密碼,如果不同的主機密碼不一樣,那你還得輸入多次才行。因此,我們可以配置如下的快捷登錄方式

  • ansible自帶的密碼認證參數
#可以在 /etc/ansible/hosts文件中,定義密碼即可實現快速認證,遠程管理主機
#修改后的內容如下:
[qiujie]
192.168.186.129 ansible_user=root ansible_ssh_pass=111111
192.168.186.130 ansible_user=root ansible_ssh_pass=111111

ansible_host? ? ? ? ? ? ? ?主機地址

ansible_port? ? ? ? ? ? ? ? 端口,默認是22端口

ansible_user? ? ? ? ? ? ? ?認證的用戶

ansible_ssh_pass? ? ? ?用戶認證的密碼

執行ansible命令(這次后面?-k -u root 那段參數就不用加了,它會自動執行配置文件中設置的賬號和密碼)?

ansible qiujie -m command -a 'hostname'
  • ssh密鑰方式批量管理主機

這個方式比起hosts文件的密碼參數來的更安全放心

#在master01機器上創建ssh密鑰對
ssh-keygen -f ~/.ssh/id_rsa -P "" > /dev/null 2>&1#檢查公私鑰文件
[root@master01 ~]# cd ~/.ssh/
[root@master01 .ssh]# ls
id_rsa  id_rsa.pub  known_hosts

編寫公鑰分發腳本

創建公鑰分發腳本mkdir /myshcd?/myshtouch ssh_key_send.shvim ssh_key_send.sh

腳本具體內容如下:?

#!/bin/bash
rm -rf ~/.ssh/id_rsa*
ssh-keygen -f ~/.ssh/id_rsa -P "" > /dev/null 2>&1
SSH_Pass=123123
Key_Path=~/.ssh/id_rsa.pub
for ip in 129 130
dosshpass -p$SSH_Pass ssh-copy-id -i $Key_Path "-o StrictHostKeyChecking=no" 192.168.xxx.$ip
done
#非交互式分發公鑰命令需要用sshpass指定SSH密碼,通過 -o StrictHostKeyChecking=no 跳過SSH確認連接信息
#執行
sh ssh_key_send.sh#然后直接使用以下命令連接childA和childB節點,這樣不需要輸入密碼
ssh -o ' StrictHostKeyChecking=no' '192.168.xxx.129'
ssh -o ' StrictHostKeyChecking=no' '192.168.xxx.130'

ansible模式

ansible實現批量化管理主機的模式,主要有2種

  • ad-hoc模式:利用ansible的純命令行實現批量管理
  • playbook劇本模式:利用ansible的playbook劇本實現批量管理

ansible-doc命令

列出ansible支持的所有模塊

ansible-doc -l

查看某個模塊的具體用法參數

ansible-doc -s command

Ansible模塊精講

1、command模塊

  • 作用:在遠程節點上執行一個命令

chdir? ? ? ? ? ? ? ? 在執行命令之前,先通過cd進入該參數指定的目錄

creates? ? ? ? ? ? 在創建一個文件之前,判斷該文件是否存在,如果存在了則跳過前面的動作,如果不存在,則執行前面的動作

free_form? ? ? ? ?該參數可以輸入任何的系統命令,實現遠程執行和管理

removes? ? ? ? ? ?定義一個文件是否存在,如果存在則執行前面的動作,如果不存在則跳過

command模塊是ansible默認的基本模塊,也可以省略不寫,但是要注意如下的坑:

使用command模塊,不得出現shell變量,比如$name,也不得出現特殊符號,比如?> < | ; &?這些符號command模塊都不認識,如果你想用前面指定的變量、特殊符號,請使用shell模塊

  • command模塊案例

?獲取所有被管理機器的負載信息

ansible qiujie -m command -a 'uptime'

讓客戶端機器,先切換到 /tmp 目錄下,然后打印當前的工作目錄

ansible qiujie -m command -a "pwd chdir=/tmp"

讓客戶端機器,判斷 /qiujie 文件是否存在,如果不存在就打印當前路徑,存在就跳過

ansible qiujie -m command -a "pwd creates=/qiujie"

讓客戶端機器,判斷/aaa目錄是否存在,如果存在就列出/aaa目錄下的所有東西,不存在就跳過

 ansible qiujie -m command -a "ls /aaa   removes=/aaa"

warn參數,是否提供警告信息

#執行命令,并且不提示報錯信息
ansible qiujie -m command -a "chmod 000 /etc/hosts warn=false"

shell模塊

批量查詢進程信息

ansible qiujie -m shell -a "ps -ef | grep vim"

批量在客戶端機器,創建寫入文件信息

ansible qiujie -m shell -a "echo 你真棒 > /tmp/heihei.txt"

批量執行腳本

#需要執行的這個腳本,必須在客戶端機器上存在,否則會報錯,這是shell模塊的特點
#因為還有一個專門執行腳本的script模塊1.創建文件夾
2.創建sh腳本文件,還要寫入腳本內容
3.賦予腳本可執行權限
4.執行腳本,并且忽略warning信息ansible qiujie -m shell -a "mkdir -p /server/myscripts;    echo 'hostname' > /server/myscripts/hostname.sh;   chmod +x /server/myscripts/hostname.sh warn=false"

script 模塊

功能:把 master01 管理機器上的腳本,遠程地傳輸到被管理的節點上執行

比起shell模塊,script模塊功能更強大,在master01機器本地有一份腳本,就可以在所有被管理節點上去運行

1.在管理節點上創建腳本
[root@master01 /]# mkdir /myscripts
[root@master01 /]# cd /myscripts
[root@master01 myscripts]# echo -e "pwd\nhostname" > /myscripts/local_hostname.sh 
[root@master01 myscripts]# cat /myscripts/local_hostname.sh 
pwd
hostname2.授權
[root@master01 myscripts]# chmod +x /myscripts/local_hostname.sh

遠程地批量執行腳本,并且在客戶端上不需要存在該腳本

myscripts]# ansible qiujie -m script -a "/myscripts/local_hostname.sh"

利用script模塊,可以批量讓所有被管理的機器執行腳本,且該腳本不需要在被管理的客戶端上存在

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212002.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212002.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212002.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java基礎——對象類型轉換(向上、向下轉型)

非繼承關系的類之間對象類型不可以互相類型轉換&#xff0c;只有繼承關系才可以互相轉換。 簡單說&#xff0c;對象類型轉換的前提要是繼承關系。 對象類型轉換分為&#xff1a;向上轉型和向下轉型。多態就是一種自動向上轉型。 向上轉型&#xff1a;子類對象用父類類型接收…

Leetcode 2963. Count the Number of Good Partitions

Leetcode 2963. Count the Number of Good Partitions 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;2963. Count the Number of Good Partitions 1. 解題思路 這一題根據題意&#xff0c;顯然我們可以將其先分為 n n n個原子partition&#xff0c;確保任意兩個partition之間…

git 常用的使用方法

1.查看分支 $ git branch #查看本地分支 $ git branch -r #查看遠程分支 $ git branch -a #查看所有分支 $ git branch -vv #查看本地分支及追蹤的分支 2.創建分支 方法1 $ git branch 分支名 #創建本地分支 #將本地分支push&#xff0c;就創建了遠程分支方法2 #創建本地分…

載入了名字空間‘htmltools’ 0.5.6,但需要的是>= 0.5.7解決方案

解決方案&#xff1a;刪除之前的舊版本安裝包&#xff0c;安裝新的包 1.卸載之前的安裝包 2.關閉R&#xff0c;重新打開 3. # install.packages("htmltools") library(htmltools)

Java 并發編程(一)

1、在 java 中守護線程和本地線程區別&#xff1f; java 中的線程分為兩種&#xff1a;守護線程&#xff08;Daemon&#xff09;和用戶線程&#xff08;User&#xff09; 任何線程都可以設置為守護線程和用戶線程&#xff0c;通過方法 Thread.setDaemon(boolon)&#xff1b;tru…

HarmonyOS學習--了解基本工程目錄

1.工程級目錄 工程的目錄結構如下&#xff1a; 其中詳細如下&#xff1a; AppScope中存放應用全局所需要的資源文件。entry是應用的主模塊&#xff0c;存放HarmonyOS應用的代碼、資源等。oh_modules是工程的依賴包&#xff0c;存放工程依賴的源文件。build-profile.json5是工…

如何找到MACOS系統更新的安裝包

首先在應用商店中下載新系統的安裝包&#xff0c;然后在設置中不要點安裝&#xff0c;會自動跳出安裝的界面&#xff0c;不要關閉界面&#xff0c;打開命令行用root權限輸入命令cat /var/log/install.log | grep *.dmg&#xff0c; 就會顯示 sh-3.2# cat /var/log/install.log …

算法基礎十

加一 給定一個由 整數 組成的 非空 數組所表示的非負整數&#xff0c;在該數的基礎上加一。最高位數字存放在數組的首位&#xff0c; 數組中每個元素只存儲單個數字。 示例 1&#xff1a; 輸入&#xff1a;digits [1,2,3] 輸出&#xff1a;[1,2,4] 解釋&#xff1a;輸入數組表…

YOLO_embedded: YOLO算法快速嵌入式部署

YOLO_embedded&#xff1a; YOLO算法快速嵌入式部署 for UbuntuBased on YOLOXOpenVINO & TensorRT 本項目提供c和python兩種語言&#xff0c;詳情請見各個文件夾下的README.md 安裝OpenVINO 點此進入官網選擇版本進行下載&#xff0c;然后打開install_openvino.sh將相…

ORACLE 19c 統一恢復處于ASM中的CDB含PDB數據文件到某一個文件目錄下面

NOCDB情況下&#xff0c;要把ASM中的文件恢復到文件系統&#xff0c;大家都知道分別設置每個文件的路徑即可&#xff0c;但如果是租戶環境&#xff0c;每個PDB都有不同路徑&#xff0c;而且每個PDB都有SYSTEM&#xff0c;SYSAUX等一些表空降&#xff0c;不可能放在同一個目錄中…

Linux_CentOS_7.9 VNC安裝卸載以及相關配置開機自啟動服務簡易記錄

VNC安裝卸載以及相關配置開機自啟動服務&#xff1a; 查看環境&#xff1a;&#xff08;yum鏡像源配置可以參考我之前文章里面有詳細參考http://t.csdnimg.cn/mzGoI&#xff09; [rootorcl238 ~]# rpm -qa | grep vnc ##查看系統現有VNC軟件版本 gtk-vnc2-0.7.0-3.el7.x86…

道可云元宇宙每日資訊|青島市元宇宙領域新產品推介暨產學研對接會舉行

道可云元宇宙每日簡報&#xff08;2023年12月7日&#xff09;訊&#xff0c;今日元宇宙新鮮事有&#xff1a; 青島市元宇宙領域新產品推介暨產學研對接會舉行 為加快推動青島市元宇宙技術和產業創新&#xff0c;引領下一代互聯網發展&#xff0c;青島市元宇宙領域新產品推介暨…

算法基礎九

螺旋矩陣2 給你一個正整數 n &#xff0c;生成一個包含 1 到 n2 所有元素&#xff0c;且元素按順時針順序螺旋排列的 n x n 正方形矩陣 matrix。 示例 1&#xff1a; 輸入&#xff1a;n 3 輸出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]] 示例 2&#xff1a; 輸入&#xff1a;n …

第12節: Vue3 修飾符

如何在UniApp中使用Vue3框架使用修飾符&#xff1a; <template> <view> <button click"toggleVisibility ^ :disabledisDisabled">點擊切換顯示狀態</button> <text>{{ isVisible ? 顯示 : 隱藏 }}</text> </view> …

簡易加減運算器的制作----數字電路設計(含proteus仿真)

簡易加減運算器的制作 一、功能要求—基本功能 1、自制0-9按鍵&#xff0c;在一個LED數碼管上穩定地顯示當前按下的值。&#xff08;基本功能&#xff09; 2、增加、兩個按鍵&#xff0c;實現0-9兩個一位數的加法運算&#xff0c;同時在兩位LED上穩定地顯示運算結果。&#…

React中每次渲染都會傳入一個新的props.children到子組件?

傳入props.children后, 為什么會導致組件的重新渲染&#xff1f; 問題描述 在 react 中, 我想要對組件的渲染進行優化, 遇到了一個非常意思的問題, 當我向一個組件中傳入了 props.children 之后, 每次父組件重新渲染都會導致這個組件的重新渲染; 它看起來的表現就像是被memo包…

MTU與MSS

MTU&#xff1a;一個網絡包的最大長度&#xff0c;以太網中一般為1500各字節。 MSS&#xff1a;除去頭部之后&#xff0c;一個網絡包所能容納的TCP數據的最大長度。 應用程序調用write后&#xff0c;將要發送的數據被交給TCP/IP協議棧進行。 協議棧不關心應用的數據內容&…

四:爬蟲-Cookie與Session實戰

四&#xff1a;Cookie與Session實戰 ? 在瀏覽網站的過程中&#xff0c;我們經常會遇到需要登錄的情況&#xff0c;有些頁面只有登錄之后才可以訪問。在登錄之后可以連續訪問很多次網站&#xff0c;但是有時候過一段時間就需要重新登錄。還有一些網站&#xff0c;在打開瀏覽器…

c語言歸并排序(詳解)

歸并排序是一種分治算法&#xff0c;它將列表分割成較小的子列表&#xff0c;然后遞歸地對子列表進行排序&#xff0c;最后將這些子列表合并以產生已排序的列表。基本概念包括&#xff1a; 分割&#xff1a;將列表分割成較小的子列表&#xff0c;直到子列表的長度為1或0。排序…

Leetcode—219.存在重復元素II【簡單】

2023每日刷題&#xff08;五十三&#xff09; Leetcode—219.存在重復元素II 實現代碼 class Solution { public:bool containsNearbyDuplicate(vector<int>& nums, int k) {unordered_map<int, int> m;int n nums.size();for(int i 0; i < n; i) {if(m…