文檔下載
參考文檔
朱雙印個人日誌-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是模塊名
看上面這條命令。使用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
ansible的常用模塊
命令模塊
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:目標路徑。如果以“/”結尾,則會直接使用src的basename作文件名
copy
描述
拷貝管理主機上的文件到遠程節點
參數
src:
dest:
content:當不使用src指定拷貝的文件時,可以用content指定文件內容。src與從content必有一個。通過content和dest,可以在目標節點新建文件,並寫入content指定的內容
force:遠程主機已有同名文件存在,是否覆蓋。默認yes
backup:遠程主機已有同名文件存在,是否備份
owner:指定文件拷貝到遠程主機後的屬主
group:指定文件拷貝到遠程主機後的屬組
mode:指定文件拷貝到遠程主機後的權限
file
描述
執行一些對文件的基本操作。如創建/刪除 文件/目錄,修改文件權限等
參數
path:必須參數,指定要操作的文件或目錄
state:directory(創建目錄)
touch(創建文件)
link(軟鏈接)
hard(硬鏈接)
absent(刪除)
src:指定鏈接源
force:是否強制創建鏈接文件,無論源文件是否存在。
owner:
group:
mode:
recurse:遞歸操作。可用於遞歸修改目錄下的文件屬性
find
描述
幫助我們在遠程主機查找符合條件的文件,就像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校驗碼
blockinfile
描述
在指定的文件中插入“一段文本”,這段文本是標記過的。在以後的操作中可以通過“標記”找到這段文本,修改或者刪除它。
參數
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參數 :當要操作的文件並不存在時,是否創建對應的文件。
例子
lineinfile
描述
確保”某一行文本”存在於指定的文件中,或者確保從文件中刪除指定的”文本”(即確保指定的文本不存在於文件中),還可以根據正則表達式,替換”某一行文本”。
參數
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參數 :當要操作的文件並不存在時,是否創建對應的文件。
例子
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:默認爲present。absent表刪除
yum
描述
在遠程主機上通過yum源管理軟件包
參數
name:指定要管理的軟件包
state:指定軟件包狀態。默認爲present(等效於installed)。還有latest、absent(等效於removed)。latest表安裝yum中的最新版本
disable_gpg_check:是否禁用rpm包的公鑰gpg驗證。默認爲no,表示不禁用驗證。
enablerepo:安裝軟件包時,臨時啓用的yum源
diablerepo:安裝軟件包時,臨時禁用的yum源
系統模塊
ping
驗證主機連接性
cron
描述
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:修改/刪除前,先備份
user
描述
管理遠程主機的用戶,增刪改 用戶,爲用戶創建密鑰對,等操作
參數
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。已存在同名密鑰,不做操作
group
描述
管理遠程主機的組
參數
name:
state:默認爲present,absent表刪除
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:
state:started,stopped,restarted,reloaded
enable:是否開機自啓
ansible的playbook
劇本入門
基礎命令
劇本需要用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
handlers可以被理解爲一種task。handlers中的任務會被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調用的組名。這樣一次就調用了handler1和handler2
tags
在一個很長的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的多種寫法
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”爲t3或always。則即使--tags指定沒有t3,該任務也會被調用
never(2.5版本):只有明確指定--tags爲never,纔會調用該任務
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,表示輸入不可見。
還能設置提示信息爲默認值。就像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"]}'