ansible快速入門

文檔下載

word格式文檔下載(已排好版)
html

參考文檔

朱雙印我的日誌-ansible(本文總結於此)node

很是好的Ansible入門教程(超簡單)python

ansible官網nginx

ansible基礎概念

ansible是什麼?

是一個「配置管理工具」,是一個「自動化運維工具」。它能幫助咱們在許多遠程主機上,完成一些批量任務,或者一些須要常常重複的工做正則表達式

ansible的冪特性

ansible有個特性叫「冪特性」。即ansible是以「結果爲導向的」。咱們指定了一個「目標狀態」,ansible會自動判讀,「當前狀態」是否與「目標狀態」一致。若是一致,則不進行任何操做。若是不一致,就將「當前狀態」變爲「目標狀態」。算法

須要安裝什麼

ansible經過SSH鏈接到受管主機進行操做。只有管理主機須要安裝ansible軟件。shell

ansible的模塊

ansible對主機的各類操做都是經過模塊來完成的,好比「ping」模塊,「file」模塊,「yum」模塊等等。能夠把模塊理解爲咱們在受管主機上執行的命令。既然是命令,這些模塊也有參數供咱們使用。json

playbook(劇本)

       咱們在執行ansible命令時,能夠把須要條針對不一樣主機的命令,編寫成一個playbook。這個playbook咱們能夠理解爲腳本。它是用YAML格式編寫的。經過playbook,咱們能夠針對不一樣主機,或是不一樣組(組裏有不一樣的主機),來指定要作的事。windows

除了這個功能外,還有bash

handlers功能(先判斷「當前狀態」和「目標狀態」是否一致,一致就不執行操做)。tags功能(打標籤,能夠指定只運行打了標籤的操做)

       指定變量

       等等功能。固然,這些功能都須要咱們在playbook中使用相應的關鍵字,進行編寫。

 

ansible的「清單」(Inventory

ansible的命令格式:

ansible  <host-pattern>  [-f forks] [-m module_name]  [-a args]

例如:ansible 10.1.1.60 –m ping

-m:是指定使用的模塊,ping是模塊名

看上面這條命令。使用ansibleping 10.1.1.60這臺主機。至關於咱們手動執行ping命令同樣。

這個命令正常執行須要兩個基本條件:

1ansible所在的主機能夠經過SSH鏈接到受管主機

2)受管主機的IP地址等信息已經添加到ansible的「管理清單」中

「管理清單」的配置就在/etc/andisble/hosts。下面給出示例

#指定主機

192.168.56.110 ansible_port=22 ansible_user=root ansible_ssh_pass=123456

#指定別名

node1 ansible_host=192.168.56.110 ansible_port=22 ansible_user=root ansible_ssh_pass=123456

#若是報錯,將ansible的配置文件/etc/ansible/ansible.cfg中的host_key_checking改成False

固然,若是咱們使用了SSH密鑰,就不在須要給出密碼和用戶了。端口若是是默認的22,也能夠省略。YAML風格的/etc/ansible/hosts

all:

 children:

  pro:

   children:

proA:

 hosts:

  xxx.xxx.xxx.xxx

proB:

 hosts:

  xxx.xxx.xxx.xxx

ansible的經常使用模塊

官方模塊表(2.5

命令模塊

command

描述

command 模塊能夠幫助咱們在遠程主機上執行命令。 
注意:使用 command 模塊在遠程主機中執行命令時,不會通過遠程主機的 shell 處理,在使用 command 模塊時,若是須要執行的命令中含有重定向、管道符等操做時,這些符號也會失效,好比」<」, 「>」, 「|」, 「;」 「&」 這些符號,若是你須要這些功能,能夠參考後面介紹的 shell 模塊。還有一點須要注意,若是遠程節點是 windows 操做系統,則須要使用 win_command 模塊。 
執行 ansible 時,不加 -m 默認使用 command ,能夠在 /etc/ansible/ansible.cfg 中修改。

# default module name for /usr/bin/ansible

#module_name = command

參數

free_form參數 必須參數,指定須要遠程執行的命令。須要說明一點,free_form 參數與其餘參數(若是想要使用一個參數,那麼則須要爲這個參數賦值,也就是name=value模式)並不相同。好比,當咱們想要在遠程主機上執行 ls 命令時,咱們並不須要寫成free_form=ls,這樣寫反而是錯誤的,由於並無任何參數的名字是 free_form,當咱們想要在遠程主機中執行 ls 命令時,直接寫成 ls 便可。由於 command 模塊的做用是執行命令,因此,任何一個能夠在遠程主機上執行的命令均可以被稱爲 free_form

 

chdir參數 : 此參數的做用就是指定一個目錄,在執行對應的命令以前,會先進入到 chdir 參數指定的目錄中。

 

creates參數 看到 creates,你可能會從字面上理解這個參數,可是使用這個參數並不會幫助咱們建立文件,它的做用是當指定的文件存在時,就不執行對應命令,好比,若是 /testdir/test文件存在,就不執行咱們指定的命令。

 

removes參數 creates 參數的做用正好相反,它的做用是當指定的文件不存在時,就不執行對應命令,好比,若是 /testdir/tests 文件不存在,就不執行咱們指定的命令,此參數並不會幫助咱們刪除文件。

 

shell

描述

shell 模塊能夠幫助咱們在遠程主機上執行命令。與 command 模塊不一樣的是,shell 模塊在遠程主機中執行命令時,會通過遠程主機上的 /bin/sh 程序處理。 

參數

free_form參數 必須參數,指定須要遠程執行的命令,可是並無具體的一個參數名叫free_form,具體解釋參考 command 模塊。

 

chdir參數 : 此參數的做用就是指定一個目錄,在執行對應的命令以前,會先進入到 chdir 參數指定的目錄中。

 

creates參數 使用此參數指定一個文件,當指定的文件存在時,就不執行對應命令,可參考command 模塊中的解釋。

 

removes參數 使用此參數指定一個文件,當指定的文件不存在時,就不執行對應命令,可參考 command 模塊中的解釋。

 

executable參數:默認狀況下,shell 模塊會調用遠程主機中的 /bin/sh 去執行對應的命令,一般狀況下,遠程主機中的默認 shell 都是 bash。若是你想要使用其餘類型的 shell 執行命令,則可使用此參數指定某種類型的 shell 去執行對應的命令。指定 shell 文件時,須要使用絕對路徑。

 

script

描述

script 模塊能夠幫助咱們在遠程主機上執行 ansible 管理主機上的腳本,也就是說,腳本一直存在於 ansible 管理主機本地,不須要手動拷貝到遠程主機後再執行。 

參數

free_form參數 必須參數,指定須要執行的腳本,腳本位於 ansible 管理主機本地,並無具體的一個參數名叫 free_form,具體解釋請參考 command 模塊。

 

chdir參數 : 此參數的做用就是指定一個遠程主機中的目錄,在執行對應的腳本以前,會先進入到 chdir 參數指定的目錄中。

 

creates參數 使用此參數指定一個遠程主機中的文件,當指定的文件存在時,就不執行對應腳本,可參考 command 模塊中的解釋。

 

removes參數 使用此參數指定一個遠程主機中的文件,當指定的文件不存在時,就不執行對應腳本,可參考 command 模塊中的解釋。

 

文件模塊

fetch

描述

從遠程節點獲取文件

參數

src:源文件路徑

dest:目標路徑。若是以「/」結尾,則會直接使用srcbasename做文件名

copy

描述

拷貝管理主機上的文件到遠程節點

參數

src

dest

content:當不使用src指定拷貝的文件時,能夠用content指定文件內容。src與從content必有一個。經過contentdest,能夠在目標節點新建文件,並寫入content指定的內容

force遠程主機已有同名文件存在,是否覆蓋。默認yes

backup:遠程主機已有同名文件存在,是否備份

owner:指定文件拷貝到遠程主機後的屬主

group指定文件拷貝到遠程主機後的屬組

mode指定文件拷貝到遠程主機後的權限

file

描述

執行一些對文件的基本操做。如建立/刪除 文件/目錄,修改文件權限等

參數

path:必須參數,指定要操做的文件或目錄

statedirectory(建立目錄)

              touch(建立文件)

              link(軟連接)

              hard(硬連接)

              absent(刪除)

src:指定連接源

force:是否強制建立連接文件,不管源文件是否存在。

owner

group

mode

recurse:遞歸操做。可用於遞歸修改目錄下的文件屬性

find

描述

幫助咱們在遠程主機查找符合條件的文件,就像find命令同樣

參數

paths

recures遞歸查找

hidden默認隱藏文件在查找時會被忽略。能夠yes開啓

file_typeanydirectoryfilelink

patterns指定要查找的文件名,支持shell(如通配符)或正則匹配。默認使用shell匹配。若要用python的正則匹配,徐江user_regex設爲yes

user_regex是否使用正則

contains根據文章內容查找文件。此參數的值爲正則表達式

age根據時間範圍查找文件。默認的時間標準是mtime-3d表示3天之前。3d表示3天內。還可用秒(s),分(m),時(h),星期(w

age_stamp指定時間種類標準,包括atimectimemtime,默認是mtime

size按文件大小查找文件。「-」號表示小於。單位有tgmkb

get_checksum當文件被找到時,同時返回文件的sha1校驗碼

blockinfile

描述

在指定的文件中插入「一段文本」,這段文本是標記過的。在之後的操做中能夠經過「標記」找到這段文本,修改或者刪除它。

參數

path

block指定咱們想要操做的那「一段文本」。此參數有個別名「content

marker:若是咱們插入一段文本,ansible會自動對這段文本進行兩個標記。一個開始標記,一個結束標記。既有默認值,咱們也能夠用mark參數自定義。如marker=#{markder}test。這樣顯示結果爲# BEGIN test# END test

statepresent(默認值是present,執行插入操做或更新操做)

              absent(刪除對用標記的段落)

insertafter參數 在插入一段文本時,默認會在文件的末尾插入文本,若是你想要將文本插入在某一行的後面,可使用此參數指定對應的行,也可使用正則表達式(python正則),表示將文本插入在符合正則表達式的行的後面。若是有多行文本都可以匹配對應的正則表達式,則以最後一個知足正則的行爲準,此參數的值還能夠設置爲EOF,表示將文本插入到文檔末尾。

insertbefore參數 在插入一段文本時,默認會在文件的末尾插入文本,若是你想要將文本插入在某一行的前面,可使用此參數指定對應的行,也可使用正則表達式(python正則),表示將文本插入在符合正則表達式的行的前面。若是有多行文本都可以匹配對應的正則表達式,則以最後一個知足正則的行爲準,此參數的值還能夠設置爲BOF,表示將文本插入到文檔開頭。

backup參數 是否在修改文件以前對文件進行備份。

create參數 當要操做的文件並不存在時,是否建立對應的文件。

 

例子

lineinfile

描述

確保某一行文本存在於指定的文件中,或者確保從文件中刪除指定的文本(即確保指定的文本不存在於文件中),還能夠根據正則表達式,替換某一行文本

參數

path參數 必須參數,指定要操做的文件。

 

line參數 : 使用此參數指定文本內容。

 

regexp參數使用正則表達式匹配對應的行,當替換文本時,若是有多行文本都能被匹配,則只有最後面被匹配到的那行文本纔會被替換,當刪除文本時,若是有多行文本都能被匹配,這麼這些行都會被刪除。

 

state參數當想要刪除對應的文本時,須要將state參數的值設置爲absentabsent爲缺席之意,表示刪除,state的默認值爲present

 

backrefs參數 默認狀況下,當根據正則替換文本時,即便regexp參數中的正則存在分組,在line參數中也不能對正則中的分組進行引用,除非將backrefs參數的值設置爲yesbackrefs=yes表示開啓後向引用,這樣,line參數中就能對regexp參數中的分組進行後向引用了,這樣說不太容易明白,能夠參考後面的示例命令理解。backrefs=yes除了可以開啓後向引用功能,還有另外一個做用,默認狀況下,當使用正則表達式替換對應行時,若是正則沒有匹配到任何的行,那麼line對應的內容會被插入到文本的末尾,不過,若是使用了backrefs=yes,狀況就不同了,當使用正則表達式替換對應行時,同時設置了backrefs=yes,那麼當正則沒有匹配到任何的行時,則不會對文件進行任何操做,至關於保持原文件不變。

insertafter參數:藉助insertafter參數能夠將文本插入到指定的行以後,insertafter參數的值能夠設置爲EOF或者正則表達式,EOFEnd Of File之意,表示插入到文檔的末尾,默認狀況下insertafter的值爲EOF,若是將insertafter的值設置爲正則表達式,表示將文本插入到匹配到正則的行以後,若是正則沒有匹配到任何行,則插入到文件末尾,當使用backrefs參數時,此參數會被忽略。

 

insertbefore參數藉助insertbefore參數能夠將文本插入到指定的行以前,insertbefore參數的值能夠設置爲BOF或者正則表達式,BOFBegin Of File之意,表示插入到文檔的開頭,若是將insertbefore的值設置爲正則表達式,表示將文本插入到匹配到正則的行以前,若是正則沒有匹配到任何行,則插入到文件末尾,當使用backrefs參數時,此參數會被忽略。

 

backup參數:是否在修改文件以前對文件進行備份。

 

create參數 當要操做的文件並不存在時,是否建立對應的文件。

例子

 

 

replace

描述

根據指定的正則替換文件中的字符串。文件中全部正則匹配到的字符串都會被替換

參數

path

regexp正則

replace要替換成的字符串

backup修改前,先備份

 

stat

包模塊

yum_repository

描述

管理遠程主機的yum倉庫

參數

name必選參數。指定要操做的惟一的倉庫ID。就是.repo文件中每一個倉庫裏對應的「中括號」裏的值。如[ceph-noarch]

baseurl倉庫的baseurl

description註釋

file文件名,.repo的前綴
enabled
是否激活對應的yum源,默認爲yes

gpgcheck是否開啓rpm包驗證功能。默認爲no

gpgcakey指定驗證包所須要的公鑰

state默認爲presentabsent表刪除

yum

描述

在遠程主機上經過yum源管理軟件包

參數

name指定要管理的軟件包

state指定軟件包狀態。默認爲present(等效於installed)。還有latestabsent(等效於removed)。latest表安裝yum中的最新版本

disable_gpg_check是否禁用rpm包的公鑰gpg驗證。默認爲no,表示不由用驗證。

enablerepo安裝軟件包時,臨時啓用的yum

diablerepo安裝軟件包時,臨時禁用的yum

系統模塊

ping

驗證主機鏈接性

cron

描述

cron模塊讓咱們能夠遠程設置定時任務。

參數

minute
hour

day

month

weekday

special_timerebootyearlyannually(每年,等於yearly),monthlyweeklydailyhourly

user不指定任務用戶,默認爲管理員

job實際要執行的命令/腳本

name任務的名稱

state設爲absent時,刪除對應name的任務

disabled根據name,使對應任務失效。使用此參數時,任務的job,時間設定都得寫對。否則在註銷任務的同時,會修改原任務

backup修改/刪除前,先備份

user

描述

管理遠程主機的用戶,增刪改 用戶,爲用戶建立密鑰對,等操做

參數

name

group

groups附加組設置,當若是不想覆蓋原來的,則要設置appendyes

append默認爲no

shell

uid

expire用戶過時時間。好比你要設置「2018-3-21」爲過時時間,首先」date –d 2018-3-12 +%s」,得到和epoch時間相差的秒數。然和經過得到秒數設置

comment用戶註釋信息

state默認爲present,表存在。absent,表刪除用戶

remove刪除用戶時,是否移除家目錄。默認爲no

password設置用戶密碼,但設置的密碼得是哈希後的字符串。能夠用pythoncrypt模塊。crypt.crypt'password’)獲得密文

update_passwordalways表若是password設置的值和當前密碼不一樣,則直接更新。on_create表若是不一樣,則不更新。

genarate_ssh_key默認爲no。在對用用戶家目錄下生成SSH密鑰對。id_rsaid_rsa.pub。密鑰對若已存在,則不作操做

ssh_key_file自定路徑和名稱

ssh_key_comment設置公鑰註釋信息

ssh_key_passphrase設置私鑰密碼。已存在同名私鑰,不做操做

ssh_key_type設置密鑰類型。默認爲rsa。已存在同名密鑰,不作操做

group

描述

管理遠程主機的組

參數

name

state默認爲presentabsent表刪除

gid

setup

描述

這個模塊被playbooks自動調用來收集關於遠程主機的有用變量,這些變量能夠在playbooks中使用。

概要

咱們在運行playbook時,會發現老是會默認運行一個「【Gathering Factes】」的任務。這個任務會收集遠程主機的相關信息(例如遠程主機個人IP,主機名,系統版本,配置信息等),這些信息會被保存到對應的變量中。而這個任務,就是經過setup模塊實現的。

setup返回的信息是json格式的字符串。

除了基本信息外。ansible默認會去/etc/ansible/facts.d目錄下查找目標主機的自定義信息。自定義信息須要寫在以「.fact」爲後綴的文件中。同時這些文件的內容須要是INI格式或json格式。如:

#testinfo.fact

#INI風格

[testmsg]

msg1=This is the first custom test message

msg2=This is the second custom test message

 

#JSON格式

{

   "testmsg":{

       "msg1":"This is the first custom test message",

       "msg2":"This is the second custom test message"

   }

}

參數

filter設置shell風格的通配符。以匹配要查找的內容

ansible test70 -m setup -a 'filter=ansible_memory_mb' # 這裏匹配的ansible_memory_mb至關因而一個變量名。

ansible test70 -m setup -a "filter=*mb*"

fact_Path指定.fact文件的路徑

debug的混合使用

除了用filter參數過濾本身想要的信息。還能夠在playbook中使用debug來過濾。

先看一下debug模塊:

#經過msg參數,打印出自定義的信息

 - name: debug demo

   debug:

     msg: this is debug info,The test file has been touched

#打印變量testvar的鍵值對

vars:

   testvar: value of test variable

 tasks:

 - name: debug demo

   debug:

     var: testvar

#打印testvar的值

 - name: debug demo

   debug:

     msg: "value of testvar is : {{testvar}}"

#debug過率出遠程主機的內存信息

---

- hosts: test70

 remote_user: root

 tasks:

 - name: debug demo

   debug:

     msg: "Remote host memory information: {{ansible_memory_mb}}"

注意:這個變量名存儲的就是遠程主機的內存信息。

#過濾內存信息裏的子項

語法一示例:

debug:

     msg: "Remote host memory information : {{ansible_memory_mb.real}}"

語法二示例:

debug:

     msg: "Remote host memory information : {{ansible_memory_mb['real']}}"

service

描述

幫助咱們管理遠程主機上的服務。啓動,中止,重啓,重載配置文件。但前提是這個服務必須被BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart中的任意一種管理支持。

參數

name

statestartedstoppedrestartedreloaded

enable是否開機自啓

ansibleplaybook

劇本入門

基礎命令

劇本須要用YAML格式編寫。文件後綴咱們使用.yml。關於劇本的命令以下

#運行劇本

ansible-playbook file.yml

 

#語法檢查

ansible-playbook --syntax-check /dir/file.yml

 

#模擬執行

ansible-playbook –check file.yml

注意:模擬的結果只能參考。由於模擬執行不是真正執行。這就意味着有些任務的結果沒有正確返回,模擬就有可能報錯。但這不表明會真正報錯

劇本示例

先測試聯通性,而後建立node目錄。目標主機使用的是別名proAproB


---

- hosts:proA,proB

  remote_user: root

  tasks:

  - name: Ping the host

    ping:

  - name: make the directory test

    file:

      path: /root/node1

      state: directory

上面的hosts也能夠寫爲(即同行可變分行)

- hosts:

proA

proB

file也能夠寫爲(即:號可換等號。固然也可寫成分行)

file: path=/root/node1,state=directory

 

handlers

handlers能夠被理解爲一種taskhandlers中的任務會被task中的「任務」調用。而只有task中的任務進行了實際操做(形成了實際的改變)。對應調用的hardlers任務纔會被執行。

 

handlers

#修改Nginx監聽的默認端口,並重啓服務

---

- hosts: proA

  remote_user: root

  tasks:

  - name: Modify the configuration

linefile:

  path=/etc/nginx/conf.d/test.file.net.conf

  regexp=」listen(.*) 8080(.*)」

  line=」listen\1 80\2」

  backrefs=yes

  backup=yes

notify:

  restart nginx

 

  handlers:

  - name: restart nginx

service:

  name=nginx

  state=restarted

handlers

#多個任務就對應多個notify

---

- hosts: test70

  remote_user: root

  tasks:

  - name: make testfile1

    file: path=/testdir/testfile1

          state=directory

    notify: ht2

  - name: make testfile2

    file: path=/testdir/testfile2

          state=directory

    notify: ht1

 

  handlers:

  - name: ht1

    file: path=/testdir/ht1

          state=touch

  - name: ht2

    file: path=/testdir/ht2

          state=touch

注意:handlers的執行順序,由handlers任務表中定義的任務順序決定。tasks notify的順序不影響handlers任務執行順序

 

 

一次notify多個handlers

---

- hosts: test70

  remote_user: root

  tasks:

  - name: task1

    file: path=/testdir/testfile

          state=touch

    notify: handler group1

 

  handlers:

  - name: handler1

    listen: handler group1

    file: path=/testdir/ht1

          state=touch

  - name: handler2

    listen: handler group1

    file: path=/testdir/ht2

          state=touch

咱們能夠把listen的值理解爲組名。notify調用的組名。這樣一次就調用了handler1handler2

tags

在一個很長的playbook中,只想執行其中的一部分任務或一類任務,就須要tagstags幫助咱們給任務打標籤。經過在運行.yml文件時,經過對標籤的過濾在執行相應任務。

基礎寫法

---

- hosts: test70

 remote_user: root

 tasks:

 - name: task1

   file:

     path: /testdir/t1

     state: touch

   tags: t1

 - name: task2

   file: path=/testdir/t2

         state=touch

   tags: t2

 - name: task3

   file: path=/testdir/t3

         state=touch

   tags: t3

標籤命令一(指定標籤)

#只運行tag2的任務

ansible-playbook --tags=t2 file.yml

#只不運行tag2的任務

ansible-playbook --skip-tags=’t2’ file.yml

tages的多種寫法

tages還能這樣定義:

  tags:

     - t1

  tags: ['t2']

每一個tags還能有多個標籤:

語法一:

tags:

 - testtag

 - t1

 

語法二:

tags: tag1,t1

 

語法三:

tags: ['tagtest','t2']

不一樣任務相同標籤

不一樣的任務可使用相同的標籤:

寫法一:

---

- hosts: test70

 remote_user: root

 tasks:

 - name: install httpd package

   tags: httpd,package

   yum:

     name=httpd

     state=latest

 

 

 - name: start up httpd service

   tags: httpd,service

   service:

     name: httpd

     state: started

 

寫法二:

#tags寫在play而非task中時,play中全部task都會繼承當前play中的tags。而同時又擁有本身的tags

---

- hosts: test70

 remote_user: root

 tags: httpd

 tasks:

 - name: install httpd package

   tags: ['package']

   yum:

     name=httpd

     state=latest

 

 - name: start up httpd service

   tags:

     - service

   service:

     name: httpd

     state: started

標籤命令二(多標籤,預覽)

調用標籤時,能夠指定多個標籤:

ansible-playbook --tags package,service file.yml

預覽playbook中的標籤:

ansible-playbook --list-tags file.yml

特殊tag

ansible還有5個特殊的tag

always:假設某任務標籤爲[「t3」,」always」]。則除非明確「--skip-tags」爲t3always。則即便--tags指定沒有t3,該任務也會被調用

never2.5版本):只有明確指定--tagsnever,纔會調用該任務

tagged:只運行打了標籤的任務

untagged只運行沒打標籤的任務

all:運行全部任務。默認狀況下,playbook就如--tags all同樣運行

變量

變量名應該由字母、數字、下劃線組成。變量名須要以字母開頭,ansible內置的關鍵字不能做爲變量名。

咱們既可在playbook內經過vars關鍵字指定變量,也可分離變量文件和playbook

vars指定變量

---

- hosts: test70

  vars:

    testvar1: testfile

  remote_user: root

  tasks:

  - name: task1

    file:

      path: /testdir/{{ testvar1 }}

      state: touch

其他寫法:

寫法一:

vars:

  testvar1: testfile

  testvar2: testfile2

 

寫法二:YMAL的塊序列語法

vars:

  - testvar1: testfile

  - testvar2: testfile2

 

寫法三:相似屬性的方式定義

---

- hosts: test70

  remote_user: root

  vars:

    nginx:

      conf80: /etc/nginx/conf.d/80.conf

      conf8080: /etc/nginx/conf.d/8080.conf

  tasks:

  - name: task1

    file:

      path: "{{nginx.conf80}}"

      state: touch

  - name: task2

    file:

      path: "{{nginx['conf8080']}}"

      state: touch

注意:

若是變量名如{{nginx.conf80}}在使用時,前面無任何路徑,則需加雙引號「」,反之,則能夠不加。固然若是用path=這種寫法,也能夠不加

變量文件分離

首先定義變量文件nginx_vars.yml。三種示例任選一種

語法一示例:

  testvar1: testfile

  testvar2: testfile2

語法二示例:

  - testvar1: testfile

  - testvar2: testfile2

語法三示例:

nginx:

  conf80: /etc/nginx/conf.d/80.conf

  conf8080: /etc/nginx/conf.d/8080.conf

play_book中使用vars_file關鍵字導入文件。固然,使用vars_file的同時,也能同時使用vars

---

- hosts: test70

  remote_user: root

  vars_files:

  - /testdir/ansible/nginx_vars.yml

  tasks:

  - name: task1

    file:

      path={{nginx.conf80}}

      state=touch

  - name: task2

    file:

      path={{nginx['conf8080']}}

      state=touch

註冊變量

ansible的模塊在運行後,其實都會返回一些「返回值」。只是默認狀況下,這些「返回值」並不會顯示。咱們能夠將這些返回值寫入到某個變量,這樣就可以經過引用對應變量而獲取到這些返回值。將模塊的返回值寫入到變量中就被稱爲「註冊變量」。例如:

---

- hosts: test70

 remote_user: root

 tasks:

 - name: test shell

   shell: "echo test > /var/testshellfile"

   register: testvar

 - name: shell module return values

   debug:

     var: testvar

解析:利用register,將shell任務的返回值寫入了testvar變量。而後用debug模塊,顯示變量鍵值對

提示用戶輸入信息並寫入變量

某些腳本須要用戶輸入信息以進行交互。這時,咱們就須要var_prompt關鍵字

---

- hosts: test70

 remote_user: root

 vars_prompt:

   - name: "your_name"

     prompt: "What is your name"

   private

   - name: "your_age"

     prompt: "How old are you"

 tasks:

  - name: output vars

    debug:

     msg: Your name is {{your_name}},You are {{your_age}} years old

 

var_prompt變量中可以使用private關鍵字。默認爲yes,表示輸入不可見。

還能設置提示信息爲默認值。就像casedefault選項同樣:

---

- hosts: test70

 remote_user: root

 vars_prompt:

   - name: "solution"

     prompt: "Choose the solution you want \n」

     A: solutionA\n

     B: solutionB\n

     C: solutionC\n"

     private: no

     default: A

 tasks:

  - name: output vars

    debug:

     msg: The final solution is {{solution}}.

建立用戶的腳本:

---

- hosts: test70

 remote_user: root

 vars_prompt:

   - name: "user_name" #輸入用戶名

     prompt: "Enter user name"

     private: no

   - name: "user_password" #輸入密碼

     prompt: "Enter user password"

     encrypt: "sha512_crypt" #encrypt關鍵字可加密密碼。value值是算法。使用這個關鍵字須要passlib

     confirm: yes #確認密碼。即須要輸入兩次密碼

 tasks:

  - name: create user

    user:

     name: "{{user_name}}"

     password: "{{user_password}}"

命令行傳入變量

咱們在playbook中使用的變量。能夠由命令行傳入。若是存在同名變量。命令行傳入的變量優先級更高。傳入變量使用-e--extra-vars選項。能夠一次傳入多個變量。也可傳入變量文件

---

- hosts: test70

 remote_user: root

 tasks:

 - name: "Passing Variables On The Command Line"

   debug:

     msg: "{{pass_var}}"

 

ansible-playbook cmdvar.yml -e 'pass_var="test" pass_var1="test1"'

ansible-playbook cmdvar.yml -e "@/testdir/ansible/testvar"

ansible命令也能夠傳入變量:

ansible test70 -e "testvar=test" -m shell -a "echo {{testvar}}"

傳入的變量除了鍵值對形式,也支持json的格式:

ansible-playbook cmdvar.yml -e '{"testvar":"test","testvar1":"test1"}'

ansible-playbook cmdvar.yml -e '{"countlist":["one","two","three","four"]}'

相關文章
相關標籤/搜索