Linux自動(dòng)化運(yùn)維(Shell與Ansible)(微課版) 課件 項(xiàng)目9 自動(dòng)化任務(wù)控制_第1頁
Linux自動(dòng)化運(yùn)維(Shell與Ansible)(微課版) 課件 項(xiàng)目9 自動(dòng)化任務(wù)控制_第2頁
Linux自動(dòng)化運(yùn)維(Shell與Ansible)(微課版) 課件 項(xiàng)目9 自動(dòng)化任務(wù)控制_第3頁
Linux自動(dòng)化運(yùn)維(Shell與Ansible)(微課版) 課件 項(xiàng)目9 自動(dòng)化任務(wù)控制_第4頁
Linux自動(dòng)化運(yùn)維(Shell與Ansible)(微課版) 課件 項(xiàng)目9 自動(dòng)化任務(wù)控制_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Linux自動(dòng)化運(yùn)維項(xiàng)目9:自動(dòng)化任務(wù)控制

學(xué)習(xí)目標(biāo)【知識(shí)目標(biāo)】了解loop循環(huán)語句和when條件語句基本概念。了解處理程序基本概念。了解任務(wù)失敗條件判斷基本結(jié)構(gòu)。了解任務(wù)分組和任務(wù)標(biāo)記基本概念?!炯寄苣繕?biāo)】掌握循環(huán)語句基本語法,能夠使用loop關(guān)鍵字完成循環(huán)任務(wù)。掌握條件語句基本語法,能夠使用when關(guān)鍵字完成條件任務(wù)。掌握處理程序基本語法,能夠使用handlers關(guān)鍵字完成任務(wù)處理。掌握任務(wù)失敗條件判斷,能夠完成失敗任務(wù)的控制處理。掌握任務(wù)分組方法,能夠使用block、rescue、always關(guān)鍵字完成任務(wù)控制。【素質(zhì)目標(biāo)】培養(yǎng)讀者的團(tuán)隊(duì)合作精神、協(xié)同創(chuàng)新能力,使其能夠在團(tuán)隊(duì)中積極合作、有效溝通。培養(yǎng)讀者的獨(dú)立思考能力和邏輯思維能力,使其能夠運(yùn)用邏輯思維解決復(fù)雜問題。自動(dòng)化任務(wù)控制任務(wù)1:循環(huán)語句目錄/Contents0102簡(jiǎn)單的列表循環(huán)字典循環(huán)01簡(jiǎn)單的列表循環(huán)簡(jiǎn)單的列表循環(huán)循環(huán)語句是一種用于重復(fù)執(zhí)行某個(gè)任務(wù)或操作的結(jié)構(gòu),它允許使用者在任務(wù)中對(duì)一組對(duì)象進(jìn)行迭代操作,以便在每個(gè)迭代周期中執(zhí)行相同的任務(wù)。對(duì)于需要重復(fù)執(zhí)行相同操作的場(chǎng)景,循環(huán)語句可以大大提高工作效率。Ansible支持多種類型的循環(huán)語句,涉及l(fā)oop、with_×和until等關(guān)鍵字,在Ansible2.4及之前的版本中,with_×關(guān)鍵字是用于循環(huán)迭代的通用關(guān)鍵字,可以與不同的插件結(jié)合使用,以便在任務(wù)中迭代不同的對(duì)象。在Ansible2.5及之后的版本中,with_×關(guān)鍵字被loop關(guān)鍵字所取代。在較新版本的Ansible中,推薦使用loop關(guān)鍵字進(jìn)行循環(huán)迭代,并結(jié)合loop_control和loop_var關(guān)鍵字以及l(fā)ookup、query插件來實(shí)現(xiàn)復(fù)雜的循環(huán)需求。簡(jiǎn)單的列表循環(huán)loop關(guān)鍵字用于執(zhí)行循環(huán)語句的基本語法如下:其中,module_name用于指定要執(zhí)行的模塊名稱,module_parameter用于指定模塊的參數(shù)名,{{item}}表示對(duì)列表中的每個(gè)元素進(jìn)行迭代,并將其作為參數(shù)傳遞給模塊。loop關(guān)鍵字指定要迭代的數(shù)據(jù)結(jié)構(gòu),可以是列表或字典等數(shù)據(jù)結(jié)構(gòu)。-name:Executetaskwithaloop<module_name>:<module_parameter>:"{{item}}"loop:-value1-value2簡(jiǎn)單的列表循環(huán)loop循環(huán)語句是一種用于重復(fù)執(zhí)行任務(wù)的控制結(jié)構(gòu),它允許對(duì)一個(gè)列表或數(shù)組進(jìn)行迭代,并在每次迭代中執(zhí)行一組任務(wù)。循環(huán)的變量可以在變量文件中定義,或者在vars關(guān)鍵字部分中定義,然后在任務(wù)中引用列表變量的名稱。-name:Loopingoveralistofitemshosts:allvars:packages:-nginx-mysql-redistasks:-name:Createdirectoryfile:path:"/tmp/{{item}}"state:directoryloop:-dir1-dir2-name:Createfilecopy:content:"Thisis{{item}}file"dest:"/tmp/{{item}}/file.txt"loop:-dir1-dir2-name:Installpackagesyum:name:"{{item}}"state:presentloop:"{{packages}}"在示例中,loop關(guān)鍵字用于迭代一個(gè)包含兩個(gè)目錄名稱的字符串列表,并將列表中每個(gè)元素作為item變量的值傳遞給3個(gè)任務(wù)。第1個(gè)任務(wù)使用file模塊創(chuàng)建一個(gè)目錄,并使用item變量構(gòu)建目錄路徑。第2個(gè)任務(wù)使用copy模塊在每個(gè)目錄中創(chuàng)建一個(gè)文件,并使用item變量構(gòu)建文件路徑和內(nèi)容。第3個(gè)任務(wù)使用yum模塊安裝軟件包,vars關(guān)鍵字定義了一個(gè)列表變量packages,它是一個(gè)包含3個(gè)軟件包名稱的列表,在任務(wù)中使用loop循環(huán)語句在所有主機(jī)上依次安裝這3個(gè)軟件包。簡(jiǎn)單的列表循環(huán)由于service模塊不支持變量列表,如果需要啟動(dòng)10個(gè)模塊,普通的編寫方式需要10個(gè)任務(wù),但使用loop循環(huán)語句后就可以提供自動(dòng)化任務(wù)。vars:web_services:-nginx-httpdtasks:-name:NginxandHttpdarerunningservice:name:"{{item}}"state:startedloop:"{{web_services}}"loop循環(huán)語句和item密切相關(guān),loop關(guān)鍵字用于迭代一個(gè)列表,并將列表中的每個(gè)元素作為item變量的值傳遞給任務(wù)。在每次循環(huán)迭代中,item變量都會(huì)被設(shè)置為列表中的當(dāng)前元素。在以下示例中,變量web_services含有需要處于運(yùn)行狀態(tài)的服務(wù)的列表。02字典循環(huán)字典循環(huán)在循環(huán)任務(wù)中,可使用loop關(guān)鍵字遍歷字典并訪問其鍵和值,每次循環(huán)迭代都會(huì)將一個(gè)包含key和value的字典作為item變量的值傳遞給任務(wù)。在下面的任務(wù)中,loop循環(huán)語句會(huì)使用item.key和item.value分別引用字典中的鍵和值,以輸出每個(gè)鍵值對(duì)。上述示例中的user_data字典變量,使用dict2items

過濾器將其轉(zhuǎn)換為適用于循環(huán)的列表結(jié)構(gòu)。loop循環(huán)語句會(huì)將以下兩個(gè)鍵值對(duì)分別作為user_data變量的值傳遞給任務(wù)。----name:Loopthroughdictionaryvariablehosts:localhostvars:user_data:username:devgroupname:wheeltasks:-name:Iteratingoveralistofhashesbykeyandvaluedebug:msg:"{{item.key}}is{{item.value}}"loop:"{{user_data|dict2items}}"字典循環(huán)在較新版本的Ansible中,loop關(guān)鍵字與loop_control

關(guān)鍵字結(jié)合可以更精細(xì)地控制循環(huán)行為,比如自定義循環(huán)變量名標(biāo)簽、循環(huán)迭代之間的暫停時(shí)間等。loop循環(huán)語句會(huì)將以下兩個(gè)鍵值對(duì)分別作為user_data變量的值傳遞給任務(wù)。[{"key":"username","value":"dev},{"key":"groupname","value":"wheel"}]----name:Loopthroughdictionaryvariablehosts:localhosttasks:-name:printdictionaryvariablebyloopdebug:msg:"Filenameis/etc/{{file_name}},Filemodeis{{mode}}“l(fā)oop:-{file_name:'passwd',mode:'0644'}-{file_name:'shadow',mode:'0600'}loop_control:loop_var:file_itemvars:file_name:"{{file_item.file_name}}"mode:"{{file_item.mode}}"在示例中,loop用于遍歷一個(gè)包含兩個(gè)字典的列表,每個(gè)字典表示一個(gè)文件的信息(文件名和文件模式)。{file_name:'passwd',mode:'0644'}和{file_name:'shadow',mode:'0600'}:這兩個(gè)字典分別表示兩個(gè)文件的信息,包含文件名和文件模式。loop_control指定了循環(huán)變量的名稱為file_item,這樣在循環(huán)體內(nèi)就可以使用file_item來引用當(dāng)前循環(huán)的元素。Vars定義了兩個(gè)本地變量file_name和mode,它們分別從循環(huán)變量file_item中獲取每個(gè)文件的文件名和文件模式。謝謝自動(dòng)化任務(wù)控制任務(wù)2:條件語句目錄/Contents010203條件表達(dá)式根據(jù)事實(shí)信息設(shè)置條件

根據(jù)注冊(cè)變量設(shè)置條件04

在循環(huán)中設(shè)置條件01條件表達(dá)式條件表達(dá)式條件語句可以根據(jù)不同的條件選擇性地執(zhí)行任務(wù)或操作。在Playbook中,條件語句可以基于事實(shí)、變量、前一個(gè)任務(wù)的結(jié)果進(jìn)行評(píng)估,通過控制任務(wù)執(zhí)行的條件來實(shí)現(xiàn)更加靈活的自動(dòng)化。條件語句由條件及其相應(yīng)的任務(wù)列表組成,條件用于檢查變量的值,任務(wù)列表包含條件為true時(shí)執(zhí)行的任務(wù)。常用的條件語句涉及when、failed_when、changed_when等關(guān)鍵字。when條件語句的基本語法如下:-name:Taskname<module>:<module_options>when:<expression>其中,when條件語句被添加到任務(wù)中,以便在任務(wù)執(zhí)行之前對(duì)條件進(jìn)行評(píng)估,如果條件為true,則任務(wù)將被執(zhí)行,如果條件為false,則任務(wù)將被跳過;name表示任務(wù)的名稱,用于標(biāo)識(shí)任務(wù);module表示要執(zhí)行的模塊的名稱;module_options表示要傳遞給模塊的參數(shù),可以根據(jù)需要添加多個(gè)參數(shù);expression表示一個(gè)Jinja2表達(dá)式,可以是變量、模塊返回值、算術(shù)運(yùn)算、比較運(yùn)算等,如果表達(dá)式的結(jié)果為true,則任務(wù)會(huì)被執(zhí)行,否則任務(wù)會(huì)被跳過。條件表達(dá)式when條件語句使用Jinja2表達(dá)式來決定任務(wù)是否執(zhí)行,用戶可根據(jù)需要添加多個(gè)表達(dá)式進(jìn)行判斷,還可使用and和or運(yùn)算符連接多個(gè)表達(dá)式,以實(shí)現(xiàn)更復(fù)雜的條件判斷。常用的條件表達(dá)式如表所示:序號(hào)條件表達(dá)式描述1when:var_name==value當(dāng)變量值等于給定值時(shí),條件為true2when:var_name>value當(dāng)變量值大于給定值時(shí),條件為true3when:var_name<value當(dāng)變量值小于給定值時(shí),條件為true4when:var_name>=value當(dāng)變量值大于或等于給定值時(shí),條件為true5when:var_name<=value當(dāng)變量值小于或等于給定值時(shí),條件為true6when:var_name!=value當(dāng)變量值不等于給定值時(shí),條件為true7when:var_nameisdefined當(dāng)變量已定義時(shí),條件為true條件表達(dá)式序號(hào)條件表達(dá)式描述8when:var_nameisundefined如果變量未定義,則條件表達(dá)式為true,否則為false9when:var_nameistrue當(dāng)變量為true時(shí),條件為true10when:var_nameisfalse當(dāng)變量為false時(shí),條件為true11when:var_nameinlist當(dāng)變量值包含在給定列表中時(shí),條件為true12when:notvar_name當(dāng)變量為false或未定義時(shí),條件為true13when:condition1andcondition2當(dāng)condition1和condition2都為true時(shí),條件為true14when:condition1orcondition2當(dāng)condition1或condition2中任意一個(gè)為true時(shí),條件為true15when:(condition1andcondition2)orcondition3當(dāng)condition1和condition2都為true,或條件3為true時(shí),條件為truewhen條件語句使用Jinja2表達(dá)式來決定任務(wù)是否執(zhí)行,用戶可根據(jù)需要添加多個(gè)表達(dá)式進(jìn)行判斷,還可使用and和or運(yùn)算符連接多個(gè)表達(dá)式,以實(shí)現(xiàn)更復(fù)雜的條件判斷。常用的條件表達(dá)式如表所示:條件表達(dá)式在when條件語句中,條件表達(dá)式可以直接調(diào)用變量,而無須使用{{}}這樣的Jinja2模板語言的語法。when條件語句會(huì)自動(dòng)將其條件表達(dá)式中的變量進(jìn)行替換,而變量替換過程會(huì)自動(dòng)應(yīng)用Jinja2的模板語言,將變量的值插入條件表達(dá)式。when條件表達(dá)式示例如下:-name:Configurefileifitexistscopy:src:path/to/filedest:/etc/filewhen:path/to/fileisexists-name:Configureserviceifvariableisdefinedservice:name:service-namestate:startedwhen:variable-nameisdefined-name:Configureserviceifvariableequalsaspecificvalueservice:name:service-namestate:startedwhen:variable-name=="specific-value"-name:Updateaptcacheapt:update_cache:yeswhen:ansible_distribution=='Ubuntu'-name:Startnginxservice:name:nginxstate:startedwhen:'localhost'inweb_servers02根據(jù)事實(shí)信息設(shè)置條件根據(jù)事實(shí)信息設(shè)置條件在Playbook中,用戶希望根據(jù)主機(jī)的屬性來執(zhí)行或跳過任務(wù),這些屬性被稱為主機(jī)的事實(shí)信息,包括IP地址、操作系統(tǒng)版本、文件系統(tǒng)的狀態(tài)等。使用基于事實(shí)信息的條件語句,可以實(shí)現(xiàn)在特定版本的操作系統(tǒng)上安裝軟件包,根據(jù)系統(tǒng)內(nèi)存容量進(jìn)行條件判斷,僅當(dāng)主機(jī)的總內(nèi)存大于或等于8192MB時(shí)才執(zhí)行安裝MySQL的任務(wù):-name:InstallMySQLonhigh-memorymachinesyum:name:mysql-serverstate:presentwhen:ansible_memtotal_mb|int>=8192根據(jù)事實(shí)信息設(shè)置條件根據(jù)CPU核心數(shù)進(jìn)行條件判斷,僅當(dāng)主機(jī)的CPU核心數(shù)量大于或等于4時(shí)才執(zhí)行輸出消息的任務(wù):根據(jù)操作系統(tǒng)信息進(jìn)行條件判斷,僅當(dāng)系統(tǒng)發(fā)行版為RedHat或CentOS時(shí)才執(zhí)行啟動(dòng)Apache服務(wù)的任務(wù)。:-name:CheckCPUcoresdebug:msg:"Systemhasatleast4CPUcores"when:ansible_processor_vcpus|int>=4-name:StartApacheservice:name:httpdstate:startedwhen:ansible_distribution=='RedHat'oransible_distribution=='CentOS'根據(jù)事實(shí)信息設(shè)置條件根據(jù)操作系統(tǒng)信息和版本號(hào)進(jìn)行條件判斷:-name:ShutdownCentOS6systemscommand:/sbin/shutdown-tnowwhen:-ansible_facts['distribution']=="CentOS"-ansible_facts['distribution_major_version']=="7"-name:CheckOSversiondebug:msg:"OSversionisgreaterthanorequalto7"when:ansible_facts['distribution_major_version']|int>=7-name:DosomethingonRedHatshell:some_commandwhen:ansible_distribution|lower=='redhat'在示例中,第1個(gè)when條件,系統(tǒng)發(fā)行版為CentOS,CentOS的主要版本號(hào)為6。第2個(gè)when條件,需要滿足操作系統(tǒng)主要版本號(hào)大于或等于。第3個(gè)when條件,需要滿足操作系統(tǒng)發(fā)行版為RedHat。03根據(jù)注冊(cè)變量設(shè)置條件根據(jù)注冊(cè)變量設(shè)置條件在Playbook中,通常需要根據(jù)之前任務(wù)的執(zhí)行結(jié)果來執(zhí)行或跳過后續(xù)任務(wù)。通過register關(guān)鍵字將任務(wù)的執(zhí)行結(jié)果賦值給一個(gè)變量。在后續(xù)的任務(wù)中,可以根據(jù)這個(gè)變量的值來設(shè)置條件,從而控制任務(wù)是否執(zhí)行。注冊(cè)變量條件判斷示例如下:----name:conditionregisterhosts:tasks:-name:Checkifpackageisinstalledshell:rpm-qahttpdregister:package_installed-name:Printregistervardebug:var:package_installed-name:Checkwhetherthesoftwarepackageisinstalledbyrcdebug:msg:Thispackageisinstalledwhen:package_installed.rc|int==0-name:Checkwhetherthesoftwarepackageisinstalledbystdoutdebug:msg:Thispackageisinstalledwhen:package_installed.stdout.find('httpd')==0在上述示例中,第1個(gè)任務(wù)使用register關(guān)鍵字將命令輸出結(jié)果存儲(chǔ)在注冊(cè)變量package_installed中;第2個(gè)任務(wù)使用debug模塊輸出注冊(cè)變量結(jié)果。第3個(gè)任務(wù)通過when條件語句進(jìn)行判斷,rc表示命令執(zhí)行的返回狀態(tài)碼,如果命令執(zhí)行成功則rc為0,否則為其他值。語句中的int是一個(gè)jinja2過濾器,表示將變量的值轉(zhuǎn)換為整數(shù),因?yàn)樽兞康闹凳亲址?,如果不進(jìn)行轉(zhuǎn)換會(huì)導(dǎo)致判斷條件出錯(cuò)。第4個(gè)任務(wù)通過when條件語句進(jìn)行判斷,該語句使用了stdout.find方法,該方法用于查找字符串中是否包含指定的子字符串httpd,如果返回值為0,則說明字符串中包含子字符串“httpd”;否則返回-1。04在循環(huán)中設(shè)置條件在循環(huán)中設(shè)置條件在AnsiblePlaybook中,可以使用when條件語句在循環(huán)語句中對(duì)每個(gè)項(xiàng)進(jìn)行條件判斷。這種方式可以根據(jù)條件來決定是否處理某些特定的項(xiàng),或者在處理每個(gè)項(xiàng)時(shí)使用不同的參數(shù)。在循環(huán)中使用when條件語句示例如下:在上述示例中,定義了一個(gè)包含3個(gè)用戶的列表,對(duì)每個(gè)用戶執(zhí)行l(wèi)oop循環(huán)語句以創(chuàng)建用戶,并設(shè)置when條件語句,僅在用戶uid大于1001時(shí)才執(zhí)行該任務(wù),任務(wù)執(zhí)行結(jié)果是bob和alex用戶被創(chuàng)建,tom用戶因uid不符合條件沒有被創(chuàng)建。----name:Loopwithconditionalshosts:vars:users:-name:tomuid:1001-name:bobuid:1002-name:alexuid:1003tasks:-name:Createuseraccountsuser:name:"{{}}"uid:"{{item.uid}}"loop:"{{users}}"when:item.uid>1001謝謝自動(dòng)化任務(wù)控制任務(wù)3:實(shí)施處理程序目錄/Contents0102定義處理程序監(jiān)聽處理程序01定義處理程序定義處理程序處理程序是響應(yīng)由其他任務(wù)觸發(fā)的通知的任務(wù),僅當(dāng)任務(wù)在受管主機(jī)上更改了某些內(nèi)容時(shí),任務(wù)才通知其處理程序。每個(gè)處理程序都具有全局唯一的名稱,在Playbook中任務(wù)塊的末尾觸發(fā)。如果沒有任務(wù)通過名稱通知處理程序,處理程序就不會(huì)運(yùn)行。Ansible處理程序使用handlers關(guān)鍵字來定義,其基本語法與Playbook任務(wù)定義的類似,每個(gè)處理程序必須具有唯一的名稱,并且必須與通知的名稱相匹配,每個(gè)處理程序都包含一個(gè)名稱和一個(gè)或多個(gè)任務(wù)。定義處理程序在上述示例中,當(dāng)task1任務(wù)執(zhí)行后,如果引起了受管主機(jī)狀態(tài)更改,那么notify會(huì)通知任務(wù)名稱為handlertask1的處理程序來執(zhí)行相應(yīng)的操作。tasks:-name:task1<module_name>:<module_arguments>notify:handlertask1handlers:-name:handlertask1<module_name>:<module_arguments>handlers通常與notify關(guān)鍵字一起使用,當(dāng)任務(wù)引起主機(jī)狀態(tài)更改時(shí),可以使用notify關(guān)鍵字通知一個(gè)或多個(gè)處理程序執(zhí)行特定操作。處理程序的基本語法如下所示:定義處理程序處理程序可以視為非活動(dòng)任務(wù),即只有在使用notify語句顯式調(diào)用時(shí)才會(huì)觸發(fā),這樣做可以確保handlers只有在需要時(shí)才會(huì)被執(zhí)行,從而不會(huì)影響任務(wù)的執(zhí)行順序。任務(wù)處理程序如下所示:tasks:-name:Templateconfigurationfiletemplate:src:template.j2dest:/etc/foo.confnotify:-Restartapache-Restartmemcachedhandlers:-name:Restartmemcachedservice:name:memcachedstate:restarted-name:Restartapacheservice:name:httpdstate:restarted在示例中,Templateconfigurationfile任務(wù)使用template模塊將template.j2模板文件渲染為/etc/foo.conf文件,如果任務(wù)執(zhí)行成功,將觸發(fā)名為Restartapache和Restartmemcached的兩個(gè)處理程序,處理程序使用service模塊來重啟memcached和httpd服務(wù)。02監(jiān)聽處理程序監(jiān)聽處理程序在Ansible中,處理程序必須被命名,這樣notify關(guān)鍵字才能通知這些處理程序執(zhí)行任務(wù)。如果多個(gè)處理程序使用相同的名稱,notify關(guān)鍵字僅會(huì)通知最后一個(gè)定義的處理程序,之前的處理程序?qū)⒈桓采w。listen關(guān)鍵字可以用于定義一個(gè)或多個(gè)監(jiān)聽器,讓多個(gè)處理程序監(jiān)聽同一個(gè)事件,當(dāng)任務(wù)完成時(shí),監(jiān)聽器將會(huì)被觸發(fā),以便執(zhí)行相應(yīng)的處理程序。與notify關(guān)鍵字不同,listen關(guān)鍵字不需要與任務(wù)名稱關(guān)聯(lián)。監(jiān)聽處理程序tasks:-name:Restarteverythingcommand:echo"thistaskwillrestartthewebservices"notify:"restartwebservices"handlers:-name:Restartmemcachedservice:name:memcachedstate:restartedlisten:"restartwebservices“-name:Restartapacheservice:name:apachestate:restartedlisten:"restartwebservices"在下面的示例中,使用notify關(guān)鍵字觸發(fā)名稱為restartwebservices的監(jiān)聽事件時(shí),所有監(jiān)聽該事件的處理程序都將被執(zhí)行,無論這些處理程序的名稱如何命名。通過listen創(chuàng)建監(jiān)聽事件,可以將處理程序與其名稱解耦,這使得觸發(fā)多個(gè)處理程序以及在角色和Playbook之間共享處理程序變得更加高效。謝謝自動(dòng)化任務(wù)控制任務(wù)4:任務(wù)失敗和異常處理目錄/Contents010203忽略錯(cuò)誤任務(wù)失敗強(qiáng)制執(zhí)行處理程序

指定任務(wù)失敗條件04

強(qiáng)制任務(wù)失敗05

指定任務(wù)報(bào)告changed狀態(tài)01忽略錯(cuò)誤忽略錯(cuò)誤錯(cuò)誤和異常處理是編程語言中的重要機(jī)制,主要用于捕捉和處理代碼執(zhí)行時(shí)可能出現(xiàn)的錯(cuò)誤和異常,并確保程序在出現(xiàn)錯(cuò)誤或異常情況時(shí)能夠正確、穩(wěn)定地處理問題,從而保證程序的可靠性和健壯性。當(dāng)執(zhí)行自動(dòng)化任務(wù)時(shí),Ansible將捕獲任務(wù)狀態(tài),通過評(píng)估每個(gè)任務(wù)的狀態(tài),確定任務(wù)是成功的還是失敗的。常見的任務(wù)狀態(tài)如表所示:序號(hào)任務(wù)狀態(tài)描述1ok任務(wù)成功完成2changed任務(wù)成功完成,但進(jìn)行了一些更改,例如更新配置文件或安裝軟件包3skipped任務(wù)被跳過,因?yàn)闂l件不滿足或者已經(jīng)執(zhí)行過相同的任務(wù)4failed任務(wù)執(zhí)行失敗,可能是腳本錯(cuò)誤、連接問題或其他原因?qū)е碌?unreachable無法連接到遠(yuǎn)程主機(jī),可能是由于網(wǎng)絡(luò)問題或主機(jī)已下線6ignored任務(wù)被忽略,通常是因?yàn)槠渌蝿?wù)的狀態(tài)導(dǎo)致該任務(wù)不必執(zhí)行7rescued當(dāng)使用block和rescue時(shí),若rescue塊中的任務(wù)失敗,Ansible會(huì)跳過該塊并將其標(biāo)記為rescued忽略錯(cuò)誤通常情況下,當(dāng)任務(wù)失敗時(shí),Ansible會(huì)立即終止執(zhí)行當(dāng)前play的其余部分,并跳過所有后續(xù)任務(wù)。但在某些情況下,用戶希望即使任務(wù)失敗也繼續(xù)執(zhí)行play,或者有條件地運(yùn)行其他任務(wù)來恢復(fù)。為了完成這些操作,Ansible提供了多種處理錯(cuò)誤和異常的方法。常見的錯(cuò)誤和異常處理關(guān)鍵字如表所示:序號(hào)方法描述1fail引發(fā)一個(gè)失敗,中斷當(dāng)前任務(wù)或play,并提供自定義的錯(cuò)誤消息。允許在滿足特定條件時(shí)明確終止執(zhí)行,通常與when條件一起使用2ignore_errors忽略執(zhí)行任務(wù)時(shí)出現(xiàn)的錯(cuò)誤并繼續(xù)執(zhí)行后續(xù)任務(wù)。如果在執(zhí)行任務(wù)時(shí)出現(xiàn)錯(cuò)誤,可以將ignore_errors設(shè)置為true以忽略錯(cuò)誤并繼續(xù)執(zhí)行后續(xù)任務(wù)3failed_when根據(jù)特定條件將任務(wù)標(biāo)記為失敗,當(dāng)滿足該條件時(shí)認(rèn)為命令或模塊執(zhí)行失敗,根據(jù)任務(wù)執(zhí)行狀態(tài)繼續(xù)執(zhí)行后續(xù)任務(wù)或執(zhí)行其他操作4changed_when控制任務(wù)在何時(shí)報(bào)告它已進(jìn)行了更改,Ansible執(zhí)行任務(wù)時(shí),會(huì)對(duì)遠(yuǎn)程系統(tǒng)產(chǎn)生影響,如修改配置文件、安裝軟件包等。任務(wù)執(zhí)行的結(jié)果可能導(dǎo)致系統(tǒng)狀態(tài)的變化。通過changed_when關(guān)鍵字,可以定義一個(gè)條件,只有當(dāng)這個(gè)條件滿足時(shí),Ansible才會(huì)將任務(wù)執(zhí)行狀態(tài)標(biāo)記為已變更忽略錯(cuò)誤常見的錯(cuò)誤和異常處理關(guān)鍵字如表所示:序號(hào)方法描述5block和rescue將一組任務(wù)包裝在一個(gè)block塊中,并在遇到錯(cuò)誤時(shí)執(zhí)行rescue塊中的恢復(fù)操作。塊中的任何任務(wù)都可能導(dǎo)致錯(cuò)誤,但是只要有一個(gè)任務(wù)失敗,就會(huì)跳過塊中的其余任務(wù)并執(zhí)行rescue塊中的恢復(fù)操作6always指定任務(wù)總是運(yùn)行,即使之前的任務(wù)失敗或跳過也會(huì)執(zhí)行當(dāng)前任務(wù)7register將任務(wù)的輸出保存到變量中,以便在后續(xù)任務(wù)中使用,以幫助檢查任務(wù)的執(zhí)行結(jié)果,包括檢查任務(wù)是否成功、是否發(fā)生錯(cuò)誤等。比如任務(wù)失敗,可以使用register中的錯(cuò)誤信息進(jìn)行記錄和報(bào)告8force_handlers用于指定在play中強(qiáng)制運(yùn)行錯(cuò)誤處理程序,即使play因?yàn)楹罄m(xù)任務(wù)失敗而終止也會(huì)調(diào)用被通知的處理程序9assert檢查任務(wù)執(zhí)行結(jié)果是否符合預(yù)期,不符合預(yù)期時(shí)引發(fā)錯(cuò)誤,終止任務(wù)的執(zhí)行10max_fail_percentage允許在指定百分比范圍內(nèi)容忍失敗的主機(jī)數(shù)量。如果失敗的主機(jī)數(shù)超出了指定百分比,則Playbook將被標(biāo)記為失敗,且后續(xù)的任務(wù)將不再執(zhí)行11any_errors_fatal如果設(shè)置為true,表示任何一個(gè)任務(wù)失敗都會(huì)導(dǎo)致Ansible立即終止play12ignore_unreachable忽略無法連接的主機(jī)的錯(cuò)誤,并繼續(xù)執(zhí)行其他主機(jī)的任務(wù)。如果設(shè)置為true,表示在連接失敗時(shí)不會(huì)終止play,而是將任務(wù)標(biāo)記為unreachable13callback_plugins指定錯(cuò)誤處理回調(diào)插件,當(dāng)出現(xiàn)錯(cuò)誤時(shí)執(zhí)行自定義的操作,比如發(fā)送電子郵件通知定義和引用變量在自動(dòng)化任務(wù)執(zhí)行過程中可能會(huì)遇到各種問題,如連接失敗、命令執(zhí)行錯(cuò)誤、模塊調(diào)用異常等。任務(wù)執(zhí)行失敗時(shí),默認(rèn)情況下Ansible會(huì)停止在當(dāng)前主機(jī)上執(zhí)行后續(xù)任務(wù)。在Ansible中,ignore_errors參數(shù)用于忽略任務(wù)執(zhí)行過程中的錯(cuò)誤并繼續(xù)執(zhí)行Playbook任務(wù)。ignore_errors基本語法如下:-name:Sometasksome_module:some_parameter:some_valueignore_errors:true在上述示例中,ignore_errors被設(shè)置為true,表示在執(zhí)行當(dāng)前任務(wù)時(shí)如果出現(xiàn)錯(cuò)誤,Ansible會(huì)忽略該錯(cuò)誤并繼續(xù)執(zhí)行后續(xù)任務(wù)。02任務(wù)失敗強(qiáng)制執(zhí)行處理程序任務(wù)失敗強(qiáng)制執(zhí)行處理程序當(dāng)Ansible執(zhí)行Playbook任務(wù)時(shí),如果其中某個(gè)任務(wù)執(zhí)行失敗,那么當(dāng)前主機(jī)上的后續(xù)處理程序?qū)⒉粫?huì)被運(yùn)行,如果在play中設(shè)置force_handlers:true,即使play因?yàn)楹罄m(xù)任務(wù)失敗而終止也會(huì)調(diào)用被通知的處理程序。處理程序會(huì)在任務(wù)報(bào)告changed時(shí)獲得通知,而在任務(wù)報(bào)告ok或failed時(shí)不會(huì)獲得通知。force_handlers示例如下:-name:Exampleplaywithforce_handlershosts:allforce_handlers:truetasks:-name:Task1command:/bin/truenotify:restartservice-name:Task2command:/bin/falsehandlers:-name:restartserviceservice:name:myservicestate:restarted在示例中,force_handlers被設(shè)置為true,表示無論哪個(gè)任務(wù)執(zhí)行失敗,Ansible都會(huì)在所有主機(jī)上運(yùn)行restartservice處理程序,并重啟myservice服務(wù)。03指定任務(wù)失敗條件指定任務(wù)失敗條件在任務(wù)中使用failed_when關(guān)鍵字來指定表示任務(wù)已失敗的條件,從而決定是否將任務(wù)標(biāo)記為失敗。failed_when關(guān)鍵字使用的必須是一個(gè)可解析的表達(dá)式,可以使用Jinja2的模板語法和過濾器來定義,當(dāng)任務(wù)輸出的結(jié)果匹配failed_when關(guān)鍵字指定的條件時(shí),該任務(wù)將被標(biāo)記為失敗,否則,該任務(wù)將視為成功。failed_when基本語法如下:在上述示例中,當(dāng)example-command命令的標(biāo)準(zhǔn)錯(cuò)誤輸出中出現(xiàn)了FAILED字符串時(shí),任務(wù)將被標(biāo)記為失敗。-name:Exampletaskwithfailed_whencommand:/usr/bin/example-commandregister:command_resultfailed_when:"'FAILED'incommand_result.stderr"04強(qiáng)制任務(wù)失敗強(qiáng)制任務(wù)失敗fail關(guān)鍵字可用于主動(dòng)觸發(fā)任務(wù)失敗,當(dāng)某些條件不滿足時(shí),需要終止Playbook任務(wù)運(yùn)行,并向用戶提供必要的錯(cuò)誤信息。fail基本語法如下:在上面的示例中,使用stat模塊檢查文件是否存在,并將結(jié)果存儲(chǔ)在注冊(cè)變量file_stat中。在接下來的任務(wù)中,使用fail關(guān)鍵字來檢查文件是否存在,當(dāng)文件不存在時(shí),fail模塊將終止Playbook的運(yùn)行,并輸出錯(cuò)誤信息Filedoesnotexist。-name:Checkiffileexistsstat:path:/path/to/fileregister:file_stat-name:Stopplaybookiffiledoesnotexistfail:msg:"Filedoesnotexist"when:notfile_stat.stat.exists05指定任務(wù)報(bào)告changed狀態(tài)指定任務(wù)報(bào)告changed狀態(tài)changed_when條件語句可以定義任務(wù)是否對(duì)遠(yuǎn)程節(jié)點(diǎn)進(jìn)行了變更,用戶可以根據(jù)返回代碼或輸出來確定是否應(yīng)該在Ansible統(tǒng)計(jì)信息中報(bào)告變更,以及是否應(yīng)該觸發(fā)處理程序。changed_when關(guān)鍵字用于定義任務(wù)的狀態(tài)變化條件,如果任務(wù)的執(zhí)行結(jié)果滿足changed_when定義的條件,則任務(wù)將被標(biāo)記為狀態(tài)變化。changed_when基本語法如下:tasks:-name:Report'changed'whenthereturncodeisnotequalto2shell:/usr/bin/billybass--mode="takemetotheriver"register:bass_resultchanged_when:"bass_result.rc!=2"-name:Thiswillneverreport'changed'statusshell:wall'beep'changed_when:False在上述示例中,第一個(gè)任務(wù)使用shell模塊來運(yùn)行命令,并將命令執(zhí)行的結(jié)果保存在bass_result注冊(cè)變量中。changed_when關(guān)鍵字用于決定何時(shí)標(biāo)記任務(wù)的狀態(tài)為changed,如果bass_result.rc的返回值不等于2,則該任務(wù)將被標(biāo)記為changed。第二個(gè)任務(wù)使用shell模塊來運(yùn)行命令。因?yàn)閏hanged_when關(guān)鍵字的默認(rèn)值為true,即當(dāng)任務(wù)運(yùn)行并更改了主機(jī)的狀態(tài)時(shí),將任務(wù)標(biāo)記為changed。該任務(wù)中的changed_when關(guān)鍵字被設(shè)置為false,這意味著無論命令是否更改了主機(jī)的狀態(tài),該任務(wù)都不會(huì)被標(biāo)記為changed。謝謝自動(dòng)化任務(wù)控制任務(wù)4:使用塊和標(biāo)簽分組任務(wù)目錄/Contents0102塊任務(wù)標(biāo)簽任務(wù)01塊任務(wù)塊任務(wù)在Playbook中,塊是對(duì)任務(wù)進(jìn)行邏輯分組的子句,可用于控制任務(wù)的執(zhí)行方式。塊中的所有任務(wù)都繼承在塊級(jí)別應(yīng)用的指令,除了循壞指令,大多數(shù)指令都可以應(yīng)用于塊級(jí)別。應(yīng)用于塊級(jí)別的指令包括when、register、ignore_errors等,這些指令會(huì)被塊中包含的任務(wù)繼承,而不會(huì)影響塊本身。block、rescue、always是一組關(guān)鍵字,使用這3個(gè)關(guān)鍵字來創(chuàng)建任務(wù)塊,可以定義任務(wù)塊的執(zhí)行流程,塊中的任務(wù)可以共享相同的指令和數(shù)據(jù)。3個(gè)關(guān)鍵字如表所示:序號(hào)關(guān)鍵字描述1block允許在單個(gè)任務(wù)中定義一組相關(guān)任務(wù)。所有任務(wù)都可以繼承在塊級(jí)別應(yīng)用的指令,使設(shè)置任務(wù)通用的數(shù)據(jù)或指令變得更加容易。塊中的任務(wù)按照在Playbook中的定義順序逐個(gè)執(zhí)行,如果任何一個(gè)任務(wù)失敗,則塊中所有的任務(wù)都會(huì)被跳過2rescue指定當(dāng)塊中任意任務(wù)失敗時(shí),應(yīng)該執(zhí)行的任務(wù)列表。如果沒有指定rescue任務(wù),則Ansible會(huì)停止整個(gè)Playbook的執(zhí)行3always指定不管塊中的任務(wù)是否成功,都必須執(zhí)行的任務(wù)列表。通常用于清理操作塊任務(wù)在下面的示例中,block表示一個(gè)任務(wù)塊,用于將多個(gè)任務(wù)組合在一起,在塊中將執(zhí)行3個(gè)任務(wù),rescue表示一個(gè)用于處理block塊中出現(xiàn)的錯(cuò)誤的塊。如果block塊中的任何一個(gè)任務(wù)失敗,都會(huì)跳轉(zhuǎn)到rescue塊,并執(zhí)行其中的任務(wù)。always也表示一個(gè)任務(wù)塊,其中的任務(wù)總是會(huì)在執(zhí)行完block塊和rescue塊后執(zhí)行。tasks:-name:Install,configure,andstartApache

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論