1. 程式人生 > >Ansible批量自動化管理工具入門

Ansible批量自動化管理工具入門

這樣的 ase 更新 系統版本 roo art 啟動服務 移除 nag

一、虛擬機版本

1、需要利用7.5版本虛擬機
2、7.5版註意事項:

【2.1】、網卡名叫ens32同樣配置文件也是ens32
【2.2】、命令:systemctl 統一管理命令,
例,systemctl stop iptables.service 關閉防火墻
【2.3】、設置開機自啟動防火墻:systemctl  enable firewalld
【2.4】、設置開機關閉防火墻(必須關閉)   :systemctl disable firewalld 
【2.5】、必    須     關     閉      :systemctl disable  NetworkManager
【2.6】、yum得配置文件全部可以用
【2.7】、重啟虛擬機,ifup ens32 啟動網卡來獲取ip

二、常見的批量管理工具

生產環境Ansible管理服務器ssh登陸安全策略
1、ansible (非常簡單,很多企業都在用) 適用於管理500臺以下的服務器,特點是一臺虛擬機管理多臺虛擬機,不需要安裝任何客戶端。利用得是ssh通道,操控要用免密鑰。

1.1、安裝ansible軟件同時會自動安裝sshpass
yum -y install epel-release
yum -y install ansible
1.2、修改ssh登錄
1.2.1、vim /etc/ssh/ssh_config 修改第35行 StrictHostKeyChecking ask改為no
1.2.2、vim /etc/ssh/sshd_config 
第17行  #Port 22   #修改ssh連接端口 (工作中改成一萬以上)
第38行  #PermitRootLogin yes    #是否允許root賬號遠程登陸 (工作中必須關閉)
第43行  #PubkeyAuthentication yes   #是否開啟公鑰連接認證 (工作中開啟)
第47行  AuthorizedKeysFile  .ssh/authorized_keys    #公鑰文件的放置位置 
第65行  PasswordAuthentication yes  #是否開啟密碼驗證登陸 
第79行  GSSAPIAuthentication yes    #是否關閉GSSAPI認證 (工作中關閉)提高ssh解析速度
第115行  #UseDNS yes                 #是否關閉DNS反向解析 (關閉) 加快ssh得連接速度
1.2.3、ansible配置文件 /etc/ansible/hosts
/etc/ansible/hosts
vim /etc/ansible/hosts
[nginx]
WebA ansible_ssh_host=IP地址
WebB ansible_ssh-host=IP地址

三、模塊使用

一、ansible <被操控的主機或主機組或all> [-m 模塊名] [-a 具體命令]

二、/etc/ansible/hosts文件中可以定義被管理主機,Ansible通過讀取/etc/ansible/hosts文件內定義的主機清單批量做一些操作。比如定義一個nginx組,包含一臺主機Web01,再定義一個apache組,包含另一臺主機Web02.

[root@ansible ~]# cat /etc/ansible/hosts
[nginx]
Web01 ansible_ssh_host=192.168.200.184
Web02 ansible_ssh_host=192.168.200.185

說明:
ansible_ssh_host:被管理主機IP
ansible_ssh_user:被管理主機用戶名
ansible_ssh_pass:被管理主機用戶的登陸密碼
ansible_sudo_pass:被管理主機用戶sudo時的密碼

三、設置SSH免密碼登陸

為了避免Ansible下發指令時需要輸入被管理主機的密碼,可以通過證書簽名達到SSH無密碼登陸。使用ssh-keygen產生一對密鑰,並通過ssh-copy-id命令來發送生成的公鑰。

[root@ansible ~]# ls ~/.ssh/
authorized_keys  id_rsa  id_rsa.pub
[root@ansible ~]# ssh-copy-id 192.168.200.184
[root@ansible ~]# ssh-copy-id 192.168.200.185

四、ansible查看幫助

[root@ansible ~]# /usr/local/python/bin/ansible-doc -l 查看總幫助
[root@ansible ~]# /usr/local/python/bin/ansible-doc -s shell 查看shell模塊的幫助

1、ping模塊:Ansible中使用ping模塊來檢測指定主機的連通性

【1】、Ansible中使用ping模塊來檢測指定主機的連通性
ansible Web01 -m ping
綠色表示連通的,紅色表示不通
只要做了免密鑰就可以直接登錄用戶。ansible 被管理範圍 -m 模塊名  -a 具體命令
【2】、saltstack (復雜)適用於管理1000-40000臺服務器
【3】、puppet(超級復雜)

2、command模塊:在遠程主機執行命令,不支持管道符和重定向等復雜命令,可完全被shell模塊替代

例:ansible Web01 -m command -a ‘hostname -I‘
查看Web01服務器的ip地址

3、shell模塊:Ansible中的shell模塊可以在被管理主機上運行命令,並支持像管道符重定向這樣的復雜命令。

例1:ansible Web01 -m shell -a ‘useradd yunjisuan‘
在Web01上創建用戶yunjisuan
例2:ansible Web01 -m shell -a ‘echo 123123 | passwd --stdin yunjisuan‘
給Web01上yunjisuan用戶非交互方式設定密碼

4、cron模塊:Ansible中的cron模塊用於定義任務計劃。主要包括兩種狀態(state);

【4.1】crontab時間周期: 如果不指定周期,默認是*號
minute:分鐘
hour:小時
day:日期
month:月份
weekday:周期
【4.2】crontab任務: 
job:指明運行的命令是什麽
【4.3】crontab任務描述: 必須寫
name:定時任務描述(定時任務清除的依據)
【4.4】state狀態: 添加或刪除定時任務,不寫默認是添加
present:表示添加(省略狀態時默認使用);
absent:表示移除;
【4.5】crontab任務的用戶身份: 
user:指定定時任務以哪個用戶身份執行,如果不指定默認是root用戶

例1、添加定時任務計劃,在所有被管理的主機裏每十分鐘輸出hello字符串,定時任務描述為test cron job
ansible all -m cron -a ‘minute="*/10" job="/bin/echo hello" name="test cron job"‘

例2、刪除描述為test cron job的定時任務
ansible all -m cron -a ‘minute="*/10" job="/bin/echo hello" name="test cron job" state=absent‘

例3、給Web01服務器上的普通用戶yunjisuan添加一個定時任務
ansible all -m cron -a ‘minute="*/10" job="/bin/echo hello" name="test cron job"   user="yunjisuan"‘

5、copy模塊:Ansible中的copy模塊用於實現文件復制和批量下發文件。其中使用src來定義本地源文件路徑;使用dest定義被管理主機文件路徑;backup=yes表示備份以下對方的文件。使用content則是使用指定信息內容來生成目標文件。

例1、把WebB服務器上的/tmp/test目錄復制到/root/下
ansible WebB -m copy -a ‘src=/tmp/test  dest=/root’

例2、把WebB服務器上的/tmp/test目錄備份一下在復制到/root/下
ansible WebB -m copy -a ‘src=/tmp/test  dest=/root  backup=yes’

6、script模塊:Ansible中的script模塊可以將本地腳本復制到被管理主機的內存中並運行,不會在被管理主機中留下腳本文件。

例1、編寫一個腳本,然後通過ansible的script模塊遠程向被管理主機執行此腳本
echo ‘echo "1111" >> /tmp/test‘ >> /tmp/test.sh
ansible WebA -m script -a ‘/tmp/test.sh‘

7、 yum模塊:利用yum模塊安裝軟件包,雖然能被shell模塊替代
但是用yum模塊更顯專業一些

【7.1】軟件包名: 
name:指定軟件包的名字
state狀態: 
present:安裝軟件包(默認就是這個)
absent:卸載軟件包

例1、安裝nmap軟件包
ansible all -m yum -a ‘name=nmap‘

例2、卸載nmap軟件包
ansible all -m yum -a ‘name=nmap state=absent‘

8、service模塊:利用service模塊管理服務程序,雖然能被shell模塊替代
但是用service模塊更顯專業一些

【8.1】服務名稱: 
name:指定服務的名字
【8.2】state狀態: 
started:啟動服務
stopped:停止服務
restarted:重啟服務
reloaded:平滑重載
【8.3】enabled開機自啟動: 
true:設置開機自啟動
false:設置開啟不啟動
例1、啟動firewalld並設置開機自啟動
ansible Web01 -m service -a ‘name=firewalld state=started enabled=true‘

例2、關閉firewalld並設置開機不啟動
ansible Web01 -m service -a ‘name=firewalld state=stopped enabled=false‘

9、user模塊:用戶管理模塊。管理用戶賬號,批量創建用戶

【9.1】指定用戶名 
name:指定操作的用戶的名字
【9.2】用戶描述 
comment:指定用戶的描述信息
【9.3】createhome:是否創建家目錄
【9.4】uid:指定用戶的uid號
【9.5】groups:指定用戶的附加組(默認創建和用戶名相同的組)
【9.6】password:指定用戶的密碼
【9.7】update_password:更新用戶的密碼
【9.8】shell指定用戶的登陸方式 
/bin/bash:能登錄系統
/sbin/nologin:不能登錄系統
【9.9】home:指定用戶的家目錄路徑
【9.10】state狀態: 
present:創建用戶(默認就是這個)
absent:刪除用戶
【9.11】remove:當指定state=absent時,確認是否刪除用戶家目錄 
true
false

例1、在Web02上創建一個普通用戶yunjisuan,並設置用戶的密碼為123123
ansible Web02 -m user -a ‘name=yunjisuan comment="welcom to yunjisuan" uid=1066  password=123123 shell=/bin/bash home=/home/yunjisuan‘

註:利用ansible的user模塊狀態用戶時要註意在password參數的後邊添加密文,否則不能登陸用戶 
通過Python的pip程序安裝passlib即可為密碼加密
例2、安裝Python2的pip工具,並通過pip工具安裝Python的加密模塊來給密碼加密
yum -y install epel-release
yum -y install python2-pip
pip install passlib (python裝一個支持程序passlib)

生成密文密碼
python -c "from passlib.hash import sha512_crypt;import getpass;print sha512_crypt.encrypt(getpass.getpass())"

Password:       #輸入你想要加密的密碼
$6$rounds=656000$Tw15COd8DLh/VS94$Mcmz/8CcjBKiEl0mYHcOQQCxEA5mz66EcGH2qXVk6o.Sm7FsRS.DsDVy6ET8iI6jDa045I94slZqWFwyYnRSW1          #加密後的密碼

把加密的暗文復制到剛才password=暗文

例2、刪除之前創建的yunjisuan用戶,並刪除它的家目錄
ansible Web02 -m user -a ‘name=yunjisuan state=absent remove=true‘

10、setup模塊:Ansible中使用setup模塊收集,查看被管理主機的facts(facts是Ansible采集被管理主機設備信息的一個功能)。每個被管理主機在接收並運行管理命令之前,都會將自己的相關信息(操作系統版本,IP地址等)發送給控制主機

例1、查看所有遠程主機的facts信息
ansible all -m setup | head     (all表示所有)

Ansible批量自動化管理工具入門