1. 程式人生 > >ansible ansible批量管理工具的搭建與簡單的操作

ansible ansible批量管理工具的搭建與簡單的操作

ansible批量管理工具的搭建與簡單的操作

 

ansible的安裝

複製程式碼
#
[[email protected] ~]# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
[[email protected] ~]# uname -r
3.10.0-862.3.3.el7.x86_64
[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# systemctl disable firewalld
[
[email protected]
~]# systemctl stop NetworkManager [[email protected] ~]# systemctl disable NetworkManager #通過yum源方式安裝ansible [[email protected] ~]# yum -y install epel-release [[email protected] ~]# yum -y install ansible #通過Python的pip方式安裝ansible [[email protected] ~]# yum -y install epel-release [
[email protected]
~]# yum -y install python2-pip [[email protected] ~]# pip install ansible
複製程式碼

ssh的,安全策略

複製程式碼
備份:cp /etc/ssh/sshd_config{,.bak}

[[email protected] ~]# cat -n /etc/ssh/sshd_config.bak | sed -n '17p;38p;43p;47p;65p;79p;115p'
    17  #Port 22                    #修改ssh連線埠
    38  #PermitRootLogin yes        #是否允許root賬號遠端登陸
    43  #PubkeyAuthentication yes   #是否開啟公鑰連線認證
    47  AuthorizedKeysFile  .ssh/authorized_keys    #公鑰檔案的放置位置
    65  PasswordAuthentication yes  #是否開啟密碼驗證登陸
    79  GSSAPIAuthentication yes    #是否關閉GSSAPI認證
   115  #UseDNS yes                 #是否關閉DNS反向解析
[
[email protected]
~]# cat -n /etc/ssh/sshd_config | sed -n '17p;38p;43p;47p;65p;79p;115p' 17 Port 22221 #工作中需要設定到1萬以上的埠,避免被掃描出來。 38 PermitRootLogin yes #如果不是超大規模的伺服器,為了方便我們可以暫時開啟root遠端登入 43 PubkeyAuthentication yes #開啟公鑰認證模式 47 AuthorizedKeysFile .ssh/authorized_keys #公鑰放置位置 65 PasswordAuthentication no #為了安全我們關閉伺服器的密碼認證方式 79 GSSAPIAuthentication no #關閉GSSAPI認證,極大提高ssh連線速度 115 UseDNS no #關閉DNS反向解析,極大提高ssh連線速度
複製程式碼

然後配置主機清單

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

[[email protected] ~]# 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時的密碼
複製程式碼 複製程式碼
 Ansible伺服器簡單的綜合安全管理策略
#禁止非root使用者檢視Ansible管理伺服器端/etc/hosts檔案
[[email protected] ~]# ll /etc/hosts
-rw-r--r--. 1 root root 180 9月   9 00:38 /etc/hosts
[[email protected] ~]# chmod 600 /etc/hosts
#禁止非root使用者檢視Ansible的主機清單配置檔案
[[email protected] ~]# ll /etc/ansible/hosts
-rw-r--r-- 1 root root 87 9月   9 21:59 /etc/ansible/hosts
[[email protected] ~]# chmod 600 /etc/ansible/hosts
複製程式碼
[[email protected] ~]# /usr/local/python/bin/ansible-doc -l 檢視總幫助 
[[email protected] ~]# /usr/local/python/bin/ansible-doc -s shell 檢視shell模組的幫助

ansible的十大基礎模組

1.

ping模組
Ansible中使用ping模組來檢測指定主機的連通性

2.

command模組
在遠端主機執行命令,不支援管道符和重定向等複雜命令,可完全被shell模組替代

[[email protected] ~]# ansible Web01 -m command -a 'uptime'

3.

shell模組
Ansible中的shell模組可以在被管理主機上執行命令,並支援像管道符重定向這樣的複雜命令。

#在Web01上建立使用者yunjisuan,並非互動方式設定密碼
[[email protected] ~]# ansible Web01 -m shell -a 'useradd yunjisuan'

4.

複製程式碼
cron模組
Ansible中的cron模組用於定義任務計劃。主要包括兩種狀態(state);

crontab時間週期: 
minute:分鐘
hour:小時
day:日期
month:月份
weekday:週期
crontab任務: 
job:指明執行的命令是什麼
crontab任務描述: 
name:定時任務描述(定時任務清除的依據)
state狀態: 
present:表示新增(省略狀態時預設使用);
absent:表示移除;
crontab任務的使用者身份: 
user:指定定時任務以哪個使用者身份執行
#新增定時任務計劃,在所有被管理的主機裡每十分鐘輸出hello字串,定時任務描述為test cron job
[[email protected] ~]# ansible all -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job"'
複製程式碼

5.

 copy模組
Ansible中的copy模組用於實現檔案複製和批量下發檔案。其中使用src來定義本地原始檔路徑;使用dest定義被管理主機檔案路徑;使用content則是使用指定資訊內容來生成目標檔案。
ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts owner=root mode=640 backup=yes'

6

script模組
Ansible中的script模組可以將本地指令碼複製到被管理主機的記憶體中並執行,不會在被管理主機中留下指令碼檔案。
ansible all -m script -a '/tmp/test.sh'

7.

複製程式碼
yum模組
利用yum模組安裝軟體包,雖然能被shell模組替代 
但是用yum模組更顯專業一些

軟體包名: 
name:指定軟體包的名字
state狀態: 
present:安裝軟體包(預設就是這個)
absent:解除安裝軟體包
#安裝nmap軟體包
[[email protected] ~]# ansible all -m yum -a 'name=nmap'
#解除安裝nmap軟體包
[[email protected] ~]# ansible all -m yum -a 'name=nmap state=absent'
複製程式碼

8.

複製程式碼
service模組
利用service模組管理服務程式,雖然能被shell模組替代 
但是用service模組更顯專業一些

服務名稱: 
name:指定服務的名字
state狀態: 
started:啟動服務
stopped:停止服務
restarted:重啟服務
reloaded:平滑過載
enabled開機自啟動: 
true:設定開機自啟動
false:設定開啟不啟動
#啟動firewalld並設定開機自啟動
[[email protected] ~]# ansible Web01 -m service -a 'name=firewalld state=started enabled=true'
#關閉firewalld並設定開機不啟動
[[email protected] ~]# ansible Web01 -m service -a 'name=firewalld state=stopped enabled=false'
複製程式碼

9.

複製程式碼
user模組
使用者管理模組。管理使用者賬號

:指定使用者名稱 
name:指定操作的使用者的名字
:使用者描述 
comment:指定使用者的描述資訊
:createhome:是否建立家目錄
:uid:指定使用者的uid號
:groups:指定使用者的附加組(預設建立和使用者名稱相同的組)
:password:指定使用者的密碼
:update_password:更新使用者的密碼
:shell指定使用者的登陸方式 
/bin/bash:能登入系統
/sbin/nologin:不能登入系統
:home:指定使用者的家目錄路徑
:state狀態: 
present:建立使用者(預設就是這個)
absent:刪除使用者
:remove:當指定state=absent時,確認是否刪除使用者家目錄 
true
false
#在Web02上建立一個普通使用者yunjisuan,並設定使用者的密碼為123123
[[email protected] ~]# 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的加密模組來給密碼加密
[[email protected] ~]# yum -y install epel-release
[[email protected] ~]# yum -y install python2-pip
[[email protected] ~]# pip install passlib
#生成密文密碼
[[email protected] ~]# 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          #加密後的密碼
複製程式碼

10.

setup模組
Ansible中使用setup模組收集,檢視被管理主機的facts(facts是Ansible採集被管理主機裝置資訊的一個功能)。每個被管理主機在接收並執行管理命令之前,都會將自己的相關資訊(作業系統版本,IP地址等)傳送給控制主機

#檢視遠端主機的facts資訊
[[email protected] ~]# ansible Web01 -m setup | head

 

ansible的安裝

複製程式碼
#
[[email protected] ~]# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
[[email protected] ~]# uname -r
3.10.0-862.3.3.el7.x86_64
[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# systemctl disable firewalld
[[email protected] ~]# systemctl stop NetworkManager
[[email protected] ~]# systemctl disable NetworkManager
#通過yum源方式安裝ansible
[[email protected] ~]# yum -y install epel-release
[[email protected] ~]# yum -y install ansible
#通過Python的pip方式安裝ansible
[[email protected] ~]# yum -y install epel-release
[[email protected] ~]# yum -y install python2-pip
[[email protected] ~]# pip install ansible
複製程式碼

ssh的,安全策略

複製程式碼
備份:cp /etc/ssh/sshd_config{,.bak}

[[email protected] ~]# cat -n /etc/ssh/sshd_config.bak | sed -n '17p;38p;43p;47p;65p;79p;115p'
    17  #Port 22                    #修改ssh連線埠
    38  #PermitRootLogin yes        #是否允許root賬號遠端登陸
    43  #PubkeyAuthentication yes   #是否開啟公鑰連線認證
    47  AuthorizedKeysFile  .ssh/authorized_keys    #公鑰檔案的放置位置
    65  PasswordAuthentication yes  #是否開啟密碼驗證登陸
    79  GSSAPIAuthentication yes    #是否關閉GSSAPI認證
   115  #UseDNS yes                 #是否關閉DNS反向解析
[[email protected] ~]# cat -n /etc/ssh/sshd_config | sed -n '17p;38p;43p;47p;65p;79p;115p'
    17  Port 22221                  #工作中需要設定到1萬以上的埠,避免被掃描出來。
    38  PermitRootLogin yes         #如果不是超大規模的伺服器,為了方便我們可以暫時開啟root遠端登入
    43  PubkeyAuthentication yes    #開啟公鑰認證模式
    47  AuthorizedKeysFile  .ssh/authorized_keys    #公鑰放置位置
    65  PasswordAuthentication no   #為了安全我們關閉伺服器的密碼認證方式
    79  GSSAPIAuthentication no     #關閉GSSAPI認證,極大提高ssh連線速度
   115  UseDNS no                   #關閉DNS反向解析,極大提高ssh連線速度
複製程式碼

然後配置主機清單

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

[[email protected] ~]# 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時的密碼
複製程式碼 複製程式碼
 Ansible伺服器簡單的綜合安全管理策略
#禁止非root使用者檢視Ansible管理伺服器端/etc/hosts檔案
[[email protected] ~]# ll /etc/hosts
-rw-r--r--. 1 root root 180 9月   9 00:38 /etc/hosts
[[email protected] ~]# chmod 600 /etc/hosts
#禁止非root使用者檢視Ansible的主機清單配置檔案
[[email protected] ~]# ll /etc/ansible/hosts
-rw-r--r-- 1 root root 87 9月   9 21:59 /etc/ansible/hosts
[[email protected] ~]# chmod 600 /etc/ansible/hosts
複製程式碼
[[email protected] ~]# /usr/local/python/bin/ansible-doc -l 檢視總幫助 
[[email protected] ~]# /usr/local/python/bin/ansible-doc -s shell 檢視shell模組的幫助

ansible的十大基礎模組

1.

ping模組
Ansible中使用ping模組來檢測指定主機的連通性

2.

command模組
在遠端主機執行命令,不支援管道符和重定向等複雜命令,可完全被shell模組替代

[[email protected] ~]# ansible Web01 -m command -a 'uptime'

3.

shell模組
Ansible中的shell模組可以在被管理主機上執行命令,並支援像管道符重定向這樣的複雜命令。

#在Web01上建立使用者yunjisuan,並非互動方式設定密碼
[[email protected] ~]# ansible Web01 -m shell -a 'useradd yunjisuan'

4.

複製程式碼
cron模組
Ansible中的cron模組用於定義任務計劃。主要包括兩種狀態(state);

crontab時間週期: 
minute:分鐘
hour:小時
day:日期
month:月份
weekday:週期
crontab任務: 
job:指明執行的命令是什麼
crontab任務描述: 
name:定時任務描述(定時任務清除的依據)
state狀態: 
present:表示新增(省略狀態時預設使用);
absent:表示移除;
crontab任務的使用者身份: 
user:指定定時任務以哪個使用者身份執行
#新增定時任務計劃,在所有被管理的主機裡每十分鐘輸出hello字串,定時任務描述為test cron job
[[email protected] ~]# ansible all -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job"'
複製程式碼

5.

 copy模組
Ansible中的copy模組用於實現檔案複製和批量下發檔案。其中使用src來定義本地原始檔路徑;使用dest定義被管理主機檔案路徑;使用content則是使用指定資訊內容來生成目標檔案。
ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts owner=root mode=640 backup=yes'

6

script模組
Ansible中的script模組可以將本地指令碼複製到被管理主機的記憶體中並執行,不會在被管理主機中留下指令碼檔案。
ansible all -m script -a '/tmp/test.sh'

7.

複製程式碼
yum模組
利用yum模組安裝軟體包,雖然能被shell模組替代 
但是用yum模組更顯專業一些

軟體包名: 
name:指定軟體包的名字
state狀態: 
present:安裝軟體包(預設就是這個)
absent:解除安裝軟體包
#安裝nmap軟體包
[[email protected] ~]# ansible all -m yum -a 'name=nmap'
#解除安裝nmap軟體包
[[email protected] ~]# ansible all -m yum -a 'name=nmap state=absent'
複製程式碼

8.

複製程式碼
service模組
利用service模組管理服務程式,雖然能被shell模組替代 
但是用service模組更顯專業一些

服務名稱: 
name:指定服務的名字
state狀態: 
started:啟動服務
stopped:停止服務
restarted:重啟服務
reloaded:平滑過載
enabled開機自啟動: 
true:設定開機自啟動
false:設定開啟不啟動
#啟動firewalld並設定開機自啟動
[[email protected] ~]# ansible Web01 -m service -a 'name=firewalld state=started enabled=true'
#關閉firewalld並設定開機不啟動
[[email protected] ~]# ansible Web01 -m service -a 'name=firewalld state=stopped enabled=false'
複製程式碼

9.

複製程式碼
user模組
使用者管理模組。管理使用者賬號

:指定使用者名稱 
name:指定操作的使用者的名字
:使用者描述 
comment:指定使用者的描述資訊
:createhome:是否建立家目錄
:uid:指定使用者的uid號
:groups:指定使用者的附加組(預設建立和使用者名稱相同的組)
:password:指定使用者的密碼
:update_password:更新使用者的密碼
:shell指定使用者的登陸方式 
/bin/bash:能登入系統
/sbin/nologin:不能登入系統
:home:指定使用者的家目錄路徑
:state狀態: 
present:建立使用者(預設就是這個)
absent:刪除使用者
:remove:當指定state=absent時,確認是否刪除使用者家目錄 
true
false
#在Web02上建立一個普通使用者yunjisuan,並設定使用者的密碼為123123
[[email protected] ~]# 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的加密模組來給密碼加密
[[email protected] ~]# yum -y install epel-release
[[email protected] ~]# yum -y install python2-pip
[[email protected] ~]# pip install passlib
#生成密文密碼
[[email protected] ~]# 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          #加密後的密碼
複製程式碼

10.

setup模組
Ansible中使用setup模組收集,檢視被管理主機的facts(facts是Ansible採集被管理主機裝置資訊的一個功能)。每個被管理主機在接收並執行管理命令之前,都會將自己的相關資訊(作業系統版本,IP地址等)傳送給控制主機

#檢視遠端主機的facts資訊
[[email protected] ~]# ansible Web01 -m setup | head