Ansible讀書筆記

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ò)濾器的使用,例如

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容