一、認識自動化運維
假如管理很多臺服務器,主要關注以下幾個方面“
1.管理·機與被管理機的連接(管理機如何將管理指令發送給被管理機)
2.服務器信息收集(如果被管理的服務器有centos7.5外還有其它linux發行版,如suse,ubuntu等。當你要做的事情在不同os上有所不同,你需要收集信息,并將其分開處理)
3.服務器分組(因為有些時候我要做的事情不是針對所有服務器,可能只針對某一個分組)
4.管理內容的主要分類
文件目錄管理(包括文件的創建,刪除,修改,查看狀態,遠程拷貝等)
用戶和組管理
cron時間任務管理
yum源配置與通過yum管理軟件包
服務管理
遠程執行腳本
遠程執行命令
二、ansilble
2.1 ansible環境搭建
1.靜態ip
2.主機名及主機名互相綁定
3.關閉防火墻,selinux
4.時間同步
5.確認和配置yum源(需要epel源)
實驗過程:
第一步:管理機上安裝ansible,被管理節點必須打開ssh服務
yum install epel-release
yum install ansible
ansible --version
第二步:實現master對agent的免密登錄。只在master上做。(如果這一步不做,則在后面操作agent時要加-k參數傳密碼;或者在主機清單里傳密碼
ssh-keygen
ssh-copy-id -i 192.168.124.131
ssh-copy-id -i 192.168.124.132
第三步:在master上定義主機組,并測試連接性
【group】
192.168.124.131
192.168.124.132
2.2服務器分組
ansible通過一個主機清單功能來實現服務器分組
ansible的默認主機清單配置文件為/etc/ansible/hosts
示例:
[nginx] 組名
apache[1:10].aaa.com 表示apache1.aaa.com到apache10.aaa.com這10臺機器
nginx[a:z].aaa.com 表示nginxa.aaa.com到nginxz.aaa.com共26臺機器
10.1.1.[11:15] 表示10.1.1.11到10.1.1.15這5臺機器10.1.1.1:2222 設置端口為2222定義10.1.1.12:2222這臺服務器的別名為nginx1
nginx1 ansible_ssh_host=10.1.1.12 ansible_ssh_port=2222沒有做免密登錄的服務器可以指定用戶名和密碼
nginx1 absible_ssh_host=10.1.1.12 ansible_ssh_port=2222 ansible_ssh_user=root ansible_-ssh_pass="123456"利用別名來分組
nginx1 ansible_ssh_host=10.1.1.12 ansible_ssh_port=2222 ansible_ssh_user=root ansible_ssh_pass="123456"
nginx2 ansible_ssh_host=10.1.1.13[nginx]
nginx1
nginx2
2.3ansible模塊
ansible是基于模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是absible所運行的模塊,ansible只是提供一種框架。
ansible支持的模塊非常的多,我們并不需要把每個模塊都記住,而是只需要熟悉一些常見的模塊,其他的模塊在需要用到時查詢即可
2.3.1查看所有支持的模塊
ansible-doc -l
2.3.2hostname模塊
hostname模塊用于修改主機名(注意:他不能修改/etc/hosts文件)
將其中一臺遠程主機名修改為agent1.cluster.com
master# ansible 192.168.124.131 -m hostname -a 'name=agent1.cluster.com'
基本格式為:ansible 操作的機器名或組名 -m 模塊名 -a "參數1=值1 參數2=值2"
2.3.3file模塊(重點)
創建目錄
刪除:
2.3.4copy模塊(重點)
copy模塊用于對文件的遠程拷貝操作(如把本地的文件拷貝到遠程的機器上)
在master上準備一個文件,拷貝此文件到group1的所有機器上
copy模塊拷貝時要注意拷貝目錄后面是否帶"/"符號
/etc/yum.repos.d后面不帶/符號,則表示把/etc/yum.repos.d整個目錄拷貝到/tmp/目錄下
master# ansible group1 -m copy -a 'src=/etc/yum.repos.d dest=/tmp/'
/etc/yum.repos.d/后面帶/符號,則表示把/etc/yum.repos.d/目錄里面的所有文件拷貝到/tmp/目錄下
master# ansible group1 -m copy -a 'src=/etc/yum.repos.d/ dest=/tmp/'
2.3.5stat模塊(了解)
stat模塊類似于linux的stat命令,用于獲取文件的狀態信息
獲取/etc/fstab文件的狀態信息
2.3.6template模塊(擴展)
與copy模塊功能幾乎一樣
template模塊首先使用變量渲染jinjia2模版文件成普通文件,然后再復制過去,而copy模塊不支持。(jinja2是一個基于python的模版引擎)
master# ansible -m template group1 -a "src=/etc/hosts dest=/tmp/hosts"
template模塊不能拷貝目錄
master# ansible -m template group1 -a "src=/etc/yum.repos.d/ dest=/etc/yum.repos.d/"
2.3.7fetch模塊
fetch模塊與copy模塊類似,但作用相反。用于把遠程機器的文件拷貝到本地。
第一步:在兩臺被管理機上分別創建一個同名文件(但內容不同)
agent1# echo 12345 > /tmp/1.txt
agent2# echo 54321 > /tmp/1.txt
第二步:從master上fetch文件(因為group1里有2臺機器,為了避免同名文件沖突,它使用了不同的目錄
master# ansible group1 -m fetch -a 'src=/tmp/1.txt dest=/tmp/'
第三步:先刪除上面fetch過來的,然后嘗試只fetch其中一臺機器的,也會使用名稱來做子目錄區分
master# rm /tmp/10.1.1.* -rfmaster# ansible 10.1.1.12 -m fetch -a 'src=/tmp/1.txt dest=/tmp/'
注意:fetch模塊不能從遠程拷貝目錄到本地
2.3.8user模塊
user模塊用于管理用戶賬號和用戶屬性
ansible group1 -m user -a "name=zhangsan uid=1004 home=/home/hhh shell=/bin/false command=@_@"
刪除用戶以及家目錄
ansible group1 -m user -a "name=zhangsan state=absent remove=yes"
2.3.9group模塊
創建組
ansible group1 -m group -a "name=admins gid=5000"
刪除組
ansible group1 -m group -a "name=admins state=absent"
2.3.10cron模塊
cron模塊用于管理周期性時間任務
創建一個cron任務,不指定suer的話,默認就是root(因為我這里是用root操作的)
如果minute,hour,day,month,week不指定的話,默認都為*
master# ansible group1 -m -cron -a 'name="test cron1" user=zhangsan job="touch /tmp/111" minute=*/2'
刪除cron任務
master #ansible group1 -m -cron -a 'name="test cron1" state=absent'
2.3.11yum模塊(重點)
yum模塊用于使用yum命令來實現軟件包的安裝與卸載
使用yum安裝一個軟件(前提:group1的機器上的yum配置都已經ok)
master#ansible group1 -m yum -a 'name=vsfpd state=present'
使用yum安裝httpd,http-devel軟件,state=latest表示安裝最新版本
master#ansible group1 -m yum -a 'name=httpd,httpd-devel state=latest'
使用yum卸載httpd,httpd-devel軟件
master#ansible group1 -m yum -a 'name=httpd,httpd-devel state=absent'
2.3.12service模塊
service模塊用于控制服務的啟動,關閉,開機自啟動等
啟動vsftpd服務,并設為開孔自動啟動
master# ansible group1 -m service -a 'name=vsftpd state=started enabled=on'
2.3.13script-command-shell模塊
script模塊用于在遠程機器上執行本地腳本
master# ansible group1 -m script -a '/tmp/xxx.sh'
command和shell模塊都是用于執行linux命令的,這對于熟悉的工程師來說,用起來非常high
shell模塊與command模塊差不多(command模塊不能執行一些類似于¥HOME,>,<,|等符號,但Shell可以)
master# ansible -m command group1 -a "useradd user2"
master# ansible -m command group1 -a "id user2"master# ansible -m command group1 -a "cat /etc/passwd |wc -l" --報錯
master# ansible -m shell group1 -a "cat /etc/passwd |wc -l" --成功