1. 什么是Ansible杖们,它有什么用?
Ansible它是個集配置管理和應(yīng)用部署于一體的自動化運維工具撤蟆。
應(yīng)用情況:1)自動化批量部署應(yīng)用牵寺;2)自動化管理配置文件械姻;3)自動化云服務(wù)器妒蛇;4)自動化持續(xù)交付。
它默認通過ssh協(xié)議管理機器楷拳。真正具有批量部署的是ansible所運行的模塊绣夺,ansible只是提供一種框架。主要包括:
(1)欢揖、連接插件connection plugins:負責和被監(jiān)控端實現(xiàn)通信陶耍;
(2)、host inventory:指定操作的主機她混,是一個配置文件里面定義監(jiān)控的主機烈钞;
(3)泊碑、各種模塊核心模塊、command模塊毯欣、自定義模塊馒过;
(4)、借助于插件完成記錄日志郵件等功能酗钞;
(5)腹忽、playbook:劇本執(zhí)行多個任務(wù)時,非必需可以讓節(jié)點一次性運行多個任務(wù)砚作。
它的優(yōu)點
1. 輕量級窘奏,無需在客戶端安裝agent,更新時葫录,只需在操作機上進行一次更新即可着裹;
2. 批量任務(wù)執(zhí)行可以寫成腳本,而且不用分發(fā)到遠程就可以執(zhí)行压昼;
3. 使用python編寫求冷,維護更簡單,ruby語法過于復雜窍霞;
4.? 支持sudo匠题。
需求:
管理主機:本地電腦或者筆記本一臺,安裝ansible軟件但金。
托管節(jié)點(被管理對象):一組遠程服務(wù)器韭山,已安裝python2.4以上版本。如節(jié)點未開啟sftp冷溃,則需要在ansible.cfg 配置文件中配置成 scp 的方式钱磅,以完成通訊。
進階話題:chroot似枕,lxc盖淡,jailcontainers這些本地管理選項。還有一個ansible-pull模式凿歼,反轉(zhuǎn)主控關(guān)系褪迟,讓托管節(jié)點,定期從中央git目錄答憔,拉取配置并實現(xiàn)北京連接通信味赃。
2. 安裝ansible,筆者為mac筆記本虐拓,故而僅介紹mac ox上安裝方式心俗。
brew install ansible
接著編輯(或創(chuàng)建)/etc/ansible/hosts (這是默認配置路徑),并在其中加入一個或多個遠程系統(tǒng).
3.? 重要的配置文件Inventory, ansible.cfg
ansible可以對同一個組的主機進行批量配置,組與主機的關(guān)系城榛,就是通過Inventory文件的配置項確認的揪利。
以下內(nèi)容為某個簡要的案例配置
[ECSServers]
主機名? ? ansible_ssh_host=主機ip? ? ansible_ssh_port=(22為默認項 )? ?ansible_ssh_user=root
[組名:vars]
[組名A:children]? ? # 參數(shù)都是組名,假設(shè)為組名B吠谢,children意味著組名A的變量都可以被組名B繼承
動態(tài)Inventory配置
這里僅適用一個python文件的方式土童,展示動態(tài)Inventory配置方法,其他方法請查詢網(wǎng)上資料工坊。一般生產(chǎn)上是從cmdb献汗,從數(shù)據(jù)庫中獲取動態(tài)的Inventory配置信息。然后實行配置王污。這里的python文件方式僅僅只是個展示罢吃。
#! /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
重要的配置項有:
inventory = /etc/ansible/hosts? #默認inventory文件路徑
forks = 5? # 執(zhí)行命令時,一次性啟動的并行線程數(shù)阱驾,以便批量處理服務(wù)器的配置部署就谜。
sudouser = root #默認情況,一般不用改里覆,但是特殊的情況下丧荐,要改
remote_port
timeout? ? # 連接持續(xù)多久算超時失敗
log_path = xxx/xxx/xxx.log? ? # 默認情況下,不記錄日志喧枷,如果想開啟日志記錄虹统,必須設(shè)置log_path的值
transport = smart? ? # 用戶通常可以這個設(shè)置為‘smart’,讓playbook在需要的條件自己選擇‘connection:’參數(shù).
4.? 新手任務(wù):測試ping命令隧甚,嘗試能否ping的通一組服務(wù)器.(ps:筆者只有一臺可測試用)
ansible? all? -m? ping? -u? root? --ask-pass
all:所有主機车荔;? ? -m ping:測試ping命令;? ? -u root:使用root用戶戚扳;? ? --ask-pass:要求輸入密碼忧便。
擴展知識,如果不想要【--ask-pass】選項帽借,希望免密碼登錄珠增,則需要在本機設(shè)置ssh的秘鑰。以下為簡要步驟:
首先是原理解釋圖:
接著是操作步驟:參考資料
假設(shè)ansible管理主機A宜雀,要求免密登錄到遠程節(jié)點服務(wù)器B切平。
A主機上
ssh-keygen -t rsa -C 'ForECSServer'
scp id_sra.pub root@服務(wù)器ip:/root/.ssh? # 筆者曾用MyMac.pub測試握础,莫名失敗辐董,標記該事項。
B服務(wù)器上
cd?/root/.ssh
cat id_sra.pub >> authorized_keys
A主機上測試免密登錄
ssh?root@服務(wù)器ip? ? # 注意禀综,如果A主機上執(zhí)行命令的用戶不是root简烘,那么必須要用root@ip的形式才能免密碼登錄
最后測試下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ù)退子,該案例說明一次開啟10個線程,重啟10臺節(jié)點服務(wù)器型将。想象下管理成百上千個服務(wù)器的情形寂祥。
使用案例2,在一臺服務(wù)器上執(zhí)行shell命令
ansible ?[你的組名]? -m shell -a'echo $TERM'
-m參數(shù)指定ansible使用的模塊七兜,默認是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,確認已啟動/重啟/停止
使用案例7言疗,將進程掛后臺執(zhí)行晴圾,以及查詢
ansible all -m ping -B 3600 -P 0
-B 3600:表示異步后臺執(zhí)行,在3600秒后失敗噪奄,-P :設(shè)定Poll Interval時間死姚,默認值為15秒;
ansible all -m async_status "jid='上一條命令獲得的ansible_job_id的值' "
使用案例8勤篮,file模塊的使用都毒,詳見圖片資料
使用案例9,cron計劃任務(wù)模塊的使用碰缔,詳見圖片資料
使用案例10账劲,yum和get_url模塊的使用,詳見圖片資料
參考資料截圖如下:
6. Ansible 提供了7個命令,執(zhí)行不同操作
ansible:核心指令瀑焦,用于執(zhí)行ad-hoc單條命令腌且。類似linux的shell中執(zhí)行一條指令
操作指令格式:ansible? [服務(wù)器組名/服務(wù)器主機名] -m 模塊 -a 參數(shù) -f 線程數(shù)。具體查-h幫助文檔
ansible-doc:用于查看模塊信息榛瓮。-l 列出模塊铺董,
ansible-galaxy:用于方便的下載第三方模塊
ansible-lint:用于playbook語法檢查的命令。
ansible-playbook:生產(chǎn)商最為常用的命令禀晓。
ansible-pull:pull模式精续,一個很重要的模式,必須學會使用粹懒。
ansible-vault:加密解密命令驻右。重要的安全命令,導致使用復雜崎淳,但是更高的安全性堪夭。
7. Playbooks
Playbooks是 Ansible的配置,部署,編排語言.他們可以被描述為一個需要希望遠程主機執(zhí)行命令的方案,或者一組IT程序運行的命令集合.
一個簡單的ansible例子:(ps:這是個yml文件,由你來命名拣凹,例如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
這里主要討論它各個模塊的作用:
1)host:組名或者主機名森爽,指定被操作的服務(wù)器
2)task:不用說了吧,任務(wù)
3)notify:位于task中嚣镜,與handlers結(jié)合使用爬迟,主要用于服務(wù)重啟或者服務(wù)器重啟,其他場景用的很少菊匿。思考playbook的執(zhí)行順序以便理解付呕。task中一系列任務(wù)完成后,可能任務(wù)A觸發(fā)一個notify restart nginx跌捆;任務(wù)B也觸發(fā)一個notfiy restart nginx徽职。。佩厚。姆钉。最后handlers僅在觸發(fā)notify的情況下,執(zhí)行一次抄瓦。
4)include和roles:重要的功能潮瓶,主要是復用代碼的思想。
5)vars:自定義變量钙姊,關(guān)于自定義變量毯辅,存在三種定義變量的方法,
方法一:在Inventory文件(默認為/etc/ansible/hosts)中設(shè)定變量煞额,直接{{ 變量名 }}來使用
方法二:在playbook文檔中思恐,vars:模塊設(shè)定赤屋,如上所述,同樣通過{{ 變量名 }}來使用壁袄。
方法三:引用其他playbook文檔,vars_files:模塊設(shè)定媚媒,通過{{ 變量名 }}引用嗜逻,如下所示。
vars_files:? ?#
? ? - var.yml??
6)register模塊缭召,從5)小點引申而來栈顷,用來進行任務(wù)間通信,主要是任務(wù)間的信息傳遞嵌巷,這個模塊功能很重要萄凤,如下所示
該案例中,注冊了一個info變量搪哪。該變量用于記錄
8. Playbooks提升
1)Playbook的一個頂層結(jié)構(gòu)組織方式靡努,參考資料。注意兩個入口文件晓折,site.yml是劇本playbook的入口文件惑朦,main.yml是角色對應(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/? ? ? ? ? ? ?# 如果有自定義的過濾插件,放在這里(可選)
site.yml? ? ? ? ? ? ? ? ? ? ? # master playbook 主 playbook
webservers.yml? ? ? ? ?# playbook for webserver tier Web 服務(wù)器的 playbook
dbservers.yml? ? ? ? ? ? # playbook for dbserver tier 數(shù)據(jù)庫服務(wù)器的 playbook
roles/
? ? ? ? common/? ? ? ? ? ? # this hierarchy represents a "role" 這里的結(jié)構(gòu)代表了一個 "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)過濾器的使用漓概,例如