ansible快速入門

文檔下載

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

參考文檔

朱雙印個人日誌-ansible(本文總結於此)

非常好的Ansible入門教程(超簡單)

ansible官網

ansible基礎概念

ansible是什麼?

是一個“配置管理工具”,是一個“自動化運維工具”。它能幫助我們在許多遠程主機上,完成一些批量任務,或者一些需要經常重複的工作

ansible的冪特性

ansible有個特性叫“冪特性”。即ansible是以“結果爲導向的”。我們指定了一個“目標狀態”,ansible會自動判讀,“當前狀態”是否與“目標狀態”一致。如果一致,則不進行任何操作。如果不一致,就將“當前狀態”變爲“目標狀態”。

需要安裝什麼

ansible通過SSH連接到受管主機進行操作。只有管理主機需要安裝ansible軟件。

ansible的模塊

ansible對主機的各種操作都是通過模塊來完成的,比如“ping”模塊,“file”模塊,“yum”模塊等等。可以把模塊理解爲我們在受管主機上執行的命令。既然是命令,這些模塊也有參數供我們使用。

playbook(劇本)

       我們在執行ansible命令時,可以把需要條針對不同主機的命令,編寫成一個playbook。這個playbook我們可以理解爲腳本。它是用YAML格式編寫的。通過playbook,我們可以針對不同主機,或是不同組(組裏有不同的主機),來指定要做的事。

除了這個功能外,還有

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"]}'


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章