批量管理工具:
(1)ansible 操作簡單(適用於500台以下服務器)
(2)saltstack 比較復雜(一般適用於1000-4w台服務器)
(3)puppet超級復雜
systemctl(統一管理命令)
chkconfig、service等的功能都被systemctl替代
# system stop iptables.service(7.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需要安裝客戶端),基於Python,ansible利用ssh通道(操作要進行免密鑰)
生產環境中ansible管理服務器是直接連接超級用戶的,需要做很多安全處理
(1)修改ssh登錄
# vim /etc/ssh/sshd_config
17行 Port 22端口改為1萬以上
38行PermitRootLogin yes改為no 設為禁止超級用戶遠程登錄(最后改動,避免掉線)
43行PubkeyAuthentication yes 默認開啟,否則密鑰驗證就會失效
47行AuthorizedKeysFile .ssh/authorized_keys 公鑰文件的位置
65行PasswordAuthentication yes 是否開啟密碼驗驗證登陸(最后設置)
79行GSSAPIAuthentication yes 是否關GASSPI認證
115行UseDNS 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行的PasswordAuthentication的yes改為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 的密碼:
上一次登錄:日 9月 9 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
(7)Ansible服務器簡單的綜合安全管理策略
(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里設定的nginx,apache,web
主機名====> Web01,Web02
all ====>/etc/ansible/hosts里設定的所有主機
模塊名====> command,cron,shell,file等
(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'
(3)shell模塊
可以在被管理主機上運行命令,並支持像管道符重定向這樣的復雜命令
# 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'
(4)cron模塊
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'
(5)copy模塊
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模塊
可以將本地腳本復制到被管理主機的內存中並運行,不會在被管理主機中留下腳本文件
編寫一個腳本,然后通過ansible的script模塊遠程向被管理主機執行此腳本(直接顯示腳本的內容執行結果)
# 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+ssh與script區別
scp+ssh的腳本在對方用戶,遠程激活也是在對方用戶
Script模塊是把本地的腳本不留痕跡的激活在對方的內存里
(7)yum模塊
利用yum模塊安裝軟件包,雖然能被shell模塊替代
但是用yum模塊更顯專業一些
軟件包名:
name:指定軟件包的名字
state狀態:
present:安裝軟件包(默認就是這個)
absent:卸載軟件包
(8)service模塊
利用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時,確認是否刪除用戶家目錄
(1)true
(2)false
在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'
利用ansible的user模塊狀態用戶時要注意在password參數的后邊添加密文,否則不能登陸用戶,需要通過Python的pip程序安裝passlib即可為密碼加密
安裝Python2的pip工具,並通過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'
(10)setup模塊
查看被管理主機的facts(facts是Ansible采集被管理主機設備信息的一個功能)。每個被管理主機在接收並運行管理命令之前,都會將自己的相關信息(操作系統版本,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