這篇文章主要介紹了如何使用Ansible,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)自成立以來,一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、電子商務(wù)、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個(gè)性化軟件開發(fā)等基于互聯(lián)網(wǎng)的全面整合營銷服務(wù)。公司擁有豐富的網(wǎng)站建設(shè)和互聯(lián)網(wǎng)應(yīng)用系統(tǒng)開發(fā)管理經(jīng)驗(yàn)、成熟的應(yīng)用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開發(fā)工程師團(tuán)隊(duì)及專業(yè)的網(wǎng)站設(shè)計(jì)師團(tuán)隊(duì)。
Ansible 的配置文件保存在 /etc/ansible
中,這很有道理,因?yàn)?nbsp;/etc/
是系統(tǒng)程序應(yīng)該保存配置文件的地方。我需要使用的兩個(gè)文件是 ansible.cfg
和 hosts
。
在進(jìn)行了從文檔和線上找到的一些實(shí)踐練習(xí)之后,我遇到了一些有關(guān)棄用某些較舊的 Python 文件的警告信息。因此,我在 ansible.cfg
中將 deprecation_warnings
設(shè)置為 false
,這樣那些憤怒的紅色警告消息就不會出現(xiàn)了:
deprecation_warnings = False
這些警告很重要,所以我稍后將重新回顧它們,并弄清楚我需要做什么。但是現(xiàn)在,它們不會再擾亂屏幕,也不會讓我混淆實(shí)際上需要關(guān)注的錯(cuò)誤。
與 /etc/hosts
文件不同,hosts
文件也被稱為清單文件,它列出了網(wǎng)絡(luò)上的主機(jī)。此文件允許將主機(jī)分組到相關(guān)集合中,例如“servers”、“workstations”和任何你所需的名稱。這個(gè)文件包含幫助和大量示例,所以我在這里就不詳細(xì)介紹了。但是,有些事情你必須知道。
主機(jī)也可以列在組之外,但是組對于識別具有一個(gè)或多個(gè)共同特征的主機(jī)很有幫助。組使用 INI 格式,所以服務(wù)器組看起來像這樣:
[servers]server1server2......
這個(gè)文件中必須有一個(gè)主機(jī)名,這樣 Ansible 才能對它進(jìn)行操作。即使有些子命令允許指定主機(jī)名,但除非主機(jī)名在 hosts
文件中,否則命令會失敗。一個(gè)主機(jī)也可以放在多個(gè)組中。因此,除了 [servers]
組之外,server1
也可能是 [webservers]
組的成員,還可以是 [ubuntu]
組的成員,這樣以區(qū)別于 Fedora 服務(wù)器。
Ansible 很智能。如果 all
參數(shù)用作主機(jī)名,Ansible 會掃描 hosts
文件并在它列出的所有主機(jī)上執(zhí)行定義的任務(wù)。Ansible 只會嘗試在每個(gè)主機(jī)上工作一次,不管它出現(xiàn)在多少個(gè)組中。這也意味著不需要定義 all
組,因?yàn)?Ansible 可以確定文件中的所有主機(jī)名,并創(chuàng)建自己唯一的主機(jī)名列表。
另一件需要注意的事情是單個(gè)主機(jī)的多個(gè)條目。我在 DNS 文件中使用 CNAME
記錄來創(chuàng)建別名,這些別名指向某些主機(jī)的 A 記錄,這樣,我可以將一個(gè)主機(jī)稱為 host1
或 h2
或 myhost
。如果你在 hosts
文件中為同一主機(jī)指定多個(gè)主機(jī)名,則 Ansible 將嘗試在所有這些主機(jī)名上執(zhí)行其任務(wù),它無法知道它們指向同一主機(jī)。好消息是,這并不會影響整體結(jié)果;它只是多花了一點(diǎn)時(shí)間,因?yàn)?Ansible 會在次要主機(jī)名上工作,它會確定所有操作均已執(zhí)行。
我閱讀過 Ansible 的大多數(shù)材料都談到了 Ansible 實(shí)情,它是與遠(yuǎn)程系統(tǒng)相關(guān)的數(shù)據(jù),包括操作系統(tǒng)、IP 地址、文件系統(tǒng)等等。這些信息可以通過其它方式獲得,如 lshw
、dmidecode
或 /proc
文件系統(tǒng)等。但是 Ansible 會生成一個(gè)包含此信息的 JSON 文件。每次 Ansible 運(yùn)行時(shí),它都會生成這些實(shí)情數(shù)據(jù)。在這個(gè)數(shù)據(jù)流中,有大量的信息,都是以鍵值對形式出現(xiàn)的:<"variable-name": "value">
。所有這些變量都可以在 Ansible 劇本中使用,理解大量可用信息的最好方法是實(shí)際顯示一下:
# ansible -m setup <hostname> | less
明白了嗎?你想知道的有關(guān)主機(jī)硬件和 Linux 發(fā)行版的所有內(nèi)容都在這里,它們都可以在劇本中使用。我還沒有達(dá)到需要使用這些變量的地步,但是我相信在接下來的幾天中會用到。
上面的 ansible
命令使用 -m
選項(xiàng)來指定 setup
模塊。Ansible 已經(jīng)內(nèi)置了許多模塊,所以你對這些模塊不需要使用 -m
。也可以安裝許多下載的模塊,但是內(nèi)置模塊可以完成我目前項(xiàng)目所需的一切。
劇本幾乎可以放在任何地方。因?yàn)槲倚枰?root 身份運(yùn)行,所以我將它放在了 /root/ansible
下。當(dāng)我運(yùn)行 Ansible 時(shí),只要這個(gè)目錄是當(dāng)前的工作目錄(PWD),它就可以找到我的劇本。Ansible 還有一個(gè)選項(xiàng),用于在運(yùn)行時(shí)指定不同的劇本和位置。
劇本可以包含注釋,但是我看到的文章或書籍很少提及此。但作為一個(gè)相信記錄一切的系統(tǒng)管理員,我發(fā)現(xiàn)使用注釋很有幫助。這并不是說在注釋中做和任務(wù)名稱同樣的事情,而是要確定任務(wù)組的目的,并確保我以某種方式或順序記錄我做這些事情的原因。當(dāng)我可能忘記最初的想法時(shí),這可以幫助以后解決調(diào)試問題。
劇本只是定義主機(jī)所需狀態(tài)的任務(wù)集合。在劇本的開頭指定主機(jī)名或清單組,并定義 Ansible 將在其上運(yùn)行劇本的主機(jī)。
以下是我的一個(gè)劇本示例:
################################################################################# This Ansible playbook updates Midnight commander configuration files. #################################################################################- name: Update midnight commander configuration files hosts: all tasks: - name: ensure midnight commander is the latest version dnf: name: mc state: present - name: create ~/.config/mc directory for root file: path: /root/.config/mc state: directory mode: 0755 owner: root group: root - name: create ~/.config/mc directory for dboth file: path: /home/dboth/.config/mc state: directory mode: 0755 owner: dboth group: dboth - name: copy latest personal skin copy: src: /root/ansible/UpdateMC/files/MidnightCommander/DavidsGoTar.ini dest: /usr/share/mc/skins/DavidsGoTar.ini mode: 0644 owner: root group: root - name: copy latest mc ini file copy: src: /root/ansible/UpdateMC/files/MidnightCommander/ini dest: /root/.config/mc/ini mode: 0644 owner: root group: root - name: copy latest mc panels.ini file copy: src: /root/ansible/UpdateMC/files/MidnightCommander/panels.ini dest: /root/.config/mc/panels.ini mode: 0644 owner: root group: root<截?cái)?gt;
劇本從它自己的名字和它將要操作的主機(jī)開始,在本文中,所有主機(jī)都在我的 hosts
文件中。tasks
部分列出了使主機(jī)達(dá)到所需狀態(tài)的特定任務(wù)。這個(gè)劇本從使用 DNF 更新 Midnight Commander 開始(如果它不是最新的版本的話)。下一個(gè)任務(wù)確保創(chuàng)建所需的目錄(如果它們不存在),其余任務(wù)將文件復(fù)制到合適的位置,這些 file
和 copy
任務(wù)還可以為目錄和文件設(shè)置所有權(quán)和文件模式。
劇本細(xì)節(jié)超出了本文的范圍,但是我對這個(gè)問題使用了一點(diǎn)蠻力。還有其它方法可以確定哪些用戶需要更新文件,而不是對每個(gè)用戶的每個(gè)文件使用一個(gè)任務(wù)。我的下一個(gè)目標(biāo)是簡化這個(gè)劇本,使用一些更先進(jìn)的技術(shù)。
運(yùn)行劇本很容易,只需要使用 ansible-playbook
命令。.yml
擴(kuò)展名代表 YAML,我看到過它的幾種不同含義,但我認(rèn)為它是“另一種標(biāo)記語言”,盡管有些人聲稱 YAML 不是這種語言。
這個(gè)命令將會運(yùn)行劇本,它會更新 Midnight Commander 文件:
# ansible-playbook -f 10 UpdateMC.yml
-f
選項(xiàng)指定 Ansible 使用 10 個(gè)線程來執(zhí)行操作。這可以大大加快整個(gè)任務(wù)的完成速度,特別是在多臺主機(jī)上工作時(shí)。
劇本運(yùn)行時(shí)會列出每個(gè)任務(wù)和執(zhí)行結(jié)果。ok
代表任務(wù)管理的機(jī)器狀態(tài)已經(jīng)完成,因?yàn)樵谌蝿?wù)中定義的狀態(tài)已經(jīng)為真,所以 Ansible 不需要執(zhí)行任何操作。
changed
表示 Ansible 已經(jīng)執(zhí)行了指定的任務(wù)。在這種情況下,任務(wù)中定義的機(jī)器狀態(tài)不為真,所以執(zhí)行指定的操作使其為真。在彩色終端上,TASK
行會以彩色顯示。我的終端配色為“amber-on-black”,TASK
行顯示為琥珀色,changed
是棕色,ok
為綠色,錯(cuò)誤是紅色。
下面的輸出是我最終用于在新主機(jī)執(zhí)行安裝后配置的劇本:
PLAY [Post-installation updates, package installation, and configuration] TASK [Gathering Facts]ok: [testvm2] TASK [Ensure we have connectivity]ok: [testvm2] TASK [Install all current updates]changed: [testvm2] TASK [Install a few command line tools]changed: [testvm2] TASK [copy latest personal Midnight Commander skin to /usr/share]changed: [testvm2] TASK [create ~/.config/mc directory for root]changed: [testvm2] TASK [Copy the most current Midnight Commander configuration files to /root/.config/mc]changed: [testvm2] => (item=/root/ansible/PostInstallMain/files/MidnightCommander/DavidsGoTar.ini)changed: [testvm2] => (item=/root/ansible/PostInstallMain/files/MidnightCommander/ini)changed: [testvm2] => (item=/root/ansible/PostInstallMain/files/MidnightCommander/panels.ini) TASK [create ~/.config/mc directory in /etc/skel]changed: [testvm2] <截?cái)?gt;
如果你的計(jì)算機(jī)上安裝了 cowsay 程序,你會發(fā)現(xiàn) TASK
的名字出現(xiàn)在奶牛的語音泡泡中:
____________________________________< TASK [Ensure we have connectivity] > ------------------------------------ \ ^__^ \ (oo)\\_______ (__)\ )\/\ ||----w | || ||
如果你沒有這個(gè)有趣的程序,你可以使用發(fā)行版的包管理器安裝 Cowsay 程序。如果你有這個(gè)程序但不想要它,可以通過在 /etc/ansible/ansible.cfg
文件中設(shè)置 nocows=1
將其禁用。
我喜歡這頭奶牛,它很有趣,但是它會占用我的一部分屏幕。因此,在它開始妨礙我使用時(shí),我就把它禁用了。
與我的 Midnight Commander 任務(wù)一樣,經(jīng)常需要安裝和維護(hù)各種類型的文件。創(chuàng)建用于存儲劇本的目錄樹的“最佳實(shí)踐”和系統(tǒng)管理員一樣多,至少與編寫有關(guān) Ansible 書和文章的作者數(shù)量一樣多。
我選擇了一個(gè)對我有意義的簡單結(jié)構(gòu):
/root/ansible └── UpdateMC ├── files │ └── MidnightCommander │ ├── DavidsGoTar.ini │ ├── ini │ └── panels.ini └── UpdateMC.yml
你可以使用任何結(jié)構(gòu)。但是請注意,其它系統(tǒng)管理員可能需要使用你設(shè)置的劇本來工作,所以目錄應(yīng)該具有一定程度的邏輯。當(dāng)我使用 RPM 和 Bash 腳本執(zhí)行安裝任務(wù)后,我的文件倉庫有點(diǎn)分散,絕對沒有任何邏輯結(jié)構(gòu)。當(dāng)我為許多管理任務(wù)創(chuàng)建劇本時(shí),我將介紹一個(gè)更有邏輯的結(jié)構(gòu)來管理我的目錄。
根據(jù)需要或期望多次運(yùn)行劇本是安全的。只有當(dāng)主機(jī)狀態(tài)與任務(wù)中指定的狀態(tài)不匹配時(shí),才會執(zhí)行每個(gè)任務(wù)。這使得很容易從先前的劇本運(yùn)行中遇到的錯(cuò)誤中恢復(fù)。因?yàn)楫?dāng)劇本遇到錯(cuò)誤時(shí),它將停止運(yùn)行。
在測試我的第一個(gè)劇本時(shí),我犯了很多錯(cuò)誤并改正了它們。假設(shè)我的修正正確,那么劇本每次運(yùn)行,都會跳過那些狀態(tài)已與指定狀態(tài)匹配的任務(wù),執(zhí)行不匹配狀態(tài)的任務(wù)。當(dāng)我的修復(fù)程序起作用時(shí),之前失敗的任務(wù)就會成功完成,并且會執(zhí)行此任務(wù)之后的任務(wù) —— 直到遇到另一個(gè)錯(cuò)誤。
這使得測試變得容易。我可以添加新任務(wù),并且在運(yùn)行劇本時(shí),只有新任務(wù)會被執(zhí)行,因?yàn)樗鼈兪俏ㄒ慌c測試主機(jī)期望狀態(tài)不匹配的任務(wù)。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“如何使用Ansible”這篇文章對大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
本文名稱:如何使用Ansible
本文鏈接:http://muchs.cn/article32/ipigpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、做網(wǎng)站、自適應(yīng)網(wǎng)站、企業(yè)網(wǎng)站制作、網(wǎng)站收錄、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)