1. 程式人生 > >3.1 自動化運維工具ansible

3.1 自動化運維工具ansible

數據結構 切換 應用實戰 fab plugins 管理器 執行 0.10 部門

自動化運維工具ansible

運維自動化發展歷程及技術應用

技術分享圖片

技術分享圖片

Iaas 基礎設施即服務
Pass 平臺服務
SaaS 軟件即服務

雲計算工程師核心職能
技術分享圖片

Linux運維工程師職能劃分

技術分享圖片

自動化動維應用場景

文件傳輸
命令執行
應用部署
配置管理
任務流編排

企業實際應用場景分析

1 Dev開發環境

使用者:程序員
功能:程序員開發軟件,測試BUG的環境
管理者:程序員123

2 測試環境

使用者:QA測試工程師
功能:測試經過Dev環境測試通過的軟件的功能
管理者:運維
說明:測試環境往往有多套,測試環境滿足測試功能即可,不宜過多
(1)測試人員希望測試環境有多套,公司的產品多產品線並發,即多個版本,意味著多個版本同步測試

(2)通常測試環境有多少套和產品線數量保持一樣123456

3 發布環境:代碼發布機,有些公司為堡壘機(安全屏障)

使用者:運維
功能:發布代碼至生產環境
管理者:運維(有經驗)
發布機:往往需要有2臺(主備)1234

4 生產環境

使用者:運維,少數情況開放權限給核心開發人員,極少數公司將權限完全開放給開發人員並其維護
功能:對用戶提供公司產品的服務
管理者:只能是運維
生產環境服務器數量:一般比較多,且應用非常重要。往往需要自動工具協助部署配置應用1234

5 灰度環境(生產環境的一部分)

使用者:運維
功能:在全量發布代碼前將代碼的功能面向少量精準用戶發布的環境,可基於主機或用戶執行灰度發布
案例:共100臺生產服務器,先發布其中的10臺服務器,這10臺服務器就是灰度服務器

管理者:運維
灰度環境:往往該版本功能變更較大,為保險起見特意先讓一部分用戶優化體驗該功能,待這部分用戶使用沒有重大問題的時候,再全量發布至所有服務器12345

程序發布

預發布驗證

新版本的代碼先發布到服務器(跟線上環境配置完全相同,只是未接入到調度器)

程序發布:

不能導致系統故障或造成系統完全不可用
不能影響用戶體驗
灰度發布:
發布路徑:
把原來的舊版本保留
/webapp/tuangou-1.1
/webapp/tuangou
/webapp/tuangou-1.21234

發布過程:在調度器上下線一批主機(標記為maintanance狀態) –> 關閉服務 –> 部署新版本的應用程序 –> 啟動服務 –> 在調度器上啟用這一批服務器。

自動化灰度發布:腳本、發布平臺

常用自動化運維工具

1 Ansible:python,Agentless,中小型應用環境(不需要在客戶端安裝代理程序,2 基於ssh來管理,300-500臺服務器)
3 Saltstack:python,一般需部署agent,執行效率更高
4 Puppet:ruby, 功能強大,配置復雜,重型,適合大型環境
5 Fabric:python,agentless
6 Chef: ruby,國內應用少
7 Cfengine
8 func

企業級自動化運維工具應用實戰ansible

公司計劃在年底做一次大型市場促銷活動,全面沖刺下交易額,為明年的上市做準備。公司要求各業務組對年底大促做準備,運維部要求所有業務容量進行三倍的擴容,並搭建出多套環境可以共開發和測試人員做測試,運維老大為了在年底有所表現,要求運維部門同學盡快實現,當你接到這個任務時,有沒有更快的解決方案?

Ansible

特性

模塊化:調用特定的模塊,完成特定任務。
有Paramiko,PyYAML,Jinja2(模板語言)三個關鍵模塊。
支持自定義模塊。
基於Python語言實現。
部署簡單,基於python和SSH(默認已安裝),agentless。
安全,基於OpenSSH。
支持playbook編排任務。
冪等性:一個任務執行1遍和執行n遍效果一樣,不因重復執行帶來意外情況。
無需代理不依賴PKI(無需ssl)。
可使用任何編程語言寫模塊。
YAML格式,編排任務,支持豐富的數據結構。
較強大的多層解決方案。

ansible架構

技術分享圖片

  • ansible是基於key的,所以需要將主機間實現key驗證。當然用密碼也可以,只是比較麻煩

Ansible工作原理

技術分享圖片

直接使用ansible命令來執行一條命令
當生產環境穩定後可以用ansible編寫playboot腳本來執行
可以使用公有雲或私有雲
可以使用CMDB,配置管理數據庫

Ansible主要組成部分

ANSIBLE PLAYBOOKS:任務劇本(任務集),編排定義Ansible任務集的配置文件,由Ansible順序依次執行,通常是JSON格式的YML文件
INVENTORY:Ansible管理主機的清單/etc/anaible/hosts
MODULES:Ansible執行命令的功能模塊,多數為內置的核心模塊,也可自定義
PLUGINS:模塊功能的補充,如連接類型插件、循環插件、變量插件、過濾插件等,該功能不常用
API:供第三方程序調用的應用程序編程接口
ANSIBLE:組合INVENTORY、API、MODULES、PLUGINS的綠框,可以理解為是ansible命令工具,其為核心執行工具

Ansible命令執行來源:
USER,普通用戶,即SYSTEM ADMINISTRATOR
CMDB(資產管理系統) API 調用
PUBLIC/PRIVATE CLOUD API調用
USER-> Ansible Playbook -> Ansibile
利用ansible實現管理的方式:
Ad-Hoc 即ansible命令,主要用於臨時命令使用場景
Ansible-playbook 主要用於長期規劃好的,大型項目的場景,需要有前提的規劃
-Ansible-playbook(劇本)執行過程:
將已有編排好的任務集寫入Ansible-Playbook
通過ansible-playbook命令分拆任務集至逐條ansible命令,按預定規則逐條執行
Ansible主要操作對象:
HOSTS主機
NETWORKING網絡設備

註意事項
執行ansible的主機一般稱為主控端,中控,master或堡壘機
主控端Python版本需要2.6或以上
被控端Python版本小於2.4需要安裝python-simplejson
被控端如開啟SELinux需要安裝libselinux-python
windows不能做為主控端

安裝

rpm包安裝: EPEL源

yum install ansible
ansible不是一個服務/etc/hosts是最重要的文件
ansible是一個管理端123

編譯安裝

yum -y install python-jinja2 PyYAML python-paramiko
python-babel python-crypto
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible12345678

Git方式
git clone git://github.com/ansible/ansible.git --
recursive12

cd ./ansible
source ./hacking/env-setup

pip安裝: pip是安裝Python包的管理器,類似yum

yum install python-pip python-devel
yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel
pip install --upgrade pip
pip install ansible --upgrade1234

確認安裝: ansible –version

相關文件

配置文件

/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主機清單被管理端的主機存放,如果將主機不寫入這個文件則無法管理這個主機
/etc/ansible/roles/ 存放角色的目錄123

如果要管理的ip沒加入到hosts這文件中則會出現這種錯誤

[root@centos7 yum.repos.d]# ansible 192.168.27.101 -m ping
[WARNING]: Could not match supplied host pattern, ignoring: all

[WARNING]: provided hosts list is empty, only localhost is available

[WARNING]: Could not match supplied host pattern, ignoring: 192.168.27.101

[WARNING]: No hosts matched, nothing to do12345678

將主機加入到hosts文件中,最簡單的方法是將要管理的主機ip寫進去,推薦,用分類的方式
技術分享圖片

分類的方式

[root@centos7 yum.repos.d]# vim /etc/ansible/hosts

#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements

# - You can enter hostnames or ip addresses
# - A hostname/ip can be a member of multiple groups

192.168.27.[101:103] 也可以寫成這種格式這表示192.168.27.101到103直接的ip

# Ex 1: Ungrouped hosts, specify before any group headers.

## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10
# Ex 2: A collection of hosts belonging to the ‘webservers‘ group

## [webservers]
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110

# If you have multiple hosts
``` following a pattern you can specify

them like this:

www[001:006].example.com

Ex 3: A collection of database

``` servers in the ‘dbservers‘ group

## [dbservers]
## 
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57
# Here‘s another example of host ranges, this time there are no
# leading 0s:

## db-[99:101]-node.example.com1234567891011121314151617181920212223242526272829303132333435363738394041

然後在次用ping命令來檢查主機是否活躍
技術分享圖片

因為ansible是基於shh的,第一次鏈接需要輸入yes/no,不是很方便,想要去掉這個yes/no需要修改配置文件/etc/ansible/ansible.cfg這個文件
技術分享圖片

把host_key_checking = False這一行註釋去掉
在重新執行就不會提示這樣第一次yes或no
技術分享圖片
但是報錯,也沒有讓我們輸入密碼,ansible默認是基於key驗證的,如果想使用密碼在後面加-k
技術分享圖片

這樣就成功了,當然我們也可以多臺主機,主機ip之間用逗號隔開
技術分享圖片
當然我們只用輸入一遍密碼兩個主機都成功了,說明如果主機密碼不一樣會報錯

技術分享圖片

用分組的方式將被管理主機寫如/etc/ansible/ansible.cfg文件中

分組就是將一組主機分成一組,並在中括號裏取一個組名,一個主機可以在多個組裏。還有一個默認組就是all,這個組表示在這個文件中的所有主機

創建key驗證

用ssh-keygen 生成公鑰私鑰對

技術分享圖片

[root@ansible ~]# cd ~
[root@ansible ~]# cd .ssh/
[root@ansible .ssh]# ls
id_rsa id_rsa.pub known_hosts
[root@ansible .ssh]# 12345

用ssh-copy-id 要連接的ip主機
技術分享圖片
完成key驗證後,就不用加-k選項了

技術分享圖片

由於ansible默認是沒有啟用日誌的,所以我們要在配置文件中啟用配置文件

技術分享圖片

技術分享圖片
默認也是沒有啟用的,把註釋去掉啟用,當然也可改成其它路徑
執行以下ansible命令,然後看一下日誌文件
技術分享圖片
這裏面存放著命令的執行結果

程序
/usr/bin/ansible 主程序,臨時命令執行工具
/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具
/usr/bin/ansible-galaxy 下載/上傳優秀代碼或Roles模塊的官網平臺
/usr/bin/ansible-playbook 定制自動化任務,編排劇本工具
/usr/bin/ansible-pull 遠程執行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基於Console界面與用戶交互的執行工具1234567

主機清單inventory

Inventory 主機清單
ansible的主要功用在於批量主機操作,為了便捷地使用其中的部分主機,可以在inventory file中將其分組命名
默認的inventory file為/etc/ansible/hosts
inventory file可以有多個,且也可以通過DynamicInventory來動態生成
/etc/ansible/hosts文件格式
inventory文件遵循INI文件風格,中括號中的字符為組名。可以將同一個主機同時歸並到多個不同的組中;此外,當如若目標主機使用了非默認的SSH端口,還可以在主機名稱之後使用冒號加端口號來標明

ntp.magedu.com
[webservers]
www1.magedu.com:2222
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com12345678

如果主機名稱遵循相似的命名模式,還可以使用列表的方式標識各主機

示例

[websrvs]
www[01:100].example.com
[dbsrvs]
db-[a:f].example.com1234

ansible配置文件

Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默認)
[defaults]
#inventory = /etc/ansible/hosts # 主機列表配置文件
#library = /usr/share/my_modules/ # 庫文件存放目錄
#remote_tmp = $HOME/.ansible/tmp #臨時py命令文件存放在遠程主機目錄,就是當我們執行命令是相當於把命令復制到遠程主機中這個目錄下生成一個臨時文件,執行完後刪除
#local_tmp = $HOME/.ansible/tmp # 本機的臨時命令執行目錄
#forks = 5 # 默認並發數,如果有100臺主機就會5臺5臺的執行,分批次的,也可以調100,要求機器性能好
#sudo_user = root # 默認sudo 用戶,需要在被管理主機上做sudo配置
#ask_sudo_pass = True #每次執行ansible命令是否詢問ssh密碼
#ask_pass = True
#remote_port = 22 因為是基於ssh,ssh默認是22端口,如果ssh端口號改成其它的,這裏也是要改的
#host_key_checking = False # 檢查對應服務器的host_key,建議取消註釋123456789101112

ansible系列命令

Ansible系列命令

ansible ansible-doc ansible-playbook ansible-vault
ansible-console ansible-galaxy ansible-pull12

ansible-doc: 顯示模塊幫助

ansible-doc [options] [module...]
-a 顯示所有模塊的文檔
-l, --list 列出可用模塊
-s, --snippet 顯示指定模塊的playbook片段1234

示例
ansible-doc –l 列出所有模塊
ansible-doc ping 查看指定模塊幫助用法
ansible-doc –s ping 查看指定模塊幫助用法簡要信息123

技術分享圖片

技術分享圖片

ansible通過ssh實現配置管理、應用部署、任務執行等功能,建議配置ansible端能基於密鑰認證的方式聯系各被管理節點

ansible [-m module_name] [-a args]

--version 顯示版本
-m module 指定模塊,默認為command模塊
-v 詳細過程 –vv -vvv更詳細
--list-hosts 顯示主機列表,可簡寫—list
-k, --ask-pass 提示連接密碼,默認Key驗證
-K, --ask-become-pass 提示輸入sudo
-C, --check 檢查,並不執行,只是模擬的執行一次,並不會在真正的主機上執行
-T, --timeout=TIMEOUT 執行命令的超時時間,默認10s
-u, --user=REMOTE_USER 執行遠程執行的用戶,指定以哪個用戶執行,如果不指定則默認是root
-b, --become 代替舊版的sudo 切換12345678910

顯示主機列表
技術分享圖片
指定用戶
技術分享圖片
也可以用sudo,提前是要把對端主機上配置好sudo文件
配置sudo文件,這裏我們直接把用戶加入wheel組中,因為wheel組中在sudo是一個管理員組,擁有root的權限
技術分享圖片
這裏用command模塊是命令模塊,加-a是可以後面跟參數,但是這裏報錯,讓我們輸入sudo的密碼加上大K參數
技術分享圖片
這裏會讓輸入兩邊口令,一個是guo用戶ssh的口令,一個sudo的口令,這樣會很麻煩,我們改一下sudo配置文件設置成不輸入此密碼,在/etc/sudoers
技術分享圖片
這樣就只用輸入一個ssh口令了

技術分享圖片

如何將guo用戶也設置成key驗證呢

用命令ssh-copy-i [email protected]
技術分享圖片
在執行以下就不用輸入密碼了

技術分享圖片

usermod -aG wheel guo1

3.1 自動化運維工具ansible