Ansible

運(yùn)維工具的分類:
agent(有客戶端):puppet(重量級(jí)) func, ...
agentless(無(wú)客戶端ssh):ansible(輕量級(jí)), fabric

1.Ansible簡(jiǎn)介

Ansible是一個(gè)簡(jiǎn)單的自動(dòng)化運(yùn)維工具,可用于自動(dòng)化部署??梢宰詣?dòng)化部署應(yīng)用,配置等。

2.為什么選擇Ansible?

· Ansible完全基于Python開(kāi)發(fā),方便Ansible二次開(kāi)發(fā)

· 豐富的內(nèi)置模塊

· Ansible去中心化,一次簡(jiǎn)單的復(fù)制即可完成配置中心的遷移

· Ansible無(wú)客戶端只有主機(jī)端

· 底層基于OpenSSH

· 沒(méi)有額外的軟件包消耗系統(tǒng)性能

3.Ansible核心主要組件

1.jpg

Ansible:Ansible的核心程序

Host Lnventory:記錄了每一個(gè)由Ansible管理的主機(jī)信息,信息包括ssh端口,root帳號(hào)密碼,ip地址等等。可以通過(guò)file來(lái)加載,可以通過(guò)CMDB加載

Playbooks:YAML格式文件,多個(gè)任務(wù)定義在一個(gè)文件中,使用時(shí)可以統(tǒng)一調(diào)用,“劇本”用來(lái)定義那些主機(jī)需要調(diào)用那些模塊來(lái)完成的功能.

Core Modules:Ansible執(zhí)行任何管理任務(wù)都不是由Ansible自己完成,而是由核心模塊完成;Ansible管理主機(jī)之前,先調(diào)用core Modules中的模塊,然后指明管理Host Lnventory中的主機(jī),就可以完成管理主機(jī)。

Custom Modules:自定義模塊,完成Ansible核心模塊無(wú)法完成的功能,此模塊支持任何語(yǔ)言編寫(xiě)。

Connection Plugins:連接插件,Ansible和Host通信使用

4.Ansible執(zhí)行過(guò)程

2.jpg

5.Ansible目錄結(jié)構(gòu)介紹

? 配置文件目錄: /etc/ansible/

· ansible.cfg:自身配置文件
· hosts:資產(chǎn)清單

? 執(zhí)行文件目錄:/usr/bin/ 
? Lib庫(kù)依賴目錄: /usr/lib/pythonX.X/site-packages/ansible/
? Help文檔目錄:/usr/share/doc/ansible-X.X.X/ 
? Man文檔目錄:/usr/share/man/man1 
? 插件目錄:/usr/share/ansible_plugins

6.工具集

Ansible命令執(zhí)行的方式有Ad-HOC、Ansible-playbook兩種方式
(1)ansible命令
主要運(yùn)用場(chǎng)景:

  • 非固化需求
    比如工作共臨時(shí)查看某個(gè)服務(wù)器是否存活
ansible一般用三種顏色來(lái)表示返回結(jié)果:

   綠色:所有任務(wù)均正常執(zhí)行

   紅色:執(zhí)行過(guò)程中有異常,一般會(huì)不執(zhí)行剩下所有的任務(wù)

   橘黃色:執(zhí)行過(guò)程中沒(méi)有異常,但是結(jié)束后目標(biāo)有狀態(tài)的變化

  • 臨時(shí)一次性操作

  • 二次開(kāi)發(fā)調(diào)用接口

(2)ansible-galaxy
GitHub或PIP功能,通過(guò)ansible-galaxy命令,我們可以根據(jù)下載量和關(guān)注量等信息,查找和安裝優(yōu)秀的Role。下載地址為https://galaxy.ansible.com

ansible-galaxy命令分為三大部分:

1)[init|info|install|list|remove|login|import|delete|setup]等

? init:初始化本地的Roles配置,以備上傳Roles至galaxy

? info:列表指定Role詳細(xì)信息

? install:下載并安裝galaxy指定的Roles到本地

? list:列出本地已下載Roles

? remove:刪除本地已下載的Roles

2)help用法顯示[--help]
eg:
ansible-galaxy init --help

3)參數(shù)項(xiàng)[options]
eg:
ansible-galaxy init [options] role_name

(4)ansible-pull
該指令涉及Ansible另外一種工作模式:pull模式 (ansible默認(rèn)使用push模式)
ansible-pull [options] [playbook.yml]

ansible-pull一般在配置大批量機(jī)器的場(chǎng)景下會(huì)使用,靈活性稍有欠缺,但是效率性會(huì)有所提升
此模式適合以下場(chǎng)景:

①有數(shù)據(jù)巨大的機(jī)器需要配置,即使使用高并發(fā)線程依舊要花費(fèi)很多時(shí)間;

②要在剛啟動(dòng)的,沒(méi)有網(wǎng)絡(luò)聯(lián)機(jī)的主機(jī)上運(yùn)行ansible;

(5)ansible-doc
ansible-doc是模塊文檔說(shuō)明,相當(dāng)于Linux系統(tǒng)man命令類似
ansible-doc [option] [module...]

eg:
ansible-doc -l #列出支持的模塊
ansible-doc ping #ping 模塊功能說(shuō)明

(6)ansible-playbook

工作中使用頻率最高的命令,工作機(jī)制是:通過(guò)讀取預(yù)先編寫(xiě)好的playbook文件實(shí)現(xiàn)批量管理。
要實(shí)現(xiàn)的功能和ansible一樣。

ansible-playbook命令后面跟yaml格式的playbook文件,執(zhí)行實(shí)現(xiàn)編排好的任務(wù)集 eg:
 ansible-playbook playbook.yaml

(7) ansible-vault
ansible-vault主要用于配置文件加密,如編寫(xiě)的playbo配置文件中包含敏感信息,不希望其他人
隨意查看,ansible-vault可加密/解密這個(gè)配置文件

ansible-vault [create|decrypt|edit|encrypt|rekey|view] [--help] [options] file-name

eg:

1)設(shè)定如下密碼,加密a.yml文件

ansible-vault encrypt a.yml

2)解密后正常查看

ansible-vault decrypt a.yaml

(8)ansible-console
ansible-console是Ansible為用戶提供的一款交互式工具

一般主要用到的三個(gè)是:ansible,ansible-playbook,ansible-doc

7.Ansible Iventory(資產(chǎn)清單)配置及詳解

Inventory是Ansible管理主機(jī)信息的配置文件,相當(dāng)于系統(tǒng)的Hosts功能,默認(rèn)放
在/etc/ansible/hosts里。如果有多個(gè)可以用-i指定。

eg:
ansible -i /etc/ansible/inven webs -m ping

如果只有一個(gè)Inventory時(shí)可不用指定路徑,默認(rèn)讀取/etc/ansible/hosts

1) 定義主機(jī)和組

· Inventory配置文件遵循INI風(fēng)格,中括號(hào)中的字符為組名

· 支持將一個(gè)主機(jī)同時(shí)歸并到多個(gè)不同的組中

· 若目標(biāo)主機(jī)使用了非默認(rèn)的SSH端口,還可以使用冒號(hào)加端口來(lái)標(biāo)明,默認(rèn)端口是22

· 可以直接使用IP地址

· 支持hostname
eg:

[webserver]

10.10.10.1

10.10.10.1:2222

ymd

ymd:2222

連續(xù)主機(jī)也可以用數(shù)字或字母表示:


web[1:10] 相當(dāng)于web1,web2...web10

db-[a-c] 相當(dāng)于db-a,db-b.db-c

2) Iventory參數(shù)列表

  • ansible_ssh_host:
將要連接的遠(yuǎn)程主機(jī)名.與你想要設(shè)定的主機(jī)的
別名不同的話,可通過(guò)此變量設(shè)置.
  • ansible_ssh_port:
ssh端口號(hào)如果不是默認(rèn)的端口號(hào),通過(guò)此變量設(shè)置.
  • ansible_ssh_user :
默認(rèn)的 ssh 用戶名 root
  • ansible_ssh_pass:
ssh 密碼(這種方式并不安全,我們強(qiáng)烈建議使用 --ask-pass 或 SSH 密鑰)
  • ansible_sudo_pass:
sudo 密碼(這種方式并不安全,我們強(qiáng)烈建議使用 --ask-sudo-pass)
  • ansible_connection:
與主機(jī)的連接類型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默認(rèn)使用 
paramiko.1.2 以后默認(rèn)使用 'smart','smart' 方式會(huì)根據(jù)是否支持 ControlPersist, 來(lái)判斷'ssh' 方
式是否可行
  • ansible_ssh_private_key_file ssh :
使用的私鑰文件.適用于有多個(gè)密鑰,而你不想使用 SSH 代理的情況.
  • ansible_shell_type :
目標(biāo)系統(tǒng)的shell類型.默認(rèn)情況下,命令的執(zhí)行使
用 'sh'  語(yǔ)法,可設(shè)置為 'csh' 或 'fish'.
  • ansible_python_interpreter :
目標(biāo)主機(jī)的 python 路徑.適用于的情況: 系統(tǒng)中有多個(gè) Python, 或者命令路徑不
是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python 不是 2.X 版本的 Python.我們
不使用 "/usr/bin/env" 機(jī)制,因?yàn)檫@要求遠(yuǎn)程用戶的路徑設(shè)置正確,且要求 "python" 可執(zhí)行程序名
不可為 python以外的名字(實(shí)際有可能名為python26). 與 ansible_python_interpreter 的工
作方式相同,可設(shè)定如 ruby 或 perl 的路徑...

3) Ansible與正則
(1)all(全量)匹配

匹配所有主機(jī),all護(hù)著*(星號(hào))功能相同,但星號(hào)需引起來(lái)

eg:

ansible all -m ping

ansible "*" -m ping

檢查10.10.10.1/24網(wǎng)段所有主機(jī)存活狀況

ansible 192.168.1.* -m ping

(2)邏輯或(or)匹配

如果我們希望對(duì)多個(gè)主機(jī)或者多個(gè)組同時(shí)執(zhí)行,相互之間用“:”(冒號(hào))

eg:
ansible "web1:web2"  -m ping

(3)邏輯非(!)匹配

主要針對(duì)多重條件的匹配原則

eg:
webserver:!staging
//所有在webserver組里面而不再staging組里面

(4)邏輯與(&)匹配

eg:
webserver:&staging
//webserver和staging組里面共同的主機(jī)

(5)模糊匹配

*通配符表示0或者多個(gè)字符
eg:
*.com

(6)域切割

[webservers]

cobweb

webbing

weber
這相當(dāng)于一個(gè)數(shù)組:

webservers=[cobweb,webbing,weber]

可以用數(shù)組下表獲取對(duì)應(yīng)的變量值:
webservers[0] //cobweb
webservers[0:1] //cobweb,webbing

(7)支持正則匹配

8.ansible命令介紹:

Ansible [option] Options:

-a MODULE_ARGS, --args=MODULE_ARGS    模塊的參數(shù),如果執(zhí)行默認(rèn)COMMAND模塊,即是命令參數(shù),如:“date”,"pwd"等等

-k, --ask-pass  登錄密碼,提示輸入SSH密碼而不是假設(shè)基于密鑰的驗(yàn)證

--ask-su-pass  su切換密碼

-K, --ask-sudo-pass  提示密碼使用sudo,sudo表示提權(quán)操作

--ask-vault-pass   vault密碼

-B SECONDS, --background=SECONDS     后臺(tái)運(yùn)行超時(shí)時(shí)間

-C, --check       只是測(cè)試一下會(huì)改變什么內(nèi)容,不會(huì)真正去執(zhí)行

-c CONNECTION, --connection=CONNECTION   連接類型使用??赡艿倪x項(xiàng)是paramiko(SSH),SSH和地方。當(dāng)?shù)刂饕怯糜赾rontab或啟動(dòng)。

-f FORKS, --forks=FORKS   并行任務(wù)數(shù)。NUM被指定為一個(gè)整數(shù),默認(rèn)是5

-h, --help   打開(kāi)幫助文檔API

-i INVENTORY, --inventory-file=INVENTORY    指定庫(kù)存主機(jī) 文件的路徑,默認(rèn)為/etc/ansible/hosts

-l SUBSET, --limit=SUBSET    進(jìn)一步限制所選主機(jī)/組模式  --limit=192.168.91.135 只對(duì)這個(gè)ip執(zhí)行

--list-hosts 列出符合條件的主機(jī)列表

-m MODULE_NAME, --module-name=MODULE_NAME   執(zhí)行模塊的名字,默認(rèn)使用 command 模塊,所以如果是只執(zhí)行單一命令可以不用 -m參數(shù)

-M MODULE_PATH, --module-path=MODULE_PATH    要執(zhí)行的模塊的路徑,默認(rèn)為/usr/share/ansible/

-o, --one-line    標(biāo)準(zhǔn)輸出至一行

-P POLL_INTERVAL, --poll=POLL_INTERVAL 定期返回后臺(tái)進(jìn)度

--private-key=PRIVATE_KEY_FILE    私鑰路徑,使用這個(gè)文件來(lái)驗(yàn)證連接

-S, --su              run operations with su    用 su 命令

-R SU_USER, --su-user=SU_USER      指定SU的用戶,默認(rèn)是root用戶

-s, --sudo         相當(dāng)于Linux系統(tǒng)下的sudo命令

-U SUDO_USER       sudo到哪個(gè)用戶,默認(rèn)為 root  

-T TIMEOUT, --timeout=TIMEOUT    指定SSH默認(rèn)超時(shí)時(shí)間,  默認(rèn)是10S

-t TREE, --tree=TREE   將日志內(nèi)容保存在該輸出目錄,結(jié)果保存在一個(gè)文件中在每臺(tái)主機(jī)上。

-u REMOTE_USER, --user=REMOTE_USER    遠(yuǎn)程用戶, 默認(rèn)是root用戶

--vault-password-file=VAULT_PASSWORD_FILE

-v, --verbose 詳細(xì)信息

--version 輸出ansible的版本

9.Ansible常用模塊

(1)ping:探測(cè)目標(biāo)主機(jī)是否存活;

eg:
# ansible hosts -m ping

(2)command:在遠(yuǎn)程主機(jī)執(zhí)行命令;不支持|管道命令

相關(guān)選項(xiàng):

creates:一個(gè)文件名,當(dāng)該文件存在,則該命令不執(zhí)行

free_form:要執(zhí)行的linux指令

chdir:在執(zhí)行指令之前,先切換到該目錄

removes:一個(gè)文件名,當(dāng)該文件不存在,則該選項(xiàng)不執(zhí)行

executable:切換shell來(lái)執(zhí)行指令,該執(zhí)行路徑必須是一個(gè)絕對(duì)路徑
eg:

- name: test

  command: /usr/bin/make_database.sh arg1 arg2

  args:

    chdir: somedir/

    creates: /path/to/database

(3)shell:在遠(yuǎn)程主機(jī)上調(diào)用shell解釋器運(yùn)行命令,支持shell的各種功能,例如管道等 ;

注意:command和shell模塊的核心參數(shù)直接為命令本身;而其它模塊的參數(shù)通常為“key=value”格式;
eg:

---

- hosts: node1

  gather_facts: flase  #(gather_facts獲取節(jié)點(diǎn)的信息)

  tasks:

    - name: "hello world"

      shell: echo "hello world" `date` by `hostname` > /tmp/hello.log

(4)copy:復(fù)制本地文件到遠(yuǎn)程或者遠(yuǎn)程到遠(yuǎn)程主機(jī),此時(shí)的遠(yuǎn)程主機(jī)為一個(gè),可以改權(quán)限等

用法:

(1) 復(fù)制文件

    -a "src=  dest=  "

(2) 給定內(nèi)容生成文件

        -a "content=  dest=  "
相關(guān)選項(xiàng)如下:

backup:在覆蓋之前,將源文件備份,備份文件包含時(shí)間信息。有兩個(gè)選項(xiàng):yes|no content:用于替代“src”,可以直接設(shè)定指定文件的值

dest:必選項(xiàng)。要將源文件復(fù)制到的遠(yuǎn)程主機(jī)的絕對(duì)路徑,如果源文件是一個(gè)目錄,那么該路徑也必須是個(gè)目錄

directory_mode:遞歸設(shè)定目錄的權(quán)限,默認(rèn)為系統(tǒng)默認(rèn)權(quán)限 force:如果目標(biāo)主機(jī)包含該文件,但內(nèi)容不同,如果設(shè)置為yes,則強(qiáng)制覆蓋,如果為no,則只有當(dāng)目標(biāo)主機(jī)的目標(biāo)位置不存在該文件時(shí),才復(fù)制。默認(rèn)為

yes others:所有的file模塊里的選項(xiàng)都可以在這里使用

src:被復(fù)制到遠(yuǎn)程主機(jī)的本地文件,可以是絕對(duì)路徑,也可以是相對(duì)路徑。如果路徑是一個(gè)目錄,它將遞歸復(fù)制。在這種情況下,如果路徑使用“/”來(lái)結(jié)尾,則只復(fù)制目錄里的內(nèi)容,如果沒(méi)有使用“/”來(lái)結(jié)尾,則包含目錄在內(nèi)的整個(gè)內(nèi)容全部復(fù)制,類似于rsync。

(5)file :設(shè)置文件屬性。

用法:

(1) 創(chuàng)建目錄:

-a "path=。。。  state=directory"

(2) 創(chuàng)建鏈接文件:

-a "path=。。。  src=...  state=link"

(3) 刪除文件:

-a "path=。。。  state=absent"

相關(guān)選項(xiàng)如下:

force:需要在兩種情況下強(qiáng)制創(chuàng)建軟鏈接,一種是源文件不存在,但之后會(huì)建立的情況下;另一種是目標(biāo)軟鏈接已存在,需要先取消之前的軟鏈,然后創(chuàng)建新的軟鏈,有兩個(gè)選項(xiàng):yes|no

group:定義文件/目錄的屬組

mode:定義文件/目錄的權(quán)限

owner:定義文件/目錄的屬主

path:必選項(xiàng),定義文件/目錄的路徑

recurse:遞歸設(shè)置文件的屬性,只對(duì)目錄有效

src:被鏈接的源文件路徑,只應(yīng)用于state=link的情況

dest:被鏈接到的路徑,只應(yīng)用于state=link的情況

state: 

directory:如果目錄不存在,就創(chuàng)建目錄

file:即使文件不存在,也不會(huì)被創(chuàng)建

link:創(chuàng)建軟鏈接 

hard:創(chuàng)建硬鏈接 

touch:如果文件不存在,則會(huì)創(chuàng)建一個(gè)新的文件,如果文件或目錄已存在,則更新其最后修改時(shí)間 

absent:刪除目錄、文件或者取消鏈接文件

(6)fetch:從遠(yuǎn)程某一個(gè)主機(jī)獲取文件到本地

Dest: 用來(lái)存放文件的目錄

Fail_on_missing:當(dāng)源文件不存在的時(shí)候,標(biāo)識(shí)為失敗

Flat:允許覆蓋默認(rèn)行為從hostname/path到/file,如果 dest以/結(jié)尾,它將使用源文件的基礎(chǔ)名稱

Src:在遠(yuǎn)程拉去的文件,并且必須是一個(gè)file,不能是目錄

Validate_checksum:當(dāng)文件fetch之后進(jìn)行md5檢查

注意:在拉取的時(shí)候,必須是文件,不能拉取文件夾

(7)raw:類似于shell,推薦優(yōu)先使用raw

(8)cron: 管理cron計(jì)劃任務(wù)

- a "": 設(shè)置管理節(jié)點(diǎn)生成定時(shí)任務(wù)

action: 

cron backup=  #如果設(shè)置,創(chuàng)建一個(gè)crontab備份

cron_file=  #如果指定, 使用這個(gè)文件cron.d,而不是單個(gè)用戶crontab day= #日應(yīng)該運(yùn)行的工作( 1-31, *, */2, etc ) hour= # 小時(shí) ( 0-23, *, */2, etc )

job= #指明運(yùn)行的命令是什么

minute= #分鐘( 0-59, *, */2, etc )

month= #月( 1-12, *, */2, etc )

name= #定時(shí)任務(wù)描述

reboot #任務(wù)在重啟時(shí)運(yùn)行,不建議使用,建議使用special_time special_time   # 特殊的時(shí)間范圍,參數(shù):reboot(重啟時(shí)),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小時(shí))

state        #指定狀態(tài),prsent表示添加定時(shí)任務(wù),也是默認(rèn)設(shè)置,absent表示刪除定時(shí)任務(wù)

user #以哪個(gè)用戶的身份執(zhí)行 weekday   # 周 ( 0-6 for Sunday-Saturday, *, etc )

(9)yum:yum安裝軟件,也有apt,zypper

conf_file #設(shè)定遠(yuǎn)程yum安裝時(shí)所依賴的配置文件。如配置文件沒(méi)有在默認(rèn)的位置。

disable_gpg_check#是否禁止GPG checking,只用于`present' or `latest'。

disablerepo   #臨時(shí)禁止使用yum庫(kù)。只用于安裝或更新時(shí)。

enablerepo    #臨時(shí)使用的yum庫(kù)。只用于安裝或更新時(shí)。

name=    #所安裝的包的名稱

state  #present安裝, latest安裝最新的, absent 卸載軟件。

update_cache  #強(qiáng)制更新yum的緩存。

(10)service: 服務(wù)程序管理

arguments   #命令行提供額外的參數(shù)

enabled     #設(shè)置開(kāi)機(jī)啟動(dòng)。

name=       #服務(wù)名稱

runlevel    #開(kāi)機(jī)啟動(dòng)的級(jí)別,一般不用指定。

sleep       #在重啟服務(wù)的過(guò)程中,是否等待。如在服務(wù)關(guān)閉以后等待2秒再啟動(dòng)。

state     #started啟動(dòng)服務(wù), stopped停止服務(wù), restarted重啟服務(wù), reloaded重載配置

(11)group: 組管理

[root@node1 ~]# ansible-doc -s group

- name: 添加或刪除組

action: group

gid       # 設(shè)置組的GID號(hào)

name=     # 管理組的名稱

state     # 指定組狀態(tài),默認(rèn)為創(chuàng)建,設(shè)置值為absent為刪除

system    # 設(shè)置值為yes,表示為創(chuàng)建系統(tǒng)組

(11)User:用戶管理

-a ""

action: user

comment    # 用戶的描述信息

createhom  # 是否創(chuàng)建家目錄

force      # 在使用`state=absent'是, 行為與`userdel --force'一致.

group      # 指定基本組

groups     # 指定附加組,如果指定為('groups=')表示刪除所有組

home       # 指定用戶家目錄

login_class     #可以設(shè)置用戶的登錄類 FreeBSD, OpenBSD and NetBSD系統(tǒng).

move_home       # 如果設(shè)置為`home='時(shí), 試圖將用戶主目錄移動(dòng)到指定的目錄

name=           # 指定用戶名

non_unique      # 該選項(xiàng)允許改變非唯一的用戶ID值

password        # 指定用戶密碼

remove          # 在使用 `state=absent'時(shí), 行為是與 `userdel --remove'一致.

shell           # 指定默認(rèn)shell

state           #設(shè)置帳號(hào)狀態(tài),不指定為創(chuàng)建,指定值為absent表示刪除

system          # 當(dāng)創(chuàng)建一個(gè)用戶,設(shè)置這個(gè)用戶是系統(tǒng)用戶。這個(gè)設(shè)置不能更改現(xiàn)有用戶。

uid             #指定用戶的uid

update_password  # 更新用戶密碼

expires         #指明密碼的過(guò)期時(shí)間

10、playbook

3.png

1.基本YAML語(yǔ)法

1)文件必須以yaml或者yml結(jié)尾
2) “- - -”(3個(gè)減號(hào))是文件的開(kāi)始行,表明一個(gè)文件的開(kāi)始;“...”表示一個(gè)文件的結(jié)束 
3)#號(hào)代表注釋 
4)縮進(jìn)代表層級(jí)關(guān)系,縮進(jìn)必須統(tǒng)一,不能空格和Tab混用 
5)縮進(jìn)級(jí)別一致必須左對(duì)齊 
6)大小寫(xiě)敏感 
7)元素用鍵值(k/v)方式寫(xiě),使用“:”冒號(hào)分割,冒號(hào)后空一格,再寫(xiě)值 
8)一個(gè)完整的代碼塊功能最少元素須包括name和task 
9)每個(gè)“:”和“-”后邊都需要跟一個(gè)空格 
10)一個(gè)name只能包含一個(gè)task

2.playbook 組成結(jié)構(gòu)

  • hosts:執(zhí)行這個(gè)劇本的主機(jī)或者主機(jī)組

    tasks:任務(wù) 即調(diào)用模塊完成的某操作

    - name:簡(jiǎn)述任務(wù)的功能
    
      moudule:option
    
      Vars:變量
    
      Templates:模板 根據(jù)客戶端的情況來(lái)生成一些的數(shù)據(jù)
    
      Handlers:處理器 由某條件滿足能觸發(fā)執(zhí)行的操作
    

Roles:角色

(1)playbook中的每一個(gè)play的目的都是為了讓某個(gè)或者某些主機(jī)以某個(gè)指定的用戶身份來(lái)執(zhí)行任務(wù)

如下面所示
- hosts: webnodes
 remote_user: root

hosts: 是用于指定要執(zhí)行的指定任務(wù)的主機(jī),其可以是一個(gè)或者多個(gè)以冒號(hào)分割的主機(jī)組,

remote_users:則用于指定遠(yuǎn)程主機(jī)上的執(zhí)行任務(wù)的用戶

不過(guò) remote_users 也可以用于每個(gè)task中,也可以通過(guò)指定其通過(guò)sudo的方式在遠(yuǎn)程的主機(jī)上執(zhí)行任務(wù),其可以于play全局或者某任務(wù)中,此外,甚至可以在sudo時(shí)使用sudo_user 指定sudo時(shí)切換的用戶

- hosts: webnodes

  remote_user: bds

  tasks:

  - name: test connection

    ping:

    remote_user: bds   

    sudo: yes

(2)任務(wù)列表和action

play的主體部分是task list

task list中的各任務(wù)按次序逐個(gè)在hosts中指定的所有主機(jī)上執(zhí)行,即在所有主機(jī)上完成第一個(gè)任
務(wù)后在開(kāi)始第二個(gè)任務(wù),在運(yùn)行自上而下某個(gè)playbook時(shí),如果中途發(fā)生錯(cuò)誤,所有已經(jīng)執(zhí)行的任務(wù)都會(huì)講回滾,因此,在更正playbook后重新執(zhí)行一次即可

task目的是使用指定的參數(shù)執(zhí)行模塊,而在模塊參數(shù)中可以使用變量,模塊執(zhí)行是具有冪等性的,這意味著多次執(zhí)行是安全的,因?yàn)槠浣Y(jié)構(gòu)均一致

每個(gè)task都應(yīng)該有其name ,用于playbook執(zhí)行結(jié)果輸出,建議其內(nèi)容盡可能清晰地描述任務(wù)執(zhí)行步驟,如果未提供name,則action的結(jié)果將用于輸出

定義task的可以使用“action: module option”或者module: options

推薦使用后者以實(shí)現(xiàn)向后兼容,如果action 一行的內(nèi)容過(guò)多,也可以使用在行首使用幾個(gè)空白字符進(jìn)行換行。

tasks:

- name: make sure apache is running

  service: name=httpd state=running

在眾多模塊中,只用command和shell模塊僅需要給定一個(gè)列表而無(wú)需使用“key=value”格式例如

tasks:

- name: disable selinux

  shell: /sbin/setenforce 0

(3)執(zhí)行playbook
ansible-playbook命令來(lái)執(zhí)行劇本

1)- -limit:我們可以通過(guò)"-hosts:"字段來(lái)指定哪些主機(jī)將會(huì)應(yīng)用Playbook操作,也可以直接用ansible-playbook執(zhí)行

eg:
ansible-playbook palybook.yaml --limit node1

2)--list-hosts:被執(zhí)行的主機(jī)

eg:
ansible-playbook palybook.yaml --limit-hosts


3)用戶權(quán)限設(shè)置 
(1)--remote-user
如果在playbook中,hosts字段下面沒(méi)有定義users關(guān)鍵字,那么Ansible將使用Inventory文件中定義的用戶,如果Inventory也沒(méi)有定義用戶,Ansible將默認(rèn)使用系統(tǒng)用戶身份來(lái)通過(guò)SSH連接遠(yuǎn)程主機(jī)。我們也可以在playbook中使用--remote-user選項(xiàng)指定用戶。
(2)--ask=sudo-pass
為了保證可以傳遞sudo密碼到遠(yuǎn)程主機(jī),可以用此選項(xiàng)來(lái)交互式的輸入密碼
(3)--sudo
使用--sudo選項(xiàng),可以強(qiáng)制所有play都使用sudo用戶,同時(shí)使用--sudo-user選項(xiàng)指定sudo可以執(zhí)行哪個(gè)用戶的權(quán)限,如果不指定,則默認(rèn)以root身份運(yùn)行

eg:
ansible-playbook playbook,yaml --sudo --sudo-user=ymd --ask-sudo-pass

執(zhí)行過(guò)程中,會(huì)要求用戶輸入ymd密碼

4)--syntax-check

檢測(cè)playbook語(yǔ)法

5)--forks=NUM(-f NUM)

指定迸發(fā)時(shí)的任務(wù)數(shù)

6)-verbose(v)
顯示詳細(xì)輸出,-vvv更詳細(xì)輸出

7)--connection=type (-c TYPE)

指定連接遠(yuǎn)程主機(jī)的連接方式,默認(rèn)是SSH,設(shè)為local時(shí),則在本地執(zhí)行playbook,建議不做修改

8)inventory=PATH (-i PATH)

指定inventory文件,默認(rèn)文件是/etc/ansible/hosts

9)--start-at-task="task_name"

運(yùn)行某個(gè)特定的task

10)--check

檢測(cè)執(zhí)行,并不是真正執(zhí)行

3.playbook條件和循環(huán)

條件判斷使用when,循環(huán)使用with_items 1)條件判斷 需要開(kāi)啟gather_facts功能,默認(rèn)開(kāi)啟

eg:

---

- hosts: node1,node2

  gather_facts: yes

  tasks:

   - name: "RedHat"

     shell: echo "RedHat" `date` by `hostname` >> /tmp/hello.log

     when: ansible_os_family == "RedHat"

  - name: "other linux"

    shell: echo "Not RedHat" `date` by `hostname` >> /tmp/hello.log  

    when: ansible_os_family == "RedHat"

2)標(biāo)準(zhǔn)循環(huán)

- hosts: node1,node2

  tasks:

    - name: "with_items"

      shell: echo {{item}} `date` by `hostname` >> /tmp/hello.log

      with_items:

       - item1

       - item2

       - item3

4.playbook中使用變量

1)將變量定義在inventory文件(默認(rèn)為/etc/ansible/hosts)

eg:定義一個(gè)linux_os變量

---

#針對(duì)單個(gè)主機(jī)定義變量

10.10.10.1 linux_os=RedHat

[test]

10.10.10.1

#組定義變量

[test:vars]

linux_os=centos

注意:

①組定義變量的作用范圍是租下的所有主機(jī)

②當(dāng)兩種定義方式同時(shí)存在時(shí),ansible會(huì)優(yōu)先采用單個(gè)主機(jī)定義的變量值
# cat  test.yaml

---

- hosts:

  remote_user: root

  tasks:

    - name: debug

      debug: msg="The {{ iventory_hostname }} Value is {{ keyvalue }}"

2)通過(guò)ansible-playbook命令行轉(zhuǎn)入

ansible-playbook test.yaml -e "linux_os=RedHat"

3)直接在yaml文件中使用vars字段定義

eg:
# cat test.yaml
---
 - hosts: test
   vars:
     linux_os: playbook
   tasks:
    - name: debug
      debug: msg="The {{ iventory_hostname }} Value is {{ keyvalue }}"

4)通過(guò)host_var和group_vars目錄來(lái)定義變量

在/etc/ansible目錄文件下創(chuàng)建host_vars和group_vars兩個(gè)目錄用來(lái)存放定義變量的文件。

①針對(duì)單機(jī)定義的變量

cat host_vars/10.10.10.1

---

linux_os: 10.10.10.1@host_vars

②針對(duì)test組變量

cat group_vars/test

---

linux_os: test@group_vars

ansible變量使用的優(yōu)先級(jí):

ansible-playbook命令直接傳入變量

yaml文件定義vars關(guān)鍵字

host_vars下定義變量

inventory中定義主機(jī)變量

group_vars下定義變量

inventory中組定義變量

5)在yaml文件中使用vars_files字段定義

eg:

# cat test.yaml

---

 - hosts: test

   vars_files:

     - vars.yaml  #定義變量的文件

   tasks:

    - name: debug

      debug: msg="The {{ iventory_hostname }} Value is {{ keyvalue }}"

6)使用register傳遞變量 register用于在task之間傳遞變量

cat register.yaml

---

- hosts: test

  tasks:

     - name: register test

       shell: hostname

       register: info

     - name: display info

       debug: msg="Hostname is {{ info }}"

register定義的info變量在第二個(gè)task中用來(lái)查看第一個(gè)task中執(zhí)行的hostname命令的結(jié)果


[圖片上傳中...(5.jpg-22a77e-1539335940237-0)]

如果只想看到stdout部分信息,可以通過(guò)info['stdout']來(lái)引用

cat register.yaml

---

- hosts: test

  tasks:

     - name: register test

       shell: hostname

       register: info

     - name: display info

       debug: msg="Hostname is {{ info['stdout'] }}"
5.jpg

7)使用vars_prompt交互式傳入變量 在playbook中定義vars_prompt變量名和交互式提示信息,就可以實(shí)現(xiàn)在運(yùn)行playbook時(shí),通過(guò)交互的傳入變量值。


cat prompt.yaml

---

- hosts: test

  vars_prompt:

    - name: "var1"

      prompt: "input value for var1"

      private: no

    - name: "var2"

      prompt: "input value for var2"

      private: yes

      default: 'test vars'

  tasks:

    - name: display var1

      debug: msg="The value of var1 is {{ var1 }}"

    - name: display var2

      debug: msg="The value of var1 is {{ var2 }}"

5.handle觸發(fā)之后才可執(zhí)行


# cat handler.yaml

- hosts: 10.10.10.1

  remote_user: root

  tasks:

  - name: install nginx

    yum: name=nginx state=present

  - name: installl configure file

    notify: restart httpd service

    template: src=nginx.conf.j2 dest=/etc/nginx/conf/nginx.conf

  - name:start nginx service

    service: name=nginx state=started

  handlers:

  - name: restart nginx service

    service: name=nginx state=restarted

某任務(wù)的狀態(tài)在運(yùn)行后為changed時(shí),可通過(guò)“notify”通知給相應(yīng)的handlers;

6.運(yùn)行playbook

1)從制定的任務(wù)開(kāi)始執(zhí)行playbook,使用“--start-at”選項(xiàng):


ansible-playbook playbook.yaml --start-at="install packages"

上面的命令就會(huì)從名字為“install packages”的任務(wù)開(kāi)始執(zhí)行你的playbook

2)分步運(yùn)行playbook --step選項(xiàng)來(lái)交互式的執(zhí)行playbook:

ansible-playbook playbook.yaml --step

(y/n/c):

y:會(huì)執(zhí)行該任務(wù)

n:回答會(huì)跳過(guò)該任務(wù)

c:回答會(huì)繼續(xù)執(zhí)行剩余的所有任務(wù)而不再詢問(wèn)你

拷貝遠(yuǎn)程主機(jī)文件到FTP主機(jī)


# cat lftp.yaml

- hosts: YMD_ZONE

  tasks:

    - name: Tansfer file to 10ftp

      raw: lftp -c "open -u ftpuser,ftpuser ftp://10.10.10.1;mkdir {{ ansible_date_time.date }};cd {{ ansible_date_time.date }};mkdir {{ ansible_hostname }};cd {{ ansible_hostname }};put /root/app/testfile/test.dat"

角色(roles):

    角色集合:
        roles/
            mysql/
            httpd/
            nginx/
            memcached/
            
    每個(gè)角色,以特定的層級(jí)目錄結(jié)構(gòu)進(jìn)行組織:
        mysql/
            files/ :存放由copy或script模塊等調(diào)用的文件;
            templates/:template模塊查找所需要模板文件的目錄;
            tasks/:至少應(yīng)該包含一個(gè)名為main.yml的文件;其它的文件需要在此文件中通過(guò)include進(jìn)行包含;
            handlers/:至少應(yīng)該包含一個(gè)名為main.yml的文件;其它的文件需要在此文件中通過(guò)include進(jìn)行包含;
            vars/:至少應(yīng)該包含一個(gè)名為main.yml的文件;其它的文件需要在此文件中通過(guò)include進(jìn)行包含;
            meta/:至少應(yīng)該包含一個(gè)名為main.yml的文件,定義當(dāng)前角色的特殊設(shè)定及其依賴關(guān)系;其它的文件需要在此文件中通過(guò)include進(jìn)行包含;
            default/:設(shè)定默認(rèn)變量時(shí)使用此目錄中的main.yml文件;
在playbook調(diào)用角色方法1:
        - hosts: websrvs
          remote_user: root
          roles:
          - mysql
          - memcached
          - nginx
在playbook調(diào)用角色方法2:傳遞變量給角色
        - hosts: 
          remote_user:
          roles:
          - { role: nginx, username: nginx }
            鍵role用于指定角色名稱;后續(xù)的k/v用于傳遞變量給角色;
            
        還可以基于條件測(cè)試實(shí)現(xiàn)角色調(diào)用;
        roles:
        - { role: nginx, when: "ansible_distribution_major_version == '7' " }
        
ansible-vcs:
    https://github.com/andrewrothstein/ansible-vcs \
最后編輯于
?著作權(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)容