Ansible 常用

一.前言

在企業(yè)中運(yùn)維工作人員通常需要同時(shí)管理幾十臺(tái)甚至幾百臺(tái)主機(jī)(虛擬機(jī)),如果需要批量修改設(shè)置或者做更新操作的話,即便是事先編寫(xiě)好腳本,一臺(tái)一臺(tái)的去運(yùn)行腳本也是非常耗時(shí)的,效率也十分低下。所以這時(shí)候我們需要可以在一臺(tái)主機(jī)上,同時(shí)操作、控制多臺(tái)其他主機(jī)的運(yùn)維工具。

目前主流的工具很多,基本可以分為兩類

1、agent:需要事先在被管控主機(jī)上安裝一個(gè)小的程序,用于接受和控制遠(yuǎn)端主機(jī),代表軟件有puppet、func。這類軟件運(yùn)行起來(lái)比較安全,但是需要提前部署代理程序,當(dāng)主機(jī)很多的時(shí)候會(huì)比較麻煩

2、agentless:不需要代理程序,而是直接使用ssh協(xié)議連接、控制被管控主機(jī),后者只需要開(kāi)啟SSH服務(wù)就可以了,代表軟件有farbic,ansible。這種軟件比較方便,但是不太安全,畢竟要遠(yuǎn)程使用管理員賬戶登錄,所以通常管控主機(jī)要使用有sudo權(quán)限的普通賬戶進(jìn)行操作。

=======================================================

二.ansible的一些基礎(chǔ)****概念

ansible的公司成立于2012年,目前已經(jīng)被紅帽以1.5億美元的價(jià)格收購(gòu)了。雖然ansible作為一款開(kāi)源軟件面世的時(shí)間不長(zhǎng),但是卻十分好用,它既兼具了puppet的一部分功能,也有fabric的部分功能,而且,只要有SS協(xié)議,它就可以工作,非常的輕量化,但是正因?yàn)榛赟SH工作,所以它無(wú)法同時(shí)處理過(guò)多的主機(jī),一般用在千臺(tái)以下的環(huán)境。

ansible有以下一些特性:

1、模塊化,ansible本身非常輕量,通過(guò)調(diào)用特定的模塊來(lái)完成不同的任務(wù)

2、基于Python語(yǔ)言實(shí)現(xiàn),由Paramiko,PyYAML和jinja2三個(gè)關(guān)鍵模塊實(shí)現(xiàn)。

3、部署簡(jiǎn)單、agentless

4、主從模式工作

5、支持自定義模塊

6、支持playbook,批量執(zhí)行一串任務(wù)

<wbr>而且ansible還要有冪等性:即同樣的命令重復(fù)執(zhí)行多次,不會(huì)出現(xiàn)問(wèn)題。

ansible包含以下幾個(gè)模塊:

1、ansible core: ansible自己的核心

2、host inventory: 被管控主機(jī)列表,只要將能通信的主機(jī)列在這個(gè)文件里,ansible就可以管控

3、connection plugins:鏈接插件,用于與每一個(gè)被管控主機(jī)建立會(huì)話并發(fā)送控制指令

4、modules:包含兩類模塊:core modules 核心模塊;custom modules 自定義模塊。

5、playbooks: 設(shè)定一個(gè)流程化腳本,讓多個(gè)ansible任務(wù)按順序執(zhí)行。

ansible可以通過(guò)yum自動(dòng)安裝,但是它在epel源中。

ansible的主配置文件是 /etc/ansible/ansible.cfg

Host inventory : /etc/ansible/hosts <wbr> <wbr> <wbr>用于定義被管控的主機(jī)列表,它的格式是這樣的

這個(gè)文件使用的是INI風(fēng)格的,可以直接寫(xiě)主機(jī)名,IP地址;也可以設(shè)置一個(gè)組,向組中加入多個(gè)主機(jī),并且一個(gè)主機(jī)還可以同時(shí)屬于不同的組;還可以在域名中直接調(diào)用組里的主機(jī)名。不過(guò)通??梢圆挥脤?xiě)的那么復(fù)雜。

=======================================================

三.ansible的常用命令

ansible-doc -l : 列出常用的模塊文檔列表。ansible支持超多的模塊,可以使用這個(gè)命令找到自己想要使用的對(duì)應(yīng)模塊。

ansible-doc -s 模塊名稱: 查看某一個(gè)模塊支持的具體參數(shù) <wbr>

示例:

ansible-doc -s ping:查看ping命令的詳細(xì)幫助

接下來(lái)寫(xiě)一些常用模塊,在這之前先做一些準(zhǔn)備工作

1、我的/etc/ansible/hosts配置是這樣的

2.由于ansible是基于ssh管理被管控主機(jī),所以需要配置ssh基于秘鑰認(rèn)證進(jìn)行連接,否則每次發(fā)送一個(gè)管控命令都會(huì)提示輸入ssh的用戶密碼。

ssh-keygen -t rsa -P '' <wbr>

ssh-copy-id -i .ssh/id_rsa.pub root@172.16.26.1

由于有7被管控個(gè)主機(jī),同樣的命令要敲7次,本來(lái)想弄個(gè)腳本解決,但是由于傳送秘鑰的時(shí)候需要交互輸入對(duì)端用戶密碼,我不會(huì)解決這個(gè)問(wèn)題,所以就沒(méi)做 <wbr>- - # .....

<wbr> <wbr>

command模塊:對(duì)被管控主機(jī)做一些操作命令,并將各主機(jī)上的結(jié)果輸出回ansible主機(jī)上。

示例:ansible all -m command -a ‘ifconfig ’

注:all的含義是:操作對(duì)象為所有hosts文件中的主機(jī)和組,-m的含義是調(diào)用模塊,而command是默認(rèn)模塊,如果不添加-m選項(xiàng)的話默認(rèn)就為command,而且command只支持一些簡(jiǎn)單的命令,不支持管道符,如果想用管道符,要使用shell模塊

user模塊:可以快速在被管控主機(jī)上批量添加用戶

示例:ansible all -m user -a 'name=ly state=present' <wbr>

常用參數(shù):

state=present <wbr> : 創(chuàng)建用戶

home= <wbr> <wbr> :來(lái)指定用戶家目錄路徑;

system=true <wbr> :創(chuàng)建系統(tǒng)用戶

uid= ** <wbr>:** 來(lái)指定用戶uid

shell= <wbr> <wbr> <wbr> :指定用戶的默認(rèn)shell

如果執(zhí)行成功如上圖,其中changed為被控主機(jī)確實(shí)發(fā)生了更改,即,之前沒(méi)有該用戶,現(xiàn)在已經(jīng)創(chuàng)建。如果同樣的命令再執(zhí)行一次會(huì)怎么樣?

雖然當(dāng)前執(zhí)行結(jié)果也成功了,但是兩臺(tái)被控主機(jī)并未發(fā)生任何變化,即,他們之前就已經(jīng)存在了ly用戶

刪除用戶:

ansible all -m user -a 'name=ly state=absent remove=true'

state=absent : 刪除用戶

remove=true : 刪除用戶家目錄!

group模塊

和user類似,用于創(chuàng)建系統(tǒng)組

示例:ansible all -m group -a ‘name=go state=present gid=5001 system=true’

system=true <wbr>: <wbr> 創(chuàng)建一個(gè)系統(tǒng)組

如果要?jiǎng)h除該組,只需要將state=present改成absent就可以了

cron模塊

為被管控主機(jī)在crontab -e列表中添加計(jì)劃任務(wù)

示例:ansible all -m cron -a “minute='/5' job='/usr/sbin/ntpdate 172.16.0.1 &> /dev/null' name='sync time' state='present'"*

為所有被管控主機(jī)添加一條計(jì)劃任務(wù),每5分鐘向172.16.0.1同步一次系統(tǒng)時(shí)間

name= <wbr> <wbr> <wbr> <wbr> :表示工作名稱

job= <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> :表示具體運(yùn)行什么命令

hour=* <wbr> <wbr> <wbr> <wbr> <wbr>: 每小時(shí)

day=* <wbr> <wbr> <wbr>: <wbr> 每天

month=3 <wbr> <wbr>: 3月

weekday=3 <wbr> : 周三

file模塊

為被管控主機(jī)創(chuàng)建新文件

示例:ansible all -m file -a 'path=/tmp/test.txt state=touch owner=user1 mode=600'

在/tmp下創(chuàng)建一個(gè)叫test.txt的普通文件,屬主為user1,權(quán)限為600

mode= <wbr> <wbr> <wbr> : 文件權(quán)限

group= <wbr> <wbr> <wbr>: 文件屬組

state=touch:創(chuàng)建普通文件

state=directory: 創(chuàng)建目錄

state=link <wbr> :創(chuàng)建一個(gè)軟連接,還要使用src=/etc/passwd參數(shù)來(lái)指定源文件。

state=hard <wbr>: 創(chuàng)建一個(gè)硬鏈接,和上面一樣也要使用src參數(shù)

state=absent:刪除文件

yum模塊

為被管控主機(jī)用yum安裝軟件

示例:ansible all -m yum -a 'name=httpd state=present'

為所有管控主機(jī)安裝httpd,各管控主機(jī)默認(rèn)從自己的base源中進(jìn)行安裝

state=latest <wbr> <wbr> : 為某個(gè)包做更新操作

enablerepo= <wbr> <wbr> :?jiǎn)?dòng)某個(gè)倉(cāng)庫(kù)源

disablerepo= <wbr> <wbr> :禁用某個(gè)倉(cāng)庫(kù)源

copy模塊

為被管控主機(jī)執(zhí)行復(fù)制操作

示例:ansible all -m copy -a 'src=/etc/fstab dest=/tmp/fstab owner=ly group=ly mode=600'

讓所有被管控主機(jī)復(fù)制管控主機(jī)的/etc/fstab文件到被管控主機(jī)的/tmp/fstab,屬主屬組為ly,權(quán)限為600

content=123 <wbr> :將‘123’復(fù)制到dest=字段指定的文件中,會(huì)覆蓋目標(biāo)文件的所有內(nèi)容,基本就是遠(yuǎn)程輸出重定向的意思。而且和src=參數(shù)不能一起用。

service

可以管理被管控主機(jī)上的各種服務(wù)程序,從簡(jiǎn)單的開(kāi)啟和關(guān)閉,到 在不同級(jí)別下是否開(kāi)機(jī)自動(dòng)啟動(dòng)等都可以操作

示例:ansbile all -m service -a 'name=httpd state=started ' <wbr>

這個(gè)主機(jī)啟動(dòng)失敗的原因是80端口被占用了,我在上面跑著haproxy

另一個(gè)示例

ansible all -m service -a 'name=httpd runlevel=5 enabled=true'

在級(jí)別5下,自動(dòng)啟動(dòng)httpd服務(wù)

script

這個(gè)模塊非常有用,可以把本地的腳本在各被管控主機(jī)上跑一遍,我可以現(xiàn)在本地主機(jī)的/root目錄下建立一個(gè)腳本123.sh,然后運(yùn)行:

ansible <wbr>all -m script -a '/root/123.sh'

shell : <wbr>

直接在被管控主機(jī)上啟動(dòng)一個(gè)子shell進(jìn)程來(lái)運(yùn)行命令,可以支持絕大多數(shù)的shell命令,包括管道符

ansible all -m shell -a "echo $RANDOM | tr <wbr>'0-9' 'a-z' > /root/123"

其實(shí)上面大多數(shù)操作都可以直接使用shell完成,不過(guò)用shell返回的信息并不太詳細(xì)。

=======================================================

四.ansible的playbook

雖然ansible可以同時(shí)操作很多個(gè)主機(jī),但是如果有些命令可以批量執(zhí)行,而不用一條一條的打的話其實(shí)會(huì)更加理想,而ansible的playbook就提供了這樣的功能,它其實(shí)也是一種類型的腳本,核心元素有這幾個(gè):

1、Tasks <wbr>: 任務(wù)

2、varibales :變量

3、Templates:模板

4、Handlers:觸發(fā)器

5、Roles:規(guī)則

而它的代碼組織格式為YAML,它是一種編程語(yǔ)言,誕生于2001年,類似于xml這種半結(jié)構(gòu)化語(yǔ)句,但是它并不需要那么多標(biāo)簽,所以很適合用于配置。

playbook的基本格式:

  • hosts:172.16.26.1 <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr># <wbr>指定要操作的主機(jī)

<wbr> <wbr> <wbr> <wbr>vars : <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr># <wbr>指定變量

<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> var1:

<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> var2:

<wbr> <wbr> <wbr> <wbr>tasks: <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> # <wbr>指定任務(wù)

<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> - name: <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr># <wbr>指定任務(wù)名字

<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> shell : <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> # 具體的操作命令

<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> - name:

<wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> command <wbr>: <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr>

<wbr> <wbr> <wbr> <wbr>handlers: <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr>

<wbr> <wbr> <wbr> <wbr> <wbr> <wbr>- name :

<wbr> <wbr> <wbr> <wbr>remote_user: <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr># 在被管控主機(jī)上執(zhí)行這些任務(wù)的用戶,也可以使用sudo

  • host:172.16.26.2

  • host:172.16.26.3

舉個(gè)栗子

-name 后是自定義的名字,用來(lái)標(biāo)識(shí)不同的任務(wù)。

定義好playbook后,使用ansible-playbook 123.yml 來(lái)啟動(dòng)

ansible會(huì)先獲取主機(jī)上的FACTS變量。然后開(kāi)始一項(xiàng)一項(xiàng)的執(zhí)行定義好的任務(wù)。OK則說(shuō)明

其中OK則代表有三項(xiàng)任務(wù)執(zhí)行成功,但是沒(méi)發(fā)生任何改變;

changed則也表示成功,但是被管控主機(jī)做出了變化,比如本來(lái)沒(méi)有httpd,通過(guò)劇本安裝了httpd,狀態(tài)就會(huì)發(fā)生改變,則為changed。

failed=1 就是某個(gè)task執(zhí)行失敗了,這里失敗的原因是我的playbook中的命令寫(xiě)錯(cuò)了 - -# 。

上面的playbook中只有一個(gè)hosts字段,我們也可以設(shè)置多個(gè)hosts,分別設(shè)置不同的任務(wù),如果一臺(tái)主機(jī)在多個(gè)hosts字段中都存在,會(huì)按hosts字段的順序執(zhí)行,即最后task中做的設(shè)置會(huì)生效。

剛才的playbook中只是最基本的一些設(shè)置,其實(shí)還有一個(gè)重要的元素是變量,playbook中的變量和其他語(yǔ)言中的變量類似,只能使用字母、數(shù)字和下劃線組成,并僅能以字母開(kāi)頭。

ansible中包含以下幾種變量:

1、facts變量

2、自定義變量

3、主機(jī)變量

4、組變量

5、一些啟動(dòng)參數(shù)

什么是facts變量呢?

facts簡(jiǎn)單來(lái)說(shuō)就是由被管控主機(jī)返回來(lái)的自身的一些屬性信息,比如ip地址,系統(tǒng)版本,硬件信息等,他們被存在ansible的facts變量中,可以使用 ansbile all -m setup 命令來(lái)手動(dòng)查看facts變量

facts是系統(tǒng)變量,不需要聲明就可以直接調(diào)用,如果要使用自定義變量的話,需要提前聲明,聲明有兩種方法,命令行和roles:

可以用playbook命令時(shí),使用參數(shù)的方式來(lái)來(lái)聲明,比如

ansible-playbook 123.yml --extra-vars "host=www user=ly"

這就聲明了兩個(gè)變量:host與user

roles的話,下小節(jié)再說(shuō)吧。

主機(jī)變量:定義在host inventory中(就是/etc/ansible/hosts) 中的主機(jī)之后的變量,

組變量:定義在host inventory中(就是/etc/ansible/hosts) 中的組后面的變量

啟動(dòng)參數(shù):也是定義在定義在host inventory中(就是/etc/ansible/hosts) 中的主機(jī)之后的,但是并不是自定義的變量,更像一些參數(shù)。

其中NUM是我自己定義的變量,后邊三個(gè)則是ansible內(nèi)置的一些參數(shù)

ansible_ssh_user=root <wbr> <wbr> <wbr> <wbr> <wbr> # 用于連接ssh的賬戶

ansible_ssh_pass= <wbr> <wbr> <wbr> <wbr> <wbr> <wbr># <wbr> <wbr>連接ssh時(shí)使用的密碼,如果事先沒(méi)有設(shè)置秘鑰認(rèn)證,這個(gè)選項(xiàng)就很必要!

ansible_ssh_port= <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> # 有些主機(jī)更改了ssh監(jiān)聽(tīng)的端口,這個(gè)選項(xiàng)就很有用。

如何在playbook中定義并使用變量?

只需要加入vars字段,并在下面直接聲明就可以了;調(diào)用的時(shí)候要加雙大括號(hào)

這時(shí)候又有一個(gè)問(wèn)題:如果我在命令行中傳遞了一樣的變量username,和playbook中的變量沖突了,哪個(gè)生效?肯定是命令行中定義的變量生效,命令行定義的值會(huì)覆蓋playbook中寫(xiě)死的變量值。

playbook中除了變量以外,還可以添加條件變量,在某task后面添加when子句即可實(shí)現(xiàn)條件測(cè)試功能;when語(yǔ)句支持jinja2語(yǔ)法;

ansible_os_family : 內(nèi)置變量,保存了唄管控主機(jī)的系統(tǒng)類型。

當(dāng)被管控主機(jī)是Debian時(shí),才執(zhí)行install web package這個(gè)tasks。

skipping表示任務(wù)直接跳過(guò)了,沒(méi)有執(zhí)行,因?yàn)槲业腸6組中的主機(jī)都是CentOS 6。

ansible中還有一種迭代變量,用起來(lái)也十分簡(jiǎn)單:

httpd、php、php-mysql會(huì)按順序輪流替換上方的item變量進(jìn)行安裝。

handlers:類似一個(gè)觸發(fā)器,可以監(jiān)控在某一個(gè)tasks中的name字段上,一旦這個(gè)name在執(zhí)行發(fā)生了改變,即標(biāo)注了change,則就會(huì)觸發(fā)handlers,并執(zhí)行handlers中定義的命令。

notify字段類似一個(gè)監(jiān)控器,可以監(jiān)控某個(gè)任務(wù),一旦該任務(wù)狀態(tài)為change,則觸發(fā)handlers,注意notify后的名字一定要和handlers的名字對(duì)應(yīng)上,然后執(zhí)行handlers里預(yù)先定義的任務(wù),圖中為重啟httpd服務(wù)。

圖中的大體含義是:首先安裝httpd,然后復(fù)制管控主機(jī)上的定制好的配置文件到所有被管控主機(jī)上,如果復(fù)制配置文件這一步為changed,就會(huì)觸發(fā)handlers,即重啟httpd服務(wù)讓復(fù)制過(guò)去的配置文件生效。然后無(wú)論是否觸發(fā)了handler,都要嘗試啟動(dòng)httpd服務(wù)。

這樣設(shè)置的好處就在于,只有修改了配置文件的主機(jī)才會(huì)重啟httpd服務(wù),而不會(huì)影響到其他未發(fā)生變化的主機(jī)。

templates <wbr>

剛才我們有一步復(fù)制了一個(gè)本地已經(jīng)定義好的配置文件到被管控主機(jī)上作為被管控主機(jī)上的,但是如果被管控主機(jī)各自需要的配置不相同怎么辦?比如說(shuō),4臺(tái)被管控主機(jī)都是httpd服務(wù)器,但是需要監(jiān)聽(tīng)的端口不一樣,我們?nèi)绻驯镜氐呐渲梦募?fù)制給它們,那它們的配置文件都一樣,勢(shì)必監(jiān)聽(tīng)的端口也都一樣,這時(shí)要如何處理?這時(shí)候就可以使用templates功能。

templates使用jinja2風(fēng)格的語(yǔ)法,我們可以先在/etc/ansible/hosts上為不同的主機(jī)各自定義不同的變量,比如:

然后修改本地/root/httpd.conf的listen字段,并給他改名為?/root/httpd.conf.j2,把它做成一個(gè)真正的模板文件。

接下來(lái)再修改b.yml,把copy任務(wù)換成template字段,把源改為/root/httpd.conf.j2

接下來(lái)運(yùn)行ansible-playbook b.yml, 每個(gè)主機(jī)會(huì)自動(dòng)用httpd.conf.j2這個(gè)模板文件生成自己的配置文件,并用自己的port變量替換掉模板中的{{ port }}字段。

這里172.16.26.104這臺(tái)主機(jī)失敗了,是由于我之前并沒(méi)有為它配置port變量導(dǎo)致的。另外3個(gè)則配置成功了。讓我們看一下另外三臺(tái)主機(jī)監(jiān)聽(tīng)的端口。

和我們剛才設(shè)定的變量值一模一樣,我們也可以使用更多的變量來(lái)替換模板中的固定內(nèi)容,讓同一批被管控主機(jī)可以分別擁有自己的個(gè)性化配置。

=======================================================

五.roles <wbr>

roles可以把一個(gè)完整playbook中的元素分拆,以層級(jí)結(jié)構(gòu)分別放到磁盤(pán)中特定的位置保存起來(lái),然后可以讓不同的hosts靈活的調(diào)用這些被分拆的元素代碼,重新組合成一個(gè)新的臨時(shí)playbook來(lái)運(yùn)行。

我們可以在/etc/ansible/roles目錄下建立多個(gè)不同的目錄,給它們?nèi)∩喜煌拿?,每個(gè)roles目錄下可以以文件的方式存放不同的元素(tasks,variables,handlers等),然后在playbook中直接調(diào)用roles目錄的名字,就可以自動(dòng)執(zhí)行roles目錄下的所有元素。roles目錄類似于一個(gè)存放在磁盤(pán)上的函數(shù),里面包含了很多元素,需要使用的時(shí)候,直接調(diào)用roles目錄的目錄名就可以運(yùn)行目錄下的所有元素。

比如,我們?cè)?etc/ansible/roles目錄下建立一個(gè)目錄,叫test,然后在test目錄下建立多個(gè)子目錄:files/,

tasks/,handlers,vars,meta。

files/:此roles下用到的所有文件均可放置于此目錄中

templates/: jinja2模板文件存放位置

tasks/:任務(wù)列表文件; 可以有多個(gè)文件,但至少有一個(gè)叫做main.yml的文件。

vars/:變量字典文件,用于自定義多個(gè)變量,上小節(jié)說(shuō)的通過(guò)role傳遞變量就是指這里; <wbr>可以有多個(gè)文件,但至少有一個(gè)叫做main.yml的文件。

handlers/ : 處理器列表文件; <wbr>可以有多個(gè)文件,但至少有一個(gè)叫做main.yml的文件。

meta/ : 此roles的特殊設(shè)定及依賴關(guān)系等

我們可以現(xiàn)在/etc/ansible/roles下創(chuàng)建幾個(gè)目錄:

mkdir testrole/{meta,files,templates,tasks,vars,handlers} <wbr> <wbr> #這些目錄并非都是必須的

如果我們需要定義變量的話,可以在vars目錄下創(chuàng)建一個(gè)main.yml的文件,然后進(jìn)行定義

定義兩個(gè)變量,user=ly <wbr>group=ly

然后在tasks目錄下創(chuàng)建main.yml來(lái)定義任務(wù)列表。

圖例的配置和剛才的b.yml劇本幾乎一樣,但是注意在roles中,handler不能再和tasks放在一起了,要單獨(dú)定義在handlers目錄中;而且template處指定的源是一個(gè)相對(duì)路徑,相對(duì)路徑就是roels/testrole/templates這個(gè)目錄中,所以我們把所有的j2配置模板放在這里就好。

我們?cè)趆andlers目錄中建立一個(gè)文件main.yml

注意這里的name還是要和notify監(jiān)控字段指定的名字要一樣,否則當(dāng)我們有多個(gè)handler的時(shí)候,notify不知道我們要激活哪一個(gè)handler。

然后把之前的/root/httpd.conf.j2復(fù)制到roles/testrole/templates目錄下,然后修改一下這個(gè)j2模板文件,讓他們能利用上我們之前在vars/main.yml中定義的兩個(gè)變量:

現(xiàn)在一個(gè)role就設(shè)置完畢了,我們?nèi)绻胍{(diào)用這個(gè)role,需要在/etc/ansible下創(chuàng)建一個(gè)playbook文件

testrole是我們之前在roles目錄下創(chuàng)建的那個(gè)子目錄名字,調(diào)用這個(gè)目錄名字,就可以調(diào)用這個(gè)目錄下所有我們剛才定義好的元素。

注意:如果確定要調(diào)用roles話,playbook文件盡量放在/etc/ansible目錄下,否則容易出現(xiàn)一些小問(wèn)題。

然后運(yùn)行我們剛剛創(chuàng)建好的腳本文件

運(yùn)行基本沒(méi)有問(wèn)題。

注意,roles下的層級(jí)結(jié)構(gòu)一定要遵循規(guī)范,否則無(wú)法成功調(diào)用

tags:標(biāo)簽

有的role中可能有很多個(gè)task任務(wù),如果我們只想運(yùn)行role中的某一個(gè)task,而不想所有task都運(yùn)行一遍怎么辦?

可以給task加上不同的標(biāo)簽,用來(lái)標(biāo)識(shí)不同的task,然后我們?cè)谶\(yùn)行playbook的時(shí)候,可以用-t 選項(xiàng)指定標(biāo)簽,來(lái)運(yùn)行我們指定的任務(wù),而不是所有role中的任務(wù)全都跑一遍。比如,修改testrole/tasks/main.yml

給修改配置文件的步驟添加一個(gè)標(biāo)簽,然后運(yùn)行

ansible-playbook -t conf abc.yml

此時(shí)只會(huì)運(yùn)行role中的其中一個(gè)task,而不會(huì)所有的task全跑一遍。

=======================================================

六.總結(jié)

1、ansible安裝包在epel源中,如果想通過(guò)yum安裝,需要配置好epel源

2、ansible裝好后需要先配置被管控主機(jī)列表/etc/ansible/hosts;而且最好先把管控主機(jī)的秘鑰傳給所有被管控主機(jī)

3、除了shell模塊以外,大多數(shù)的模塊最基本的格式都是name=XX state=present|absent <wbr>

4、playbook和roles用法很類似,只不過(guò)roles要分散設(shè)置各各不同的元素。而且同一個(gè)playbook可以調(diào)用多個(gè)roles,所以當(dāng)很多tasks等元素需要大量復(fù)用時(shí)可以考慮roles

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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