在這個系列的第一篇中,學習一下管理筆記型電腦和桌上型電腦設定的基礎內容。
設定管理是伺服器管理和 DevOps 的一個非常重要的方面。“基礎架構即程式碼”方法可以輕鬆地以各種設定部署伺服器,並動態擴充套件組織的資源以滿足使用者需求。但是,對於希望自動設定自己的筆記型電腦和桌上型電腦(工作站)的個人管理員的關注較少。
在本系列中,我將向你展示如何通過 Ansible 自動化你的工作站設定,如果你想要或需要重新安裝你的機器,這可以讓你輕鬆恢復整個設定。此外,如果你有多個工作站,則可以使用相同的方法在每個工作站上進行相同的設定。在第一篇文章中,我們將為個人或工作計算機設定基本的設定管理,並為本系列的其餘部分奠定基礎。到本文結束時,你將會因此得到一個可以工作的環境。本系列之後的每篇文章都會自動化更多內容並增加複雜性。
有許多設定管理解決方案,包括 Salt Stack、Chef 和 Puppet。我更喜歡 Ansible,因為它在資源利用方面更輕量級,語法更容易閱讀,並且如果正確使用它可以徹底改變你的設定管理。Ansible 的輕量級特性與這個主題特別相關,因為我們可能不希望執行一整台伺服器而只是為了自動化我們的筆記型電腦和桌上型電腦的設定。一般我們總是想要快一些;我們可以使用某些東西來快速啟動和執行,以在我們需要恢復的工作站或在多台機器之間同步我們的設定。我使用 Ansible 的具體方法(我將在本文中演示)非常適用於此,而不需要維護伺服器。你只需下載設定並執行它。
通常,Ansible 執行於中央伺服器。它使用一個庫存清單檔案,該檔案是一個文字檔案,其中包含我們希望 Ansible 管理的所有主機及其 IP 地址或域名的列表。這對於靜態環境非常有用,但對於工作站來說並不理想。原因是我們真的不知道我們的工作站在某一時刻的狀態。也許我關閉了台式電腦,或者筆記型電腦可能會被掛起並放在我的包裡。在任何一種情況下,Ansible 伺服器都會抱怨,因為如果它們處於離線狀態,Ansible 就無法聯絡到我的機器。我們更需要的是按需方式,我們通過利用 ansible-pull
來實現這一目標。ansible-pull
命令是 Ansible 的一個命令,允許你從 Git 倉庫下載設定並立即應用它。你不需要維護伺服器或庫存清單;你只需執行 ansible-pull
命令,給它一個 Git 倉庫 URL,它將為你完成剩下的工作。
首先,在要管理的計算機上安裝 Ansible。有一個問題是許多發行版都附帶了舊版本的 Ansible。根據經驗,你肯定希望獲得最新版本。Ansible 中經常引入新功能,如果你執行的是舊版本,則你在網上找到的範例語法可能無法正常執行,因為它使用的功能未在你安裝的版本中實現。甚至發布的小版本都有很多新功能。其中一個例子是 dconf
模組,它是從 Ansible 2.4 開始的新功能。如果你嘗試使用使用此模組的語法,除非你使用 2.4 或更新版本,否則會失敗。在 Ubuntu 及其衍生產品中,我們可以使用官方個人包存檔(PPA)輕鬆安裝最新版本的 Ansible。以下命令可以解決這個問題:
sudo apt-get install software-properties-commonsudo apt-add-repository ppa:ansible/ansiblesudo apt-get updatesudo apt-get install ansible
如果你沒有使用 Ubuntu,請參閱 Ansible 的文件 了解如何為你的平台獲取它。
接下來,我們需要一個 Git 倉庫來儲存我們的設定。滿足此要求的最簡單方法是在 GitHub 上建立一個空的倉庫,或者如果有的話,也可以使用自己的 Git 伺服器。為了簡單起見,我假設你正在使用 GitHub,因此如果你正在使用其他倉庫,請相應調整命令。在 GitHub 中建立一個倉庫;你最終會得到一個與此類似的倉庫 URL:
[email protected]:<your_user_name>/ansible.git
將該倉庫克隆到你的本地工作目錄(忽略任何抱怨倉庫為空的訊息):
git clone [email protected]:<your_user_name>/ansible.git
現在我們有了一個可以使用的空倉庫。將你的工作目錄切換到倉庫(例如 cd ./ansible
),並在你喜歡的文字編輯器中建立名為 local.yml
的檔案。將以下設定放在該檔案中:
- hosts: localhost become: true tasks: - name: Install htop apt: name=htop
你剛剛建立的檔案被稱為劇本,安裝 htop
的指令(我任意選擇的一個包作為例子)被稱為動作。劇本本身是一個 YAML 格式的檔案,它是一種易於閱讀的標示語言。對 YAML 的完整講述超出了本文的範圍,但你無需專業理解即可熟練使用 Ansible。該設定易於閱讀;只需檢視此檔案,你就可以輕鬆理解我們正在安裝的 htop
軟體包。要注意一下最後一行的 apt
模組,它只適用於基於 Debian 的系統。如果你使用的是 Red Hat 平台,你可以將其更改為 yum
而不是 apt
,或者如果你正在使用 Fedora,則將其更改為 dnf
。name
行只是提供有關我們任務的資訊,並將顯示在輸出中。因此,你需要確保名稱具有描述性,以便在需要對多個動作進行故障排除時很容易找到。
接下來,讓我們將新檔案提交到我們的倉庫:
git add local.ymlgit commit -m "initial commit"git push origin master
現在我們的新劇本應該出現在我們的 GitHub 上的倉庫中。我們可以使用以下命令應用我們建立的劇本:
sudo ansible-pull -U https://github.com/<your_user_name>/ansible.git
如果執行正確,htop
包應該會安裝在你的系統上。你可能會在開頭附近看到一些警告,抱怨缺少庫存清單檔案。這很好,因為我們沒有使用庫存清單檔案(我們也不需要這樣做)。在輸出結束時,它將概述它做的內容。如果 htop
安裝正確,你應該在輸出的最後一行看到 changed = 1
。
它是如何工作的呢?ansible-pull
命令使用了 -U
選項,它需要一個倉庫 URL。出於安全考慮,我給它提供了倉庫 URL 的 https 版本,因為我不希望任何主機對倉庫具有寫存取許可權(預設情況下 https 是唯讀的)。local.yml
是預設的劇本名稱,因此我們不需要為劇本提供檔名:如果它在倉庫的根目錄中找到名為 local.yml
的劇本,它將自動執行它。接下來,我們在命令前面使用了 sudo
,因為我們正在修改系統。
讓我們繼續為我們的劇本新增更多的包。我將新增兩個包,使它看起來像這樣:
- hosts: localhost become: true tasks: - name: Install htop apt: name=htop - name: Install mc apt: name=mc - name: Install tmux apt: name=tmux
我新增了更多的動作(任務)來安裝另外兩個包,mc
和 tmux
。在此劇本中選擇安裝的哪些軟體包並不重要;我只是隨意挑選這些。你應該安裝你希望所有的系統都具有的軟體包。唯一需要注意的是,在你分發前,你必須知道那個包存在於軟體倉庫中。
在我們提交並應用這個更新的劇本之前,我們應該整理一下它。它可以很好地工作,但(說實話)它看起來有點混亂。讓我們嘗試在一個動作中安裝所有三個包。用下面這個替換你的 local.yml
的內容:
- hosts: localhost become: true tasks: - name: Install packages apt: name={{item}} with_items: - htop - mc - tmux
現在看起來更乾淨、更有效率了。我們使用 with_items
將我們的包列表合併為一個動作。如果我們想要新增其他包,我們只需新增另一個帶有連字元和包名稱的行。可以把 with_items
看做類似於 for
迴圈。我們列出的每個包都將安裝。
將我們的新更改提交回倉庫:
git add local.ymlgit commit -m "added additional packages, cleaned up formatting"git push origin master
現在我們可以執行我們的劇本以接受新的新設定:
sudo ansible-pull -U https://github.com/<your_user_name>/ansible.git
不可否認,這個例子還沒有做多少事情;它所做的就是安裝一些軟體包。你可以使用包管理器更快地安裝這些包。然而,隨著這個系列的繼續,這些例子將變得更加複雜,我們將自動化更多的東西。最後,你建立的 Ansible 設定將自動執行越來越多的任務。例如,我自己使用的那個設定可以自動安裝數百個軟體包、設定cron 作業、處理桌面設定等等。
從我們迄今為止所取得的成就來看,你可能已經有了大概了解。我們所要做的就是建立一個倉庫,在該倉庫中放置一個劇本,然後利用 ansible-pull
命令拉取該倉庫並將其應用到我們的機器上。我們不需要設定伺服器。將來,如果我們想要更改設定,我們可以拉取該倉庫、更新它,然後將其推回到我們的倉庫並應用它。如果我們要設定新機器,我們只需要安裝 Ansible 並應用設定。
在下一篇文章中,我們將通過 cron 和一些其他專案進一步自動化。與此同時,我已將本文的程式碼複製到 我的 GitHub 倉庫 中,以便你可以用你的語法對比一下我的。隨著我們的進展,我會不斷更新程式碼。