一、概述分析
由于互聯(lián)網(wǎng)的快速發(fā)展導致產(chǎn)品更新?lián)Q代速度逐漸加快,運維人員每天都要進行大量的維護操作,仍舊按照傳統(tǒng)方式進行維護會使得工作效率低下。這時,部署自動化運維就可以盡可能安全、高效地完成這些工作。
一般會把自動化運維工具劃分為兩類:一類是需要使用代理工具的,也就是基于專用的ABem程序來完成管理功能,如: Puppet、Func、 Zabbix等;另外一類是不需要配置代理工具的,可以直接基于SSH服務來完成管理功能,如: Ansible、 Fabric等。–
下面介紹幾款功能類似的自動化運維工具:
1. Puppet
Pup基于Rpy開發(fā),支持Linx、UNDX、 Windows平臺,可以針對用戶、系統(tǒng)服務配置文件、軟件包等進行管理,有很強的擴展性,但遠程執(zhí)行命令相對較弱。
2. SaltStack
CallStack基于 Python開發(fā),允許管理員對多個操作系統(tǒng)創(chuàng)建統(tǒng)一的管理系統(tǒng),比pet更輕量級
工具 | 開發(fā)語言 | 結構 | 配置文件 格式 | 運行任務 |
---|---|---|---|---|
Ansible | Python | 無 | YAML | 支持命令行 |
SaltStack | Python | C/S | YAML | 支持命令行 |
Puppet | Ruby | C/S | Ruby語法格式 | 通過模塊實現(xiàn) |
Ansible
Ansible基于 Python開發(fā),集合了眾多優(yōu)秀運維工具的優(yōu)點,實現(xiàn)了批量運行命令部署程序、配置系統(tǒng)等功能。默認通過SSH協(xié)議進行遠程命令執(zhí)行或下發(fā)配置,無需部署任何客戶端代理軟件,從而使得自動化環(huán)境部署變得更加簡單。可同時支持多臺主機并行管理,使得管理主機更加便捷。
官方的title是“Ansible is Simple IT Automation”——簡單的自動化IT工具。
Ansible通過SSH協(xié)議實現(xiàn)遠程節(jié)點和管理節(jié)點之間的通信。理論上說,只要管理員通過ssh登錄到一臺遠程主機上能做的操作,Ansible都可以做到。
Ansible跟其他IT自動化技術的區(qū)別在于其關注點并非配置管理、應用部署或IT流程工作流,而是提供一個統(tǒng)一的界面來協(xié)調所有的IT自動化功能,因此Ansible的系統(tǒng)更加易用,部署更快。
Ansible可以讓用戶避免編寫腳本或代碼來管理應用,同時還能搭建工作流實現(xiàn)IT任務的自動化執(zhí)行。IT自動化可以降低技術門檻及對傳統(tǒng)IT的依賴,從而加快項目的交付速度。
Ansible基本架構由六個部分組成:
Ansible core 核心引擎。
Host inventory 主機清單:用來定義Ansible 所管理的主機,默認是在Ansible的host配置文件中定義被管理主機,同時也支持自定義動態(tài)主機清單和指定其他配置文件的位置。
Connection plugins連接插件:負責和被管理主機實現(xiàn)通信。除支持使用ssh連接被管理主機外, Ansible還支持其他的連接方式,所以需要有連接插件將各個主機用連接插件連接到 Ansible。
Playbooks(yaml, injaz2)劇本:用來集中定義 Ansible任務的配置文件,即將多個任務定義在一個劇本中由 Ansible自動執(zhí)行,可以由控制主機針對多臺被管理主機同時運行多個任務。
Core modules核心模塊:是 Ansible自帶的模塊,使用這些模塊將資源分發(fā)到被管理主機,使其執(zhí)行特定任務或匹配特定的狀態(tài)。
Custom modules自定義模塊:用于完成模塊功能的補充,可借助相關插件完成記錄日志、發(fā)送郵件等功能。
ansible功能特性:
- 應用代碼自動化部署
- 系統(tǒng)管理配置自動化
- 支持持續(xù)交付自動化
- 支持云計算,大數(shù)據(jù)平臺環(huán)境
- 輕量級,無序在客戶端安裝agent,更新時只需在控制機上進行更行即可
- 批量任務執(zhí)行可以寫成腳本,不用分發(fā)到遠程就可以執(zhí)行
- 支持非root用戶管理操作,支持sudo
- 使用python編寫,維護更簡單
二、Ansible安裝
Ansible 自動化運維環(huán)境由控制主機與被管理主機組成,由于Ansible是基于SSH協(xié)議進行通信的,所以控制主機安裝Ansible軟件后不需要重啟或運行任何程序,被管理主機也不需要安裝和運行任何代理程序。
實驗安裝環(huán)境:
角色 | 主機名 | IP地址 | 組名 |
---|---|---|---|
控制主機 | 01 | 192.168.100.129 | |
被管理主機 | 02 | 192.168.100.128 | webserver |
被管理主機 | 03 | 192.168.100.130 | mysql |
三臺主機關閉防火墻:
[root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# setenforce 0
安裝步驟:
控制主機安裝ansible并生成密鑰對批量發(fā)送給被管理主機
1.yum安裝環(huán)境包與ansible:
yum install epel-release -y yum install ansible –y
2.查看ansible版本
[root@01 ~]# ansible --version
3.yum安裝完成后會生成3個文件
[root@01 ~]# cd /etc/ansible/ [root@01 ansible]# ls
4.配置被管理端主機IP清單
[root@01 ansible]# vim /etc/ansible/hosts //配置主機清單
5.雖然ansible的配置文件已經(jīng)設置完成被管理端的IP地址,但是因為ansible是基于ssh協(xié)議,所以還需要配置密鑰對驗證
[root@01 ~]# ssh-keygen -t rsa //生成密鑰對
6.ssh協(xié)議免交互代理
[root@01 ~]# ssh-agent bash [root@01 ~]# ssh-add
shell腳本批量發(fā)送公鑰
(1).下載安裝expect
[root@01 .ssh]# yum install expect -y //yum安裝expect
(2). ping通所有可互通的主機
[root@01 .ssh]# ansible all -m ping //使用ansible中的ping模塊
ansible是基于SSH協(xié)議,所以可以ping通的主機儲存在.ssh/known_hosts的文件當中。當然就算不ping通也可以用shell腳本實現(xiàn)批量推送公鑰。
在最新版本ansible 2.7.0中,在沒有推送公鑰形成密鑰對的情況下,無法使用ping模塊ping通的情況下,很難用authorized_key模塊去推送公鑰的。所以我更改了下shell腳本,這樣就可以在無法用ping模塊ping通的情況下直接實現(xiàn)批量推送公鑰形成密鑰對。
[root@01 ~]# cd ~/.ssh/ [root@01 .ssh]# ls id_rsa id_rsa.pub known_hosts [root@01 .ssh]# vim known_hosts //查看下已經(jīng)記錄在SSH協(xié)議的主機,不做任何修改操作
(2).編寫shell腳本實現(xiàn)批量推送公鑰
[root@01 .ssh]# vim ~/.ssh/pushssh.sh
腳本如下:
#!/bin/sh cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys host1=`cat /etc/ansible/hosts | awk -F " " '{print $1}' | grep '^192'` #在生產(chǎn)情況中,有很多種獲得IP的方法,本腳本最重要的就是獲得IP地址,腳本只是提供一個思路。 for i in $host1; do command1="scp ~/.ssh/authorized_keys root@$i:~/.ssh/authorized_keys" password="123123" /usr/bin/expect -c " spawn ssh-copy-id root@$i expect { "*password" { send "$passwordr"; exp_continue } } expect eof" done #編寫腳本完成后保存退出 [root@01 .ssh]# sh pushssh.sh //執(zhí)行腳本
PS:想要執(zhí)行這個腳本,首先需要下載安裝expect,同時被管理端主機的密碼需要是一致的。
———————-驗證——————-
查看下腳本是否執(zhí)行成功:
此時就可以進行ansible批量部署操作
[root@01 ~]# ansible all -m command -a 'date'