1. 什么是Ansible,它有什么用?
Ansible它是個(gè)集配置管理和應(yīng)用部署于一體的自動(dòng)化運(yùn)維工具。
應(yīng)用情況:1)自動(dòng)化批量部署應(yīng)用;2)自動(dòng)化管理配置文件;3)自動(dòng)化云服務(wù)器;4)自動(dòng)化持續(xù)交付。
它默認(rèn)通過(guò)ssh協(xié)議管理機(jī)器。真正具有批量部署的是ansible所運(yùn)行的模塊,ansible只是提供一種框架。主要包括:
(1)、連接插件connection plugins:負(fù)責(zé)和被監(jiān)控端實(shí)現(xiàn)通信;
(2)、host inventory:指定操作的主機(jī),是一個(gè)配置文件里面定義監(jiān)控的主機(jī);
(3)、各種模塊核心模塊、command模塊、自定義模塊;
(4)、借助于插件完成記錄日志郵件等功能;
(5)、playbook:劇本執(zhí)行多個(gè)任務(wù)時(shí),非必需可以讓節(jié)點(diǎn)一次性運(yùn)行多個(gè)任務(wù)。
它的優(yōu)點(diǎn)
1. 輕量級(jí),無(wú)需在客戶端安裝agent,更新時(shí),只需在操作機(jī)上進(jìn)行一次更新即可;
2. 批量任務(wù)執(zhí)行可以寫成腳本,而且不用分發(fā)到遠(yuǎn)程就可以執(zhí)行;
3. 使用python編寫,維護(hù)更簡(jiǎn)單,ruby語(yǔ)法過(guò)于復(fù)雜;
4.? 支持sudo。
需求:
管理主機(jī):本地電腦或者筆記本一臺(tái),安裝ansible軟件。
托管節(jié)點(diǎn)(被管理對(duì)象):一組遠(yuǎn)程服務(wù)器,已安裝python2.4以上版本。如節(jié)點(diǎn)未開(kāi)啟sftp,則需要在ansible.cfg 配置文件中配置成 scp 的方式,以完成通訊。
進(jìn)階話題:chroot,lxc,jailcontainers這些本地管理選項(xiàng)。還有一個(gè)ansible-pull模式,反轉(zhuǎn)主控關(guān)系,讓托管節(jié)點(diǎn),定期從中央git目錄,拉取配置并實(shí)現(xiàn)北京連接通信。
2. 安裝ansible,筆者為mac筆記本,故而僅介紹mac ox上安裝方式。
brew install ansible
接著編輯(或創(chuàng)建)/etc/ansible/hosts (這是默認(rèn)配置路徑),并在其中加入一個(gè)或多個(gè)遠(yuǎn)程系統(tǒng).
3.? 重要的配置文件Inventory, ansible.cfg
ansible可以對(duì)同一個(gè)組的主機(jī)進(jìn)行批量配置,組與主機(jī)的關(guān)系,就是通過(guò)Inventory文件的配置項(xiàng)確認(rèn)的。
以下內(nèi)容為某個(gè)簡(jiǎn)要的案例配置
[ECSServers]
主機(jī)名? ? ansible_ssh_host=主機(jī)ip? ? ansible_ssh_port=(22為默認(rèn)項(xiàng) )? ?ansible_ssh_user=root
[組名:vars]
[組名A:children]? ? # 參數(shù)都是組名,假設(shè)為組名B,children意味著組名A的變量都可以被組名B繼承
動(dòng)態(tài)Inventory配置
這里僅適用一個(gè)python文件的方式,展示動(dòng)態(tài)Inventory配置方法,其他方法請(qǐng)查詢網(wǎng)上資料。一般生產(chǎn)上是從cmdb,從數(shù)據(jù)庫(kù)中獲取動(dòng)態(tài)的Inventory配置信息。然后實(shí)行配置。這里的python文件方式僅僅只是個(gè)展示。
#! /usr/bin/env python
# coding=utf-8
import json
hostip1 = ['192.168.1.15']
hostip2 = ['192.168.1.35']
group1 = 'test1'
group2 = 'test2'
hostdata = {group1:{"hosts":hostip1},group2:{"hosts":hostip2}}
print json.dumps(hostdata,indent=4)
關(guān)于ansible.cfg,查看stackflow資料。
如果是linux系統(tǒng),一般可能位于以下位置:
ANSIBLE_CONFIG (an environment variable)
ansible.cfg (in the current directory)
.ansible.cfg (in the home directory)
/etc/ansible/ansible.cfg
重要的配置項(xiàng)有:
inventory = /etc/ansible/hosts? #默認(rèn)inventory文件路徑
forks = 5? # 執(zhí)行命令時(shí),一次性啟動(dòng)的并行線程數(shù),以便批量處理服務(wù)器的配置部署。
sudouser = root #默認(rèn)情況,一般不用改,但是特殊的情況下,要改
remote_port
timeout? ? # 連接持續(xù)多久算超時(shí)失敗
log_path = xxx/xxx/xxx.log? ? # 默認(rèn)情況下,不記錄日志,如果想開(kāi)啟日志記錄,必須設(shè)置log_path的值
transport = smart? ? # 用戶通??梢赃@個(gè)設(shè)置為‘smart’,讓playbook在需要的條件自己選擇‘connection:’參數(shù).
4.? 新手任務(wù):測(cè)試ping命令,嘗試能否ping的通一組服務(wù)器.(ps:筆者只有一臺(tái)可測(cè)試用)
ansible? all? -m? ping? -u? root? --ask-pass
all:所有主機(jī);? ? -m ping:測(cè)試ping命令;? ? -u root:使用root用戶;? ? --ask-pass:要求輸入密碼。
擴(kuò)展知識(shí),如果不想要【--ask-pass】選項(xiàng),希望免密碼登錄,則需要在本機(jī)設(shè)置ssh的秘鑰。以下為簡(jiǎn)要步驟:
首先是原理解釋圖:

接著是操作步驟:參考資料
假設(shè)ansible管理主機(jī)A,要求免密登錄到遠(yuǎn)程節(jié)點(diǎn)服務(wù)器B。
A主機(jī)上
ssh-keygen -t rsa -C 'ForECSServer'
scp id_sra.pub root@服務(wù)器ip:/root/.ssh? # 筆者曾用MyMac.pub測(cè)試,莫名失敗,標(biāo)記該事項(xiàng)。
B服務(wù)器上
cd?/root/.ssh
cat id_sra.pub >> authorized_keys
A主機(jī)上測(cè)試免密登錄
ssh?root@服務(wù)器ip? ? # 注意,如果A主機(jī)上執(zhí)行命令的用戶不是root,那么必須要用root@ip的形式才能免密碼登錄
最后測(cè)試下ansible的免密登錄,執(zhí)行以下命令
ansible all -m ping -u root # ok,登錄成功。
5.? Ansible的ad-hoc命令
使用案例1,在服務(wù)器上執(zhí)行重啟命令
ansible? [你的組名]? -a "/sbin/reboot"? -f? 10?
a:args的意思,參數(shù),f:forks,指定線程數(shù),該案例說(shuō)明一次開(kāi)啟10個(gè)線程,重啟10臺(tái)節(jié)點(diǎn)服務(wù)器。想象下管理成百上千個(gè)服務(wù)器的情形。
使用案例2,在一臺(tái)服務(wù)器上執(zhí)行shell命令
ansible ?[你的組名]? -m shell -a'echo $TERM'
-m參數(shù)指定ansible使用的模塊,默認(rèn)是command模塊,這里指定shell,-a:參數(shù),不提。
使用案例3,將本地文件copy到一組服務(wù)器上
ansible [你的組名] -m copy -a"src=/etc/hosts dest=/tmp/hosts"
-m:使用copy模塊;? ? -a:src和dest
使用案例4,yum和apt的支持
ansible [你的組名] -m yum -a"name=acme state=present"
使用案例5,使用git部署web-app,好方便的方法
ansible? [你的組名]? -m service -a"name=httpd state=started"
使用案例6,管理服務(wù)service
ansible webservers -m service -a"name=httpd state=started"
-a:args的意思,其中state可以為stated,restarted,stopped,確認(rèn)已啟動(dòng)/重啟/停止
使用案例7,將進(jìn)程掛后臺(tái)執(zhí)行,以及查詢
ansible all -m ping -B 3600 -P 0
-B 3600:表示異步后臺(tái)執(zhí)行,在3600秒后失敗,-P :設(shè)定Poll Interval時(shí)間,默認(rèn)值為15秒;
ansible all -m async_status "jid='上一條命令獲得的ansible_job_id的值' "
使用案例8,file模塊的使用,詳見(jiàn)圖片資料
使用案例9,cron計(jì)劃任務(wù)模塊的使用,詳見(jiàn)圖片資料
使用案例10,yum和get_url模塊的使用,詳見(jiàn)圖片資料
參考資料截圖如下:





6. Ansible 提供了7個(gè)命令,執(zhí)行不同操作
ansible:核心指令,用于執(zhí)行ad-hoc單條命令。類似linux的shell中執(zhí)行一條指令
操作指令格式:ansible? [服務(wù)器組名/服務(wù)器主機(jī)名] -m 模塊 -a 參數(shù) -f 線程數(shù)。具體查-h幫助文檔
ansible-doc:用于查看模塊信息。-l 列出模塊,
ansible-galaxy:用于方便的下載第三方模塊
ansible-lint:用于playbook語(yǔ)法檢查的命令。
ansible-playbook:生產(chǎn)商最為常用的命令。
ansible-pull:pull模式,一個(gè)很重要的模式,必須學(xué)會(huì)使用。
ansible-vault:加密解密命令。重要的安全命令,導(dǎo)致使用復(fù)雜,但是更高的安全性。
7. Playbooks
Playbooks是 Ansible的配置,部署,編排語(yǔ)言.他們可以被描述為一個(gè)需要希望遠(yuǎn)程主機(jī)執(zhí)行命令的方案,或者一組IT程序運(yùn)行的命令集合.
一個(gè)簡(jiǎn)單的ansible例子:(ps:這是個(gè)yml文件,由你來(lái)命名,例如website.yml)
---
- hosts: webservers
vars:
http_port: 80
max_clients: 200
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: pkg=httpd state=latest
- name: write the apache config file
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service: name=httpd state=restarted
這里主要討論它各個(gè)模塊的作用:
1)host:組名或者主機(jī)名,指定被操作的服務(wù)器
2)task:不用說(shuō)了吧,任務(wù)
3)notify:位于task中,與handlers結(jié)合使用,主要用于服務(wù)重啟或者服務(wù)器重啟,其他場(chǎng)景用的很少。思考playbook的執(zhí)行順序以便理解。task中一系列任務(wù)完成后,可能任務(wù)A觸發(fā)一個(gè)notify restart nginx;任務(wù)B也觸發(fā)一個(gè)notfiy restart nginx。。。。最后handlers僅在觸發(fā)notify的情況下,執(zhí)行一次。
4)include和roles:重要的功能,主要是復(fù)用代碼的思想。
5)vars:自定義變量,關(guān)于自定義變量,存在三種定義變量的方法,
方法一:在Inventory文件(默認(rèn)為/etc/ansible/hosts)中設(shè)定變量,直接{{ 變量名 }}來(lái)使用
方法二:在playbook文檔中,vars:模塊設(shè)定,如上所述,同樣通過(guò){{ 變量名 }}來(lái)使用。
方法三:引用其他playbook文檔,vars_files:模塊設(shè)定,通過(guò){{ 變量名 }}引用,如下所示。
vars_files:? ?#
? ? - var.yml??
6)register模塊,從5)小點(diǎn)引申而來(lái),用來(lái)進(jìn)行任務(wù)間通信,主要是任務(wù)間的信息傳遞,這個(gè)模塊功能很重要,如下所示

該案例中,注冊(cè)了一個(gè)info變量。該變量用于記錄
8. Playbooks提升
1)Playbook的一個(gè)頂層結(jié)構(gòu)組織方式,參考資料。注意兩個(gè)入口文件,site.yml是劇本playbook的入口文件,main.yml是角色對(duì)應(yīng)功能的入口文件。
production? ? ? ? ? ? ? ? # inventory file for production servers 關(guān)于生產(chǎn)環(huán)境服務(wù)器的清單文件
stage? ? ? ? ? ? ? ? ? ? ? ? # inventory file for stage environment 關(guān)于 stage 環(huán)境的清單文件
group_vars/
? ? ? ?group1? ? ? ? ? ? ? ? # 這里我們給特定的組賦值
? ? ? ?group2? ? ? ? ? ? ? ? # ""
host_vars/
? ? ? ? hostname1? ? ? ? # 如果系統(tǒng)需要特定的變量, 把它們放置在這里.
? ? ? ? hostname2? ? ? ? # ""
library/? ? ? ? ? ? ? ? ? ? ? ?#如果有自定義的模塊,放在這里(可選)
filter_plugins/? ? ? ? ? ? ?# 如果有自定義的過(guò)濾插件,放在這里(可選)
site.yml? ? ? ? ? ? ? ? ? ? ? # master playbook 主 playbook
webservers.yml? ? ? ? ?# playbook for webserver tier Web 服務(wù)器的 playbook
dbservers.yml? ? ? ? ? ? # playbook for dbserver tier 數(shù)據(jù)庫(kù)服務(wù)器的 playbook
roles/
? ? ? ? common/? ? ? ? ? ? # this hierarchy represents a "role" 這里的結(jié)構(gòu)代表了一個(gè) "role"
? ? ? ? ? ? ? ? tasks/? ? ? ? ? ? #
? ? ? ? ? ? ? ? ? ? ? ? main.yml? ? ? #? <-- tasks file can include smaller files if warranted
? ? ? ? ? ? ? ? handlers/? ? ? ? #
? ? ? ? ? ? ? ? ? ? ? ? main.yml? ? ? #? <-- handlers file
? ? ? ? ? ? ? ? templates/? ? ? ? #? <-- files for use with the template resource
? ? ? ? ? ? ? ? ? ? ? ? ?ntp.conf.j2? #? <------- templates end in .j2
? ? ? ? ? ? ? ? ?files/? ? ? ? ? ? #
? ? ? ? ? ? ? ? ? ? ? ? ? bar.txt? ? ? #? <-- files for use with the copy resource
? ? ? ? ? ? ? ? ? ? ? ? ? foo.sh? ? ? ? #? <-- script files for use with the script resource
? ? ? ? ? ? ? ? ?vars/? ? ? ? ? ? #
? ? ? ? ? ? ? ? ? ? ? ? ? ?main.yml? ? ? #? <-- variables associated with this role
? ? ? ? ? ? ? ? ?defaults/? ? ? ? #
? ? ? ? ? ? ? ? ? ? ? ? ? ? main.yml? ? ? #? <-- default lower priority variables for this role
? ? ? ? ? ? ? ? ?meta/? ? ? ? ? ? #
? ? ? ? ? ? ? ? ? ? ? ? ? ? main.yml? ? ? #? <-- role dependencies
? ? ? ? webtier/? ? ? ? ? ? ? # same kind of structure as "common" was above, done for the webtier role
? ? ? ? monitoring/? ? ? ? ? # ""
? ? ? ? fooapp/? ? ? ? ? ? ? # ""
2)變量
3)條件判斷:when
4)循環(huán)
5)過(guò)濾器的使用,例如
