word格式文檔下載(已排好版)
html
朱雙印我的日誌-ansible(本文總結於此)node
很是好的Ansible入門教程(超簡單)python
ansible官網nginx
是一個「配置管理工具」,是一個「自動化運維工具」。它能幫助咱們在許多遠程主機上,完成一些批量任務,或者一些須要常常重複的工做正則表達式
ansible有個特性叫「冪特性」。即ansible是以「結果爲導向的」。咱們指定了一個「目標狀態」,ansible會自動判讀,「當前狀態」是否與「目標狀態」一致。若是一致,則不進行任何操做。若是不一致,就將「當前狀態」變爲「目標狀態」。算法
ansible經過SSH鏈接到受管主機進行操做。只有管理主機須要安裝ansible軟件。shell
ansible對主機的各類操做都是經過模塊來完成的,好比「ping」模塊,「file」模塊,「yum」模塊等等。能夠把模塊理解爲咱們在受管主機上執行的命令。既然是命令,這些模塊也有參數供咱們使用。json
咱們在執行ansible命令時,能夠把須要條針對不一樣主機的命令,編寫成一個playbook。這個playbook咱們能夠理解爲腳本。它是用YAML格式編寫的。經過playbook,咱們能夠針對不一樣主機,或是不一樣組(組裏有不一樣的主機),來指定要作的事。windows
除了這個功能外,還有bash
handlers功能(先判斷「當前狀態」和「目標狀態」是否一致,一致就不執行操做)。tags功能(打標籤,能夠指定只運行打了標籤的操做)
指定變量
等等功能。固然,這些功能都須要咱們在playbook中使用相應的關鍵字,進行編寫。
ansible的命令格式:
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
例如:ansible 10.1.1.60 –m ping
-m:是指定使用的模塊,ping是模塊名
看上面這條命令。使用ansible去ping 10.1.1.60這臺主機。至關於咱們手動執行ping命令同樣。
這個命令正常執行須要兩個基本條件:
1)ansible所在的主機能夠經過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
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 模塊能夠幫助咱們在遠程主機上執行命令。與 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 模塊能夠幫助咱們在遠程主機上執行 ansible 管理主機上的腳本,也就是說,腳本一直存在於 ansible 管理主機本地,不須要手動拷貝到遠程主機後再執行。
free_form參數 :必須參數,指定須要執行的腳本,腳本位於 ansible 管理主機本地,並無具體的一個參數名叫 free_form
,具體解釋請參考 command 模塊。
chdir參數 : 此參數的做用就是指定一個遠程主機中的目錄,在執行對應的腳本以前,會先進入到 chdir 參數指定的目錄中。
creates參數 :使用此參數指定一個遠程主機中的文件,當指定的文件存在時,就不執行對應腳本,可參考 command 模塊中的解釋。
removes參數 :使用此參數指定一個遠程主機中的文件,當指定的文件不存在時,就不執行對應腳本,可參考 command 模塊中的解釋。
從遠程節點獲取文件
src:源文件路徑
dest:目標路徑。若是以「/」結尾,則會直接使用src的basename做文件名
拷貝管理主機上的文件到遠程節點
src:
dest:
content:當不使用src指定拷貝的文件時,能夠用content指定文件內容。src與從content必有一個。經過content和dest,能夠在目標節點新建文件,並寫入content指定的內容
force:遠程主機已有同名文件存在,是否覆蓋。默認yes
backup:遠程主機已有同名文件存在,是否備份
owner:指定文件拷貝到遠程主機後的屬主
group:指定文件拷貝到遠程主機後的屬組
mode:指定文件拷貝到遠程主機後的權限
執行一些對文件的基本操做。如建立/刪除 文件/目錄,修改文件權限等
path:必須參數,指定要操做的文件或目錄
state:directory(建立目錄)
touch(建立文件)
link(軟連接)
hard(硬連接)
absent(刪除)
src:指定連接源
force:是否強制建立連接文件,不管源文件是否存在。
owner:
group:
mode:
recurse:遞歸操做。可用於遞歸修改目錄下的文件屬性
幫助咱們在遠程主機查找符合條件的文件,就像find命令同樣
paths:
recures:遞歸查找
hidden:默認隱藏文件在查找時會被忽略。能夠yes開啓
file_type:any,directory,file,link
patterns:指定要查找的文件名,支持shell(如通配符)或正則匹配。默認使用shell匹配。若要用python的正則匹配,徐江user_regex設爲yes
user_regex:是否使用正則
contains:根據文章內容查找文件。此參數的值爲正則表達式
age:根據時間範圍查找文件。默認的時間標準是mtime。-3d表示3天之前。3d表示3天內。還可用秒(s),分(m),時(h),星期(w)
age_stamp:指定時間種類標準,包括atime,ctime,mtime,默認是mtime
size:按文件大小查找文件。「-」號表示小於。單位有t,g,m,k,b
get_checksum:當文件被找到時,同時返回文件的sha1校驗碼
在指定的文件中插入「一段文本」,這段文本是標記過的。在之後的操做中能夠經過「標記」找到這段文本,修改或者刪除它。
path:
block:指定咱們想要操做的那「一段文本」。此參數有個別名「content」
marker:若是咱們插入一段文本,ansible會自動對這段文本進行兩個標記。一個開始標記,一個結束標記。既有默認值,咱們也能夠用mark參數自定義。如marker=#{markder}test。這樣顯示結果爲# BEGIN test和# END test
state:present(默認值是present,執行插入操做或更新操做)
absent(刪除對用標記的段落)
insertafter參數 :在插入一段文本時,默認會在文件的末尾插入文本,若是你想要將文本插入在某一行的後面,可使用此參數指定對應的行,也可使用正則表達式(python正則),表示將文本插入在符合正則表達式的行的後面。若是有多行文本都可以匹配對應的正則表達式,則以最後一個知足正則的行爲準,此參數的值還能夠設置爲EOF,表示將文本插入到文檔末尾。
insertbefore參數 :在插入一段文本時,默認會在文件的末尾插入文本,若是你想要將文本插入在某一行的前面,可使用此參數指定對應的行,也可使用正則表達式(python正則),表示將文本插入在符合正則表達式的行的前面。若是有多行文本都可以匹配對應的正則表達式,則以最後一個知足正則的行爲準,此參數的值還能夠設置爲BOF,表示將文本插入到文檔開頭。
backup參數 :是否在修改文件以前對文件進行備份。
create參數 :當要操做的文件並不存在時,是否建立對應的文件。
確保」某一行文本」存在於指定的文件中,或者確保從文件中刪除指定的」文本」(即確保指定的文本不存在於文件中),還能夠根據正則表達式,替換」某一行文本」。
path參數 :必須參數,指定要操做的文件。
line參數 : 使用此參數指定文本內容。
regexp參數:使用正則表達式匹配對應的行,當替換文本時,若是有多行文本都能被匹配,則只有最後面被匹配到的那行文本纔會被替換,當刪除文本時,若是有多行文本都能被匹配,這麼這些行都會被刪除。
state參數:當想要刪除對應的文本時,須要將state參數的值設置爲absent,absent爲缺席之意,表示刪除,state的默認值爲present。
backrefs參數: 默認狀況下,當根據正則替換文本時,即便regexp參數中的正則存在分組,在line參數中也不能對正則中的分組進行引用,除非將backrefs參數的值設置爲yes。backrefs=yes表示開啓後向引用,這樣,line參數中就能對regexp參數中的分組進行後向引用了,這樣說不太容易明白,能夠參考後面的示例命令理解。backrefs=yes除了可以開啓後向引用功能,還有另外一個做用,默認狀況下,當使用正則表達式替換對應行時,若是正則沒有匹配到任何的行,那麼line對應的內容會被插入到文本的末尾,不過,若是使用了backrefs=yes,狀況就不同了,當使用正則表達式替換對應行時,同時設置了backrefs=yes,那麼當正則沒有匹配到任何的行時,則不會對文件進行任何操做,至關於保持原文件不變。
insertafter參數:藉助insertafter參數能夠將文本插入到「指定的行」以後,insertafter參數的值能夠設置爲EOF或者正則表達式,EOF爲End Of File之意,表示插入到文檔的末尾,默認狀況下insertafter的值爲EOF,若是將insertafter的值設置爲正則表達式,表示將文本插入到匹配到正則的行以後,若是正則沒有匹配到任何行,則插入到文件末尾,當使用backrefs參數時,此參數會被忽略。
insertbefore參數:藉助insertbefore參數能夠將文本插入到「指定的行」以前,insertbefore參數的值能夠設置爲BOF或者正則表達式,BOF爲Begin Of File之意,表示插入到文檔的開頭,若是將insertbefore的值設置爲正則表達式,表示將文本插入到匹配到正則的行以前,若是正則沒有匹配到任何行,則插入到文件末尾,當使用backrefs參數時,此參數會被忽略。
backup參數:是否在修改文件以前對文件進行備份。
create參數 :當要操做的文件並不存在時,是否建立對應的文件。
根據指定的正則替換文件中的字符串。文件中全部正則匹配到的字符串都會被替換
path:
regexp:正則
replace:要替換成的字符串
backup:修改前,先備份
管理遠程主機的yum倉庫
name:必選參數。指定要操做的惟一的倉庫ID。就是.repo文件中每一個倉庫裏對應的「中括號」裏的值。如[ceph-noarch]
baseurl:倉庫的baseurl
description:註釋
file:文件名,.repo的前綴
enabled:是否激活對應的yum源,默認爲yes
gpgcheck:是否開啓rpm包驗證功能。默認爲no
gpgcakey:指定驗證包所須要的公鑰
state:默認爲present。absent表刪除
在遠程主機上經過yum源管理軟件包
name:指定要管理的軟件包
state:指定軟件包狀態。默認爲present(等效於installed)。還有latest、absent(等效於removed)。latest表安裝yum中的最新版本
disable_gpg_check:是否禁用rpm包的公鑰gpg驗證。默認爲no,表示不由用驗證。
enablerepo:安裝軟件包時,臨時啓用的yum源
diablerepo:安裝軟件包時,臨時禁用的yum源
驗證主機鏈接性
cron模塊讓咱們能夠遠程設置定時任務。
minute:
hour:
day:
month:
weekday:
special_time:reboot,yearly,annually(每年,等於yearly),monthly,weekly,daily,hourly
user:不指定任務用戶,默認爲管理員
job:實際要執行的命令/腳本
name:任務的名稱
state:設爲absent時,刪除對應name的任務
disabled:根據name,使對應任務失效。使用此參數時,任務的job,時間設定都得寫對。否則在註銷任務的同時,會修改原任務
backup:修改/刪除前,先備份
管理遠程主機的用戶,增刪改 用戶,爲用戶建立密鑰對,等操做
name:
group:
groups:附加組設置,當若是不想覆蓋原來的,則要設置append爲yes
append:默認爲no
shell:
uid:
expire:用戶過時時間。好比你要設置「2018-3-21」爲過時時間,首先」date –d 2018-3-12 +%s」,得到和epoch時間相差的秒數。然和經過得到秒數設置
comment:用戶註釋信息
state:默認爲present,表存在。absent,表刪除用戶
remove:刪除用戶時,是否移除家目錄。默認爲no
password:設置用戶密碼,但設置的密碼得是哈希後的字符串。能夠用python的crypt模塊。crypt.crypt('password’)獲得密文
update_password:always表若是password設置的值和當前密碼不一樣,則直接更新。on_create表若是不一樣,則不更新。
genarate_ssh_key:默認爲no。在對用用戶家目錄下生成SSH密鑰對。id_rsa和id_rsa.pub。密鑰對若已存在,則不作操做
ssh_key_file:自定路徑和名稱
ssh_key_comment:設置公鑰註釋信息
ssh_key_passphrase:設置私鑰密碼。已存在同名私鑰,不做操做
ssh_key_type:設置密鑰類型。默認爲rsa。已存在同名密鑰,不作操做
管理遠程主機的組
name:
state:默認爲present,absent表刪除
gid:
這個模塊被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文件的路徑
除了用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']}}"
幫助咱們管理遠程主機上的服務。啓動,中止,重啓,重載配置文件。但前提是這個服務必須被BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart中的任意一種管理支持。
name:
state:started,stopped,restarted,reloaded
enable:是否開機自啓
劇本須要用YAML格式編寫。文件後綴咱們使用.yml。關於劇本的命令以下
#運行劇本
ansible-playbook file.yml
#語法檢查
ansible-playbook --syntax-check /dir/file.yml
#模擬執行
ansible-playbook –check file.yml
注意:模擬的結果只能參考。由於模擬執行不是真正執行。這就意味着有些任務的結果沒有正確返回,模擬就有可能報錯。但這不表明會真正報錯
先測試聯通性,而後建立node目錄。目標主機使用的是別名proA和proB
---
remote_user: root
tasks:
- name: Ping the host
ping:
- name: make the directory test
file:
state: directory
上面的hosts也能夠寫爲(即同行可變分行)
- hosts:
proA
proB
file也能夠寫爲(即:號可換等號。固然也可寫成分行)
file: path=/root/node1,state=directory
handlers能夠被理解爲一種task。handlers中的任務會被task中的「任務」調用。而只有task中的任務進行了實際操做(形成了實際的改變)。對應調用的hardlers任務纔會被執行。
#修改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
#多個任務就對應多個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任務執行順序
---
- 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調用的組名。這樣一次就調用了handler1和handler2
在一個很長的playbook中,只想執行其中的一部分任務或一類任務,就須要tags。tags幫助咱們給任務打標籤。經過在運行.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還能這樣定義:
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
ansible還有5個特殊的tag:
always:假設某任務標籤爲[「t3」,」always」]。則除非明確「--skip-tags」爲t3或always。則即便--tags指定沒有t3,該任務也會被調用
never(2.5版本):只有明確指定--tags爲never,纔會調用該任務
tagged:只運行打了標籤的任務
untagged:只運行沒打標籤的任務
all:運行全部任務。默認狀況下,playbook就如--tags all同樣運行
變量名應該由字母、數字、下劃線組成。變量名須要以字母開頭,ansible內置的關鍵字不能做爲變量名。
咱們既可在playbook內經過vars關鍵字指定變量,也可分離變量文件和playbook。
---
- 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,表示輸入不可見。
還能設置提示信息爲默認值。就像case的default選項同樣:
---
- 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"]}'