成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用 Ansible 的第一天

運(yùn)維 系統(tǒng)運(yùn)維
一名系統(tǒng)管理員分享了如何使用 Ansible 在網(wǎng)絡(luò)中配置計(jì)算機(jī)并把其帶入實(shí)際工作的信息和建議。

[[380384]]

一名系統(tǒng)管理員分享了如何使用 Ansible 在網(wǎng)絡(luò)中配置計(jì)算機(jī)并把其帶入實(shí)際工作的信息和建議。

無論是第一次還是第五十次,啟動(dòng)并運(yùn)行一臺(tái)新的物理或虛擬計(jì)算機(jī)都非常耗時(shí),而且需要大量的工作。多年來,我一直使用我創(chuàng)建的一系列腳本和 RPM 來安裝所需的軟件包,并為我喜歡的工具配置各種選項(xiàng)。這種方法效果很好,簡(jiǎn)化了我的工作,而且還減少了在鍵盤上輸入命令的時(shí)間。

我一直在尋找更好的工作方式。近幾年來,我一直在聽到并且讀到有關(guān) Ansible 的信息,它是一個(gè)自動(dòng)配置和管理系統(tǒng)的強(qiáng)大工具。Ansible 允許系統(tǒng)管理員在一個(gè)或多個(gè)劇本playbook中為每個(gè)主機(jī)指定一個(gè)特定狀態(tài),然后執(zhí)行各種必要的任務(wù),使主機(jī)進(jìn)入該狀態(tài)。這包括安裝或刪除各種資源,例如 RPM 或 Apt 軟件包、配置文件和其它文件、用戶、組等等。

因?yàn)橐恍┈嵤拢彝七t了很長(zhǎng)一段時(shí)間學(xué)習(xí)如何使用它。直到最近,我遇到了一個(gè)我認(rèn)為 Ansible 可以輕松解決的問題。

這篇文章并不會(huì)完整地告訴你如何入門 Ansible,相反,它只是對(duì)我遇到的問題和我在一些隱秘的地方發(fā)現(xiàn)的信息的做了一些記錄。我在各種在線討論和問答小組中找到的有關(guān) Ansible 的許多信息都是錯(cuò)誤的。錯(cuò)誤范圍包括明顯的老舊信息(沒有任何日期或來源的跡象),還有一些是完全錯(cuò)誤的信息。

本文所介紹的內(nèi)容是有用的,盡管可能還有其它方法可以完成相同的事情,但我使用的是 Ansible 2.9.13 和 Python 3.8.5。

我的問題

我所有的最佳學(xué)習(xí)經(jīng)歷都始于我需要解決的問題,這次也不例外。

我一直在做一個(gè)小項(xiàng)目,修改 Midnight Commander 文件管理器的配置文件,并將它們推送到我網(wǎng)絡(luò)上的各種系統(tǒng)中進(jìn)行測(cè)試。盡管我有一個(gè)腳本可以自動(dòng)執(zhí)行這個(gè)操作,但它仍然需要使用命令行循環(huán)來提供我想要推送新代碼的系統(tǒng)名稱。我對(duì)配置文件進(jìn)行了大量的更改,這使我必須頻繁推送新的配置文件。但是,就在我以為我的新配置剛剛好時(shí),我發(fā)現(xiàn)了一個(gè)問題,所以我需要在修復(fù)后再進(jìn)行一次推送。

這種環(huán)境使得很難跟蹤哪些系統(tǒng)有新文件,哪些沒有。我還有幾個(gè)主機(jī)需要區(qū)別對(duì)待。我對(duì) Ansible 的一點(diǎn)了解表明,它可能能夠滿足我的全部或大部分工作。

開始

我讀過許多有關(guān) Ansible 的好文章和書籍,但從來沒有在“我必須現(xiàn)在就把這個(gè)做好!”的情況下讀過。而現(xiàn)在 —— 好吧,就是現(xiàn)在!

在重讀這些文檔時(shí),我發(fā)現(xiàn)它們主要是在討論如何從 GitHub 開始安裝并使用 Ansible,這很酷。但是我真的只是想盡快開始,所以我使用 DNF 和 Fedora 倉(cāng)庫(kù)中的版本在我的 Fedora 工作站上安裝了它,非常簡(jiǎn)單。

但是后來我開始尋找文件位置,并嘗試確定需要修改哪些配置文件、將我的劇本保存在什么位置,甚至一個(gè)劇本怎么寫以及它的作用,我腦海中有一大堆(到目前為止)懸而未決的問題。

因此,不不需要進(jìn)一步描述我的困難的情況下,以下是我發(fā)現(xiàn)的東西以及促使我繼續(xù)前進(jìn)的東西。

配置

Ansible 的配置文件保存在 /etc/ansible 中,這很有道理,因?yàn)?nbsp;/etc/ 是系統(tǒng)程序應(yīng)該保存配置文件的地方。我需要使用的兩個(gè)文件是 ansible.cfg 和 hosts

ansible.cfg

在進(jìn)行了從文檔和線上找到的一些實(shí)踐練習(xí)之后,我遇到了一些有關(guān)棄用某些較舊的 Python 文件的警告信息。因此,我在 ansible.cfg 中將 deprecation_warnings 設(shè)置為 false,這樣那些憤怒的紅色警告消息就不會(huì)出現(xiàn)了:

  1. deprecation_warnings = False

這些警告很重要,所以我稍后將重新回顧它們,并弄清楚我需要做什么。但是現(xiàn)在,它們不會(huì)再擾亂屏幕,也不會(huì)讓我混淆實(shí)際上需要關(guān)注的錯(cuò)誤。

hosts 文件

與 /etc/hosts 文件不同,hosts 文件也被稱為清單inventory文件,它列出了網(wǎng)絡(luò)上的主機(jī)。此文件允許將主機(jī)分組到相關(guān)集合中,例如“servers”、“workstations”和任何你所需的名稱。這個(gè)文件包含幫助和大量示例,所以我在這里就不詳細(xì)介紹了。但是,有些事情你必須知道。

主機(jī)也可以列在組之外,但是組對(duì)于識(shí)別具有一個(gè)或多個(gè)共同特征的主機(jī)很有幫助。組使用 INI 格式,所以服務(wù)器組看起來像這樣:

  1. [servers]
  2. server1
  3. server2
  4. ......

這個(gè)文件中必須有一個(gè)主機(jī)名,這樣 Ansible 才能對(duì)它進(jìn)行操作。即使有些子命令允許指定主機(jī)名,但除非主機(jī)名在 hosts 文件中,否則命令會(huì)失敗。一個(gè)主機(jī)也可以放在多個(gè)組中。因此,除了 [servers] 組之外,server1 也可能是 [webservers] 組的成員,還可以是 [ubuntu] 組的成員,這樣以區(qū)別于 Fedora 服務(wù)器。

Ansible 很智能。如果 all 參數(shù)用作主機(jī)名,Ansible 會(huì)掃描 hosts 文件并在它列出的所有主機(jī)上執(zhí)行定義的任務(wù)。Ansible 只會(huì)嘗試在每個(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 或 h1 或 myhost。如果你在 hosts 文件中為同一主機(jī)指定多個(gè)主機(jī)名,則 Ansible 將嘗試在所有這些主機(jī)名上執(zhí)行其任務(wù),它無法知道它們指向同一主機(jī)。好消息是,這并不會(huì)影響整體結(jié)果;它只是多花了一點(diǎn)時(shí)間,因?yàn)?Ansible 會(huì)在次要主機(jī)名上工作,它會(huì)確定所有操作均已執(zhí)行。

Ansible 實(shí)情

我閱讀過 Ansible 的大多數(shù)材料都談到了 Ansible 實(shí)情facts,它是與遠(yuǎn)程系統(tǒng)相關(guān)的數(shù)據(jù),包括操作系統(tǒng)、IP 地址、文件系統(tǒng)等等。這些信息可以通過其它方式獲得,如 lshwdmidecode 或 /proc 文件系統(tǒng)等。但是 Ansible 會(huì)生成一個(gè)包含此信息的 JSON 文件。每次 Ansible 運(yùn)行時(shí),它都會(huì)生成這些實(shí)情數(shù)據(jù)。在這個(gè)數(shù)據(jù)流中,有大量的信息,都是以鍵值對(duì)形式出現(xiàn)的:<"variable-name": "value">。所有這些變量都可以在 Ansible 劇本中使用,理解大量可用信息的最好方法是實(shí)際顯示一下:

  1. # ansible -m setup <hostname> | less

明白了嗎?你想知道的有關(guān)主機(jī)硬件和 Linux 發(fā)行版的所有內(nèi)容都在這里,它們都可以在劇本中使用。我還沒有達(dá)到需要使用這些變量的地步,但是我相信在接下來的幾天中會(huì)用到。

模塊

上面的 ansible 命令使用 -m 選項(xiàng)來指定 setup 模塊。Ansible 已經(jīng)內(nèi)置了許多模塊,所以你對(duì)這些模塊不需要使用 -m。也可以安裝許多下載的模塊,但是內(nèi)置模塊可以完成我目前項(xiàng)目所需的一切。

劇本

劇本playbook幾乎可以放在任何地方。因?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è)劇本示例:

  1. ################################################################################
  2. # This Ansible playbook updates Midnight commander configuration files.        #
  3. ################################################################################
  4. - name: Update midnight commander configuration files
  5.   hosts: all
  6.  
  7.   tasks:
  8.   - name: ensure midnight commander is the latest version
  9.     dnf:
  10.       name: mc
  11.       state: present
  12.  
  13.   - name: create ~/.config/mc directory for root
  14.     file:
  15.       path: /root/.config/mc
  16.       state: directory
  17.       mode: 0755
  18.       owner: root
  19.       group: root
  20.  
  21.   - name: create ~/.config/mc directory for dboth
  22.     file:
  23.       path: /home/dboth/.config/mc
  24.       state: directory
  25.       mode: 0755
  26.       owner: dboth
  27.       group: dboth
  28.  
  29.   - name: copy latest personal skin
  30.     copy:
  31.       src: /root/ansible/UpdateMC/files/MidnightCommander/DavidsGoTar.ini
  32.       dest: /usr/share/mc/skins/DavidsGoTar.ini
  33.       mode: 0644
  34.       owner: root
  35.       group: root
  36.  
  37.   - name: copy latest mc ini file
  38.     copy:
  39.       src: /root/ansible/UpdateMC/files/MidnightCommander/ini
  40.       dest: /root/.config/mc/ini
  41.       mode: 0644
  42.       owner: root
  43.       group: root
  44.  
  45.   - name: copy latest mc panels.ini file
  46.     copy:
  47.       src: /root/ansible/UpdateMC/files/MidnightCommander/panels.ini
  48.       dest: /root/.config/mc/panels.ini
  49.       mode: 0644
  50.       owner: root
  51.       group: root
  52. <截?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é)超出了本文的范圍,但是我對(duì)這個(gè)問題使用了一點(diǎn)蠻力。還有其它方法可以確定哪些用戶需要更新文件,而不是對(duì)每個(gè)用戶的每個(gè)文件使用一個(gè)任務(wù)。我的下一個(gè)目標(biāo)是簡(jiǎn)化這個(gè)劇本,使用一些更先進(jìn)的技術(shù)。

運(yùn)行劇本很容易,只需要使用 ansible-playbook 命令。.yml 擴(kuò)展名代表 YAML,我看到過它的幾種不同含義,但我認(rèn)為它是“另一種標(biāo)記語言Yet Another Markup Language”,盡管有些人聲稱 YAML 不是這種語言。

這個(gè)命令將會(huì)運(yùn)行劇本,它會(huì)更新 Midnight Commander 文件:

  1. # ansible-playbook -f 10 UpdateMC.yml

-f 選項(xiàng)指定 Ansible 使用 10 個(gè)線程來執(zhí)行操作。這可以大大加快整個(gè)任務(wù)的完成速度,特別是在多臺(tái)主機(jī)上工作時(shí)。

輸出

劇本運(yùn)行時(shí)會(huì)列出每個(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 行會(huì)以彩色顯示。我的終端配色為“amber-on-black”,TASK 行顯示為琥珀色,changed 是棕色,ok 為綠色,錯(cuò)誤是紅色。

下面的輸出是我最終用于在新主機(jī)執(zhí)行安裝后配置的劇本:

  1. PLAY [Post-installation updates, package installation, and configuration]
  2.  
  3. TASK [Gathering Facts]
  4. ok: [testvm2]
  5.  
  6. TASK [Ensure we have connectivity]
  7. ok: [testvm2]
  8.  
  9. TASK [Install all current updates]
  10. changed: [testvm2]
  11.  
  12. TASK [Install a few command line tools]
  13. changed: [testvm2]
  14.  
  15. TASK [copy latest personal Midnight Commander skin to /usr/share]
  16. changed: [testvm2]
  17.  
  18. TASK [create ~/.config/mc directory for root]
  19. changed: [testvm2]
  20.  
  21. TASK [Copy the most current Midnight Commander configuration files to /root/.config/mc]
  22. changed: [testvm2] =&gt; (item=/root/ansible/PostInstallMain/files/MidnightCommander/DavidsGoTar.ini)
  23. changed: [testvm2] =&gt; (item=/root/ansible/PostInstallMain/files/MidnightCommander/ini)
  24. changed: [testvm2] =&gt; (item=/root/ansible/PostInstallMain/files/MidnightCommander/panels.ini)
  25.  
  26. TASK [create ~/.config/mc directory in /etc/skel]
  27. changed: [testvm2]
  28.  
  29. <截?cái)?gt;

cowsay

如果你的計(jì)算機(jī)上安裝了 cowsay 程序,你會(huì)發(fā)現(xiàn) TASK 的名字出現(xiàn)在奶牛的語音泡泡中:

  1.  ____________________________________
  2. < TASK [Ensure we have connectivity] >
  3.  ------------------------------------
  4.         \   ^__^
  5.          \  (oo)\\_______
  6.             (__)\       )\/\
  7.                 ||----w |
  8.                 ||     ||

如果你沒有這個(gè)有趣的程序,你可以使用發(fā)行版的包管理器安裝 Cowsay 程序。如果你有這個(gè)程序但不想要它,可以通過在 /etc/ansible/ansible.cfg 文件中設(shè)置 nocows=1 將其禁用。

我喜歡這頭奶牛,它很有趣,但是它會(huì)占用我的一部分屏幕。因此,在它開始妨礙我使用時(shí),我就把它禁用了。

目錄

與我的 Midnight Commander 任務(wù)一樣,經(jīng)常需要安裝和維護(hù)各種類型的文件。創(chuàng)建用于存儲(chǔ)劇本的目錄樹的“最佳實(shí)踐”和系統(tǒng)管理員一樣多,至少與編寫有關(guān) Ansible 書和文章的作者數(shù)量一樣多。

我選擇了一個(gè)對(duì)我有意義的簡(jiǎn)單結(jié)構(gòu):

/root/ansible
└── UpdateMC
    ├── files
    │   └── MidnightCommander
    │       ├── DavidsGoTar.ini
    │       ├── ini
    │       └── panels.ini
    └── UpdateMC.yml

你可以使用任何結(jié)構(gòu)。但是請(qǐng)注意,其它系統(tǒng)管理員可能需要使用你設(shè)置的劇本來工作,所以目錄應(yīng)該具有一定程度的邏輯。當(dāng)我使用 RPM 和 Bash 腳本執(zhí)行安裝任務(wù)后,我的文件倉(cāng)庫(kù)有點(diǎn)分散,絕對(duì)沒有任何邏輯結(jié)構(gòu)。當(dāng)我為許多管理任務(wù)創(chuàng)建劇本時(shí),我將介紹一個(gè)更有邏輯的結(jié)構(gòu)來管理我的目錄。

多次運(yùn)行劇本

根據(jù)需要或期望多次運(yùn)行劇本是安全的。只有當(dāng)主機(jī)狀態(tài)與任務(wù)中指定的狀態(tài)不匹配時(shí),才會(huì)執(zhí)行每個(gè)任務(wù)。這使得很容易從先前的劇本運(yùn)行中遇到的錯(cuò)誤中恢復(fù)。因?yàn)楫?dāng)劇本遇到錯(cuò)誤時(shí),它將停止運(yùn)行。

在測(cè)試我的第一個(gè)劇本時(shí),我犯了很多錯(cuò)誤并改正了它們。假設(shè)我的修正正確,那么劇本每次運(yùn)行,都會(huì)跳過那些狀態(tài)已與指定狀態(tài)匹配的任務(wù),執(zhí)行不匹配狀態(tài)的任務(wù)。當(dāng)我的修復(fù)程序起作用時(shí),之前失敗的任務(wù)就會(huì)成功完成,并且會(huì)執(zhí)行此任務(wù)之后的任務(wù) —— 直到遇到另一個(gè)錯(cuò)誤。

這使得測(cè)試變得容易。我可以添加新任務(wù),并且在運(yùn)行劇本時(shí),只有新任務(wù)會(huì)被執(zhí)行,因?yàn)樗鼈兪俏ㄒ慌c測(cè)試主機(jī)期望狀態(tài)不匹配的任務(wù)。

一些思考

有些任務(wù)不適合用 Ansible,因?yàn)橛懈玫姆椒梢詫?shí)現(xiàn)特定的計(jì)算機(jī)狀態(tài)。我想到的場(chǎng)景是使 VM 返回到初始狀態(tài),以便可以多次使用它來執(zhí)行從已知狀態(tài)開始的測(cè)試。讓 VM 進(jìn)入特定狀態(tài),然后對(duì)此時(shí)的計(jì)算機(jī)狀態(tài)進(jìn)行快照要容易得多。還原到該快照與 Ansible 將主機(jī)返回到之前狀態(tài)相比,通常還原到快照通常會(huì)更容易且更快。在研究文章或測(cè)試新代碼時(shí),我每天都會(huì)做幾次這樣的事情。

在完成用于更新 Midnight Commander 的劇本之后,我創(chuàng)建了一個(gè)新的劇本,用于在新安裝的 Fedora 主機(jī)上執(zhí)行安裝任務(wù)。我已經(jīng)取得了不錯(cuò)的進(jìn)步,劇本比我第一個(gè)的更加復(fù)雜,但沒有那么粗暴。

在使用 Ansible 的第一天,我創(chuàng)建了一個(gè)解決問題的劇本,我還開始編寫第二個(gè)劇本,它將解決安裝后配置的大問題,在這個(gè)過程中我學(xué)到了很多東西。

盡管我真的很喜歡使用 Bash 腳本來管理任務(wù),但是我發(fā)現(xiàn) Ansible 可以完成我想要的一切,并且可以使系統(tǒng)保持在我所需的狀態(tài)。只用了一天,我就成為了 Ansible 的粉絲。 

責(zé)任編輯:龐桂玉 來源: Linux中國(guó)
相關(guān)推薦

2012-08-10 22:44:52

ArchSummit

2015-07-31 10:01:55

win10使用總結(jié)

2021-05-17 08:11:44

MySQL數(shù)據(jù)庫(kù)索引

2010-06-02 17:23:10

JavaJazoon

2012-06-25 11:27:43

2025-05-28 01:45:00

2014-08-11 13:10:48

2013-08-02 17:19:21

2023-01-01 13:17:00

ChatGPTAI

2014-08-04 10:58:06

OpenstackRDOOpenstack搭建

2020-02-20 17:16:55

遠(yuǎn)程辦公

2021-03-29 08:20:51

入職后端官場(chǎng)

2019-02-14 10:04:34

程序員離職技術(shù)

2020-02-04 11:22:47

云計(jì)算行業(yè)辦公

2020-05-08 15:23:01

戴爾

2015-08-06 11:34:25

2020-02-04 09:15:32

云計(jì)算

2020-02-03 13:30:54

釘釘企業(yè)微信移動(dòng)應(yīng)用

2022-01-05 10:16:12

微軟Exchange惡意軟件

2011-07-07 09:27:27

手機(jī)游戲
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 青草视频在线 | 亚洲精品成人网 | 成人二区| 午夜亚洲 | 国产成人一区二区三区精 | 国产一二区视频 | 一区二区精品视频 | 亚洲成人999 | 欧美国产日韩在线观看 | 日韩三级一区 | 成人一区二区三区 | 在线午夜 | 久久不射电影网 | aaa综合国产 | 91久久夜色 | 在线观看亚洲专区 | 国产精品资源在线 | 中文字幕一区二区三区四区五区 | 羞羞视频免费观 | 成人h视频在线 | 国产成人综合在线 | 成人午夜免费视频 | 国产高清亚洲 | 亚洲视频在线观看一区二区三区 | 欧美精品一区二区三区四区五区 | 日韩av美女电影 | 亚洲国产精品日本 | 国产精品久久久久久福利一牛影视 | 在线观看国产精品一区二区 | 久久久久久久国产 | 久久99精品久久久久久 | 日本大香伊一区二区三区 | 亚洲a一区二区 | 欧美日韩精品在线一区 | 四虎精品在线 | 欧美黑人又粗大 | 一级高清视频 | 亚洲男人天堂 | 超碰精品在线 | 午夜国产羞羞视频免费网站 | 国产日韩电影 |