Linux系統——Ansible批量管理工具


 

 

 

 

批量管理工具:

(1)ansible 操作簡單(適用於500台以下服務器)

(2)saltstack 比較復雜(一般適用於1000-4w台服務器)

(3)puppet超級復雜

 

systemctl(統一管理命令)

chkconfigservice等的功能都被systemctl替代

# system stop iptables.service7.5版的防火牆是firewalld,企業中一般不用firewalld,直接關閉 # systemctl stop firewalld

 

#enable disable(開啟或關閉服務的開機自啟動)

# stop start (立即開啟或關閉服務)

# status(狀態)

# systemctl stop firewalld(關閉防火牆服務)

# systemctl disable firewalld(關閉防火牆服務的開機自啟動)

 

# systemctl stop NetworkManager(用來代替網卡的配置文件,管理網絡,優先級高過配置文件,但是有事會出現網卡換了個IP,但重啟以后未生效,就是這個服務造成的,還會導致IP 掉線)

# systemctl disable NetworkManager

 

部署環境時的設置

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# systemctl disable firewalld

[root@localhost ~]# systemctl stop NetworkManager

[root@localhost ~]# systemctl disable NetworkManager

 

安裝和yum有關的所有yum

# yum -y install epel-release

 

 

ansible特點:

通過一台管理機遠程批量操作多台(500以下),無需客戶端(saltstack需要安裝客戶端),基於Pythonansible利用ssh通道(操作要進行免密鑰)

 

 

生產環境中ansible管理服務器是直接連接超級用戶的,需要做很多安全處理

(1)修改ssh登錄

# vim /etc/ssh/sshd_config

17Port 22端口改為1萬以上

38PermitRootLogin yes改為no 設為禁止超級用戶遠程登錄(最后改動,避免掉線)

43PubkeyAuthentication yes 默認開啟,否則密鑰驗證就會失效

47AuthorizedKeysFile .ssh/authorized_keys 公鑰文件的位置

65PasswordAuthentication yes 是否開啟密碼驗驗證登陸(最后設置)

79GSSAPIAuthentication yes 是否關GASSPI認證

115UseDNS yes 改為no 關閉DNS反向解析,提高ssh解析速度

 

# vim /etc/ssh/ssh_config

StrickHostKeyChecking no改為yes

 

修改完配置文件后重啟,用普通用戶登錄

創建普通用戶

# useradd yunjisuan

客戶端創建密鑰,傳遞公鑰連接到服務端的超級用戶(將原公鑰刪除),將客戶端的私鑰放到xshell中,用免密方式導入到客戶端,連接登錄到服務端

# scp  ~/.ssh/id_rsa.pub   192.168.214.144:/home/yunjisuan

(現在已經使用密鑰登錄服務端了)

此時修改sshd的配置文件,將第65行的PasswordAuthenticationyes改為no

重啟配置文件后,已經不能使用密碼登錄了,必須使用私鑰才能登陸

 

(2)設置xshell私鑰登錄linux

# cd .ssh

# cp authorized_keys  /home/yunjisuan

# mkdir -p .ssh

# chmod 700 .ssh

# mv authorized_keys .ssh/

# chown -R yunjisuan.yunjisuan .ssh

新建xshell會話框,ip為客戶端IP地址,用公鑰登錄普通用戶

(3)用戶權限策略

a)給普通用戶設置權限,visudo(在root端)

yunjisuan     ALL=     NOPASSWD:ALL

b)查看用戶授權情況

# sudo -l

c# sudo su -

提權到超級用戶

d)修改/etc/ssh/sshd_config的配置要求(在root端)

重啟后(#systemctl reload sshd),登錄普通用戶,更改端口號,再sudo su - 連接超級用戶

 

(1)配置ansible管理服務sudo審計日志

開啟sudo日志

# echo "local2.debug /var/log/sudo.log" >> /etc/rsyslog.conf

# echo "Defaults logfile=/var/log/sudo.log" >> /etc/sudoers

 

測試sudo日志記錄

[root@ansible ~]# exit

登出

[yunjisuan@ansible ~]$ sudo su -

[sudo] yunjisuan 的密碼:

上一次登錄:日 99 21:40:11 CST 2018pts/0

 

查看/var/log/sudo.log日志

[root@ansible ~]# cat /var/log/sudo.log

Sep 9 21:49:12 : yunjisuan : TTY=pts/0 ; PWD=/home/yunjisuan ; USER=root ;

COMMAND=/bin/su -

 

5)安裝ansible

# yum -y install epel-release

[root@ansible ~]# yum -y install ansible

[root@ansible ~]# ansible --version

 

(2)配置主機清單

# > /etc/ansible/hosts

# vim /etc/ansible/hosts

[nginx](模塊名)

WebA  ansible_ssh_host=192.168.214.123 Web服務器的名字+IP地址)

WebB  ansible_ssh_host=192.168.214.124  ansible_ssh_pass=666666

若已設置免密鑰,配置完畢

ansible_ssh_host:被管理主機IP

ansible_ssh_user:被管理主機用戶名

ansible_ssh_pass:被管理主機用戶的登陸密碼

ansible_sudo_pass:被管理主機用戶sudo時的密碼

 

 

(3)設置SSH免密鑰登錄

# ssh-keygen

# ssh-copy-id 192.168.214.140

# ssh-copt-id 192.168.214.145

 

7Ansible服務器簡單的綜合安全管理策略

1)禁止非root用戶查看Ansible管理服務器端/etc/hosts文件

# chmod 600 /etc/hosts

2)禁止非root用戶查看Ansible的主機清單配置文件

# chmod 600 /etc/ansible/hosts

 

Ansible的基礎應用

Ansible可以使用命令行的方式進行自動化管理。命令的基本語法如下所示:

 

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

# ansible Web01 -m command -a 'uptime'

 

主機組名====> /etc/ansible/hosts里設定的nginxapacheweb

主機名====> Web01,Web02

all ====>/etc/ansible/hosts里設定的所有主機

模塊名====> commandcronshellfile

 

(1)ping模塊

作用:檢測指定主機的連通性

格式

# ansible 被管理范圍 -m 模塊 -a 具體命令

# ansible WebA -m ping (分發單主機WebA的信息)

# ansible  nginx  -m ping (分發模塊(主機組)下的信息)

# ansible all -m ping (分發所有被管理的主機信息)

(2)command模塊

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

# ansible Web01 -m command  -a 'uptime'

 

3shell模塊

可以在被管理主機上運行命令,並支持像管道符重定向這樣的復雜命令

# ansible Web01 -m shell -a 'echo 123123 | passwd --stdin yunjisuan'

在所有被管理的主機的/etc/hosts文件里添加Ansible管理服務器的IP地址映射

ansible all -m shell -a 'echo "ansible 192.168.200.183" >> /etc/hosts'

4cron模塊

cron模塊用於定義任務計划。主要包括兩種狀態(state

 

crontab時間周期: (若哪個不寫就是默認*號,都不寫默認5*號)

minute:分鍾

hour:小時

day:日期

month:月份

weekday:周期

 

crontab任務:

job:指明運行的命令是什么

 

crontab任務描述:

name:定時任務描述(定時任務清除的依據)

 

state狀態:

present:表示添加(省略狀態時默認使用);

absent:表示移除;

 

crontab任務的用戶身份:

user:指定定時任務以哪個用戶身份執行

 

添加定時任務計划,在所有被管理的主機里每十分鍾輸出hello字符串,定時任務描述為test cron job

# ansible all -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job"'

刪除描述為test cron job的定時任務

# ansible all -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job" state=”absent”'

若不成功,用下面的命令去執行

# ansible all  -m shell -a 'crontab -r'

 

Web01服務器上的普通用戶yunjisuan添加一個定時任務

# ansible Web01 -m shell -a 'id yunjisuan'

# ansible Web01 -m cron -a 'minute="*/10" job="/bin/echo hello" name="yunjisuan cron job" user="yunjisuan"'

# ansible Web01 -m shell -a 'crontab -u yunjisuan -l'

# ansible Web01 -m cron -a 'minute="*/10" job="/bin/echo hello" name="yunjisuan cron job" user="yunjisuan" state="absent"'

# ansible Web01 -m shell -a 'crontab -u yunjisuan -l'

5copy模塊

copy模塊用於實現文件復制和批量下發文件。其中使用src來定義本地源文件路徑;使用dest定義被管理主機文件路徑;使用content則是使用指定信息內容來生成目標文件

 

復制時,被管理主機下寫具體文件名,可用來改名字

Backup=yes 表示備份,覆蓋文件的同時,備份一份

將本地的/etc/hosts文件拷貝到所有被管理的主機的/etc/hosts路徑下覆蓋同名文件,並指定屬主和權限,若拷貝的文件與目標文件內容不同,則備份目標文件再覆蓋。

# ansible all -m shell -a 'tail -1 /etc/hosts'

# echo "web01 192.168.200.184" >> /etc/hosts

# ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts owner=root mode=640 backup=yes'

# ansible all -m shell -a 'ls /etc/hosts*'

# ansible all -m shell -a 'tail -1 /etc/hosts'

 

 

將本地/tmp/test.sh的腳本復制到遠程主機上並遠程激活

(6)script模塊

可以將本地腳本復制到被管理主機的內存中並運行,不會在被管理主機中留下腳本文件

編寫一個腳本,然后通過ansiblescript模塊遠程向被管理主機執行此腳本(直接顯示腳本的內容執行結果)

# echo 'echo "1111" >> /tmp/test' >> /tmp/test.sh

# cat /tmp/test.sh

echo "1111" >> /tmp/test

# ansible all -m script -a '/tmp/test.sh'

Scp+sshscript區別

scp+ssh的腳本在對方用戶,遠程激活也是在對方用戶

 

Script模塊是把本地的腳本不留痕跡的激活在對方的內存里

 

(7)yum模塊

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

軟件包名:

name:指定軟件包的名字

state狀態:

present:安裝軟件包(默認就是這個)

absent:卸載軟件包

8service模塊

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

服務名稱:

name:指定服務的名字

state狀態:

started:啟動服務

stopped:停止服務

restarted:重啟服務

reloaded:平滑重載

enabled開機自啟動:

true:設置開機自啟動

false:設置開啟不啟動

#啟動firewalld並設置開機自啟動

[root@ansible ~]# ansible Web01 -m service -a 'name=firewalld state=started enabled=true'

#關閉firewalld並設置開機不啟動

[root@ansible ~]# ansible Web01 -m service -a 'name=firewalld state=stopped enabled=false'

(9)user模塊

用戶管理模塊。管理用戶賬號

 

指定用戶名

name:指定操作的用戶的名字

用戶描述

comment:指定用戶的描述信息

createhome:是否創建家目錄

uid:指定用戶的uid

groups:指定用戶的附加組(默認創建和用戶名相同的組)

password:指定用戶的密碼

update_password:更新用戶的密碼

shell指定用戶的登陸方式

1/bin/bash:能登錄系統

2/sbin/nologin:不能登錄系統

home:指定用戶的家目錄路徑

state狀態:

(1)present:創建用戶(默認就是這個)

(2)absent:刪除用戶

remove:當指定state=absent時,確認是否刪除用戶家目錄

1true

2false

Web02上創建一個普通用戶yunjisuan,並設置用戶的密碼為123123

[root@ansible ~]# ansible Web02 -m user -a 'name=yunjisuan comment="welcom to yunjisuan" uid=1066 groups=wheel password=123123 shell=/bin/bash home=/home/yunjisuan'

 

利用ansibleuser模塊狀態用戶時要注意在password參數的后邊添加密文,否則不能登陸用戶,需要通過Pythonpip程序安裝passlib即可為密碼加密

 

安裝Python2pip工具,並通過pip工具安裝Python的加密模塊來給密碼加密

[root@ansible ~]# yum -y install epel-release

[root@ansible ~]# yum -y install python2-pip

[root@ansible ~]# pip install passlib

#刪除之前創建的yunjisuan用戶,並刪除它的家目錄

[root@ansible ~]# ansible Web02 -m user -a 'name=yunjisuan state=absent remove=true'

繼續在Web02上創建yunjisuan用戶

ansible Web02 -m user -a 'name=yunjisuan comment="welcom to yunjisuan" uid=1066 groups=wheel password=$6$rounds=656000$Tw15COd8DLh/VS94$Mcmz/8CcjBKiEl0mYHcOQQCxEA5mz66EcGH2qXVk6o.Sm7FsRS.DsDVy6ET8iI6jDa045I94slZqWFwyYnRSW1 shell=/bin/bash' home=/home/yunjisuan'

 

10setup模塊

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

查看遠程主機的facts信息

[root@ansible ~]# ansible Web01 -m setup | head

 

修改主機名

1)臨時修改主機名

# hostname

2)永久修改主機名

# vim /etc/hostname

 

修改服務啟動和開機自啟動用systemctl修改

(1)開啟/關閉服務用start/stop

(2)開啟/取消開機自啟動 用enable/disable

 

防火牆firewalld

克隆機必關服務

# systemctl stop firewalld

# systemctl disable firewalld

# systemctl stop NetworkManager

# systemctl disable NetworkManager

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM