Ansible簡介:Ansible是一個簡單高效的自動化運維管理工具,用Python開發,能大批量管理N多台機器,可以並發的在多台機器上部署應用、安裝軟件、執行命令、配置和編排任務。后面會提到批量安裝zabbix_agenet客戶端
一、Ansible工作機制,原理說明

從圖中可以看出ansible分為以下幾個部分:
1)Control Node:控制機器
2)Inventory:主機清單
3)Playbooks:劇本、任務編排。根據規則定義多個任務,模塊組織結構清晰,由ansible自動執行
4)Modules(Core|Custom):模塊,用於執行某個具體的任務
5)connection plugin (連接插件):ansible 通過不同的協議連接到遠程主機上,執行指定的命令。默認采用ssh協議連接遠程主機
二、Ansible執行流程

簡單的說,運行ansible時,首先讀取ansible.cfg中的配置,根據規則獲取Inventory中的管理主機列表,並行的在這些主機中執行配置的任務,最后等待執行返回的結果。
三、安裝Ansible准備工作
一台控制主機:192.168.0.202
三台管理主機:(作為測試)
192.168.0.200
192.168.0.201
192.168.0.203
備注:如果被管理主機有外網IP地址,控制主機可以是自己的虛擬機
安裝要求:
centos6版本以上以及能使用python命令和pip命令
備注:centos6系統自動python2.6 。centos7系統自動python2.7。pip命令是基於python安裝python模塊的命令
四、安裝ansiable
1、安裝方法一,yum安裝(推薦)
yum install epel-release -y
yum install ansible -y
2、安裝方法二,安裝python下的ansible模塊
pip install ansible
五、配置控制主機管理服務器
1)vim /etc/ansible/hosts 添加被管理的機器
192.168.0.200
192.168.40.70:88 ansible_ssh_user=root ansible_ssh_pass=1234567899
server ansible_ssh_host=192.168.40.20 ansible_ssh_pass="1234567899" ansible_ssh_port=8822
備注。這幾種寫法都行。默認端口為22。默認用戶為root。server為主機名。推薦后面2種,將公鑰拷貝到管理主機中時,可以免密碼
2)在控制主機中生成ssh密鑰對
ssh-keygen -t rsa
一直回車,即在$HOME/.ssh目錄下生成id_rsa和id_rsa.put私鑰和公鑰兩個文件
備注:為了安全也可在生成密鑰的時候設置密碼,ansible每次執行命令的時候,都會提示輸入密鑰密碼,可通過下面的命令記住密碼。
ssh-agent bsh
ssh-add ~/.ssh/id_rsa
3) 將公鑰拷貝到管理主機中.ssh/authorized_keys文件中,實現免密碼登錄遠程管理主機
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.200 # 默認端口22
ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 502 root@119.75.216.201" # 修改了特殊端口
如果在/etc/ansible/hosts中的主機有用戶名,端口,密碼。這里后面不需要再次輸入密碼
注:ssh-copy-id命令會自動將id_rsa.pub文件的內容追加到遠程主機root用戶下.ssh/authorized_keys文件中
4)調整ansible.cfg參數,優化
vim /etc/ansible/ansible.cfg
1、禁用每次執行ansible命令檢查 ssh key host.
host_key_checking = False
2、開啟日志記錄
log_path = /var/log/ansible.log
3、ansible連接加速配置
|
1
2
3
4
5
6
7
8
9
10
11
|
[accelerate]
#accelerate_port = 5099
accelerate_port
=
10000
#accelerate_timeout = 30
#accelerate_connect_timeout = 5.0
# If set to yes, accelerate_multi_key will allow multiple
# private keys to be uploaded to it, though each user must
# have access to the system via SSH to add a new key. The default
# is "no".
accelerate_multi_key
=
yes
|
六、測試。
6.1)測試在管理機器批量執行一個ping 命令

說明,每台機器都成功執行了ping 命令
6.2)批量安裝zabbix_agent客戶端
vim /root/tools/zabbix.sh
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#!/bin/sh
# yum 安裝,# 號為注釋
# 注意需要關閉selinux
# sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
# setenforce 0
# 僅適用於centos6版本,並且zabbix為第一次安裝
rpm
-
ivh http:
/
/
repo.zabbix.com
/
zabbix
/
3.2
/
rhel
/
6
/
x86_64
/
zabbix
-
release
-
3.2
-
1.el6
.noarch.rpm
yum install zabbix
-
sender zabbix
-
agent zabbix
-
y
cp
/
etc
/
zabbix
/
zabbix_agentd.conf
/
etc
/
zabbix
/
zabbix_agentd.conf_ori.bak
# 192.168.40.21 位zabbix服務端的監控地址
sed
-
i
"s/Server=127.0.0.1/Server=192.168.40.21/"
/
etc
/
zabbix
/
zabbix_agentd.conf
#sed -i "s/ServerActive=127.0.0.1/ServerActive=192.168.40.21/" /etc/zabbix/zabbix_agentd.conf
#sed -i "s/Hostname=Zabbix server/Hostname=192.168.40.21/" /etc/zabbix/zabbix_agentd.conf
cp
/
etc
/
sysconfig
/
iptables
/
etc
/
sysconfig
/
iptables_ori.bak
sed
-
i
'/^COMMIT/i\-A INPUT -m state --state NEW -m tcp -p tcp --dport 10050 -j ACCEPT'
/
etc
/
sysconfig
/
iptables
service iptables restart
service zabbix
-
agent start
chkconfig zabbix
-
agent on
|
ansible all -m copy -a "src=/root/tools/zabbix.sh dest=/root" # 推送文件至管理主機
ansible all -a "/bin/sh /root/zabbix.sh" # 遠程執行腳本文件
執行完畢后,連接一下管理主機,查看zabbix_agent是否啟動成功
七、分組測試結果
1)hosts文件,分組
[web01] myredis ansible_ssh_host=192.168.10.25 ansible_ssh_pass="123456" ansible_ssh_port=22 myweb ansible_ssh_host=192.168.10.242 ansible_ssh_pass="123456" ansible_ssh_port=22 [db01] server ansible_ssh_host=192.168.10.5 ansible_ssh_pass="123456" ansible_ssh_port=22
如果可以使用ssh 免密登錄服務器的話
[web] k1 ansible_ssh_host=192.168.10.41 ansible_ssh_user=root ansible_ssh_pass=123456 k3 ansible_ssh_host=192.168.10.20
k3 ansible_ssh_host=192.168.10.20
ansible_ssh_host=192.168.10.20
只要有IP在,就可以
2)執行web01組內容
[root@web01 ansible]# ansible web01 -a "df -h" myweb | SUCCESS | rc=0 >> Filesystem Size Used Avail Use% Mounted on /dev/sda3 15G 2.0G 13G 14% / tmpfs 931M 0 931M 0% /dev/shm /dev/sda1 190M 32M 149M 18% /boot myredis | SUCCESS | rc=0 >> Filesystem Size Used Avail Use% Mounted on /dev/sda3 19G 1.8G 17G 10% / tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 190M 27M 153M 15% /boot
3)執行單台機器內容
[root@web01 ansible]# ansible myweb -a "df -h" myweb | SUCCESS | rc=0 >> Filesystem Size Used Avail Use% Mounted on /dev/sda3 15G 2.0G 13G 14% / tmpfs 931M 0 931M 0% /dev/shm /dev/sda1 190M 32M 149M 18% /boot
4)特別注意前面定義的主機名,最好不要重名,建議使用IP地址
5)ls顯示文件
[root@k8s6 .ansible]# ansible web -a 'ls /root/.ssh/' k5 | CHANGED | rc=0 >> authorized_keys id_rsa id_rsa.pub k4 | CHANGED | rc=0 >> authorized_keys id_rsa.pub k3 | CHANGED | rc=0 >> authorized_keys id_rsa id_rsa.pub
八、ansible命令的總結
hosts文件寫法===》可考慮加密該文件
192.168.40.70:88 ansible_ssh_user=root ansible_ssh_pass=1234567899
server ansible_ssh_host=192.168.40.20 ansible_ssh_pass="1234567899" ansible_ssh_port=8822
ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 8822 root@192.168.1.167" # 拷貝公鑰
ansible + 主機組名稱 + -m + 模塊名稱 + -a + 參數
主機組名稱,即hosts中定義的主機組名稱
all 指所有主機
-m 指使用模塊,后加指定的模塊名稱
-a 指傳給模塊的參數
ansible all -a "mkdir -p /python/python" # 執行管理主機中的命令
ansible all -m copy -a "src=/root/tools/zabbix.sh dest=/root" # 拷貝文件至管理主機
ansible all -a "/bin/sh /root/zabbix.sh" # 遠程執行腳本文件
ansible zabbix -m shell -a "free -g" # 調用shell命令
ansible命令的並發
-f 參數。默認為 5。執行很多機器的時候,可以選擇加該參數
ansible命令自主選擇執行的文件host
-i 參數。默認為 /etc/ansible/hosts
實例:ansible zk -m shell -a "sudo yum install wget -y" -f 1 -i /etc/ansible/hosts 循環執行,線程數為1
