如何使用Ansible管理你的工作站配置
在這個(gè)系列的***篇中,學(xué)習(xí)一下管理筆記本電腦和臺(tái)式機(jī)配置的基礎(chǔ)內(nèi)容。
配置管理是服務(wù)器管理和 DevOps 的一個(gè)非常重要的方面。“基礎(chǔ)架構(gòu)即代碼”方法可以輕松地以各種配置部署服務(wù)器,并動(dòng)態(tài)擴(kuò)展組織的資源以滿足用戶需求。但是,對(duì)于希望自動(dòng)設(shè)置自己的筆記本電腦和臺(tái)式機(jī)(工作站)的個(gè)人管理員的關(guān)注較少。
在本系列中,我將向你展示如何通過 Ansible 自動(dòng)化你的工作站設(shè)置,如果你想要或需要重新安裝你的機(jī)器,這可以讓你輕松恢復(fù)整個(gè)配置。此外,如果你有多個(gè)工作站,則可以使用相同的方法在每個(gè)工作站上進(jìn)行相同的配置。在***篇文章中,我們將為個(gè)人或工作計(jì)算機(jī)設(shè)置基本的配置管理,并為本系列的其余部分奠定基礎(chǔ)。到本文結(jié)束時(shí),你將會(huì)因此得到一個(gè)可以工作的環(huán)境。本系列之后的每篇文章都會(huì)自動(dòng)化更多內(nèi)容并增加復(fù)雜性。
為什么用 Ansible?
有許多配置管理解決方案,包括 Salt Stack、Chef 和 Puppet。我更喜歡 Ansible,因?yàn)樗谫Y源利用方面更輕量級(jí),語(yǔ)法更容易閱讀,并且如果正確使用它可以徹底改變你的配置管理。Ansible 的輕量級(jí)特性與這個(gè)主題特別相關(guān),因?yàn)槲覀兛赡懿幌M\(yùn)行一整臺(tái)服務(wù)器而只是為了自動(dòng)化我們的筆記本電腦和臺(tái)式機(jī)的設(shè)置。一般我們總是想要快一些;我們可以使用某些東西來快速啟動(dòng)和運(yùn)行,以在我們需要恢復(fù)的工作站或在多臺(tái)機(jī)器之間同步我們的配置。我使用 Ansible 的具體方法(我將在本文中演示)非常適用于此,而不需要維護(hù)服務(wù)器。你只需下載配置并運(yùn)行它。
我的方法
通常,Ansible 運(yùn)行于中央服務(wù)器。它使用一個(gè)庫(kù)存清單文件,該文件是一個(gè)文本文件,其中包含我們希望 Ansible 管理的所有主機(jī)及其 IP 地址或域名的列表。這對(duì)于靜態(tài)環(huán)境非常有用,但對(duì)于工作站來說并不理想。原因是我們真的不知道我們的工作站在某一時(shí)刻的狀態(tài)。也許我關(guān)閉了臺(tái)式電腦,或者筆記本電腦可能會(huì)被掛起并放在我的包里。在任何一種情況下,Ansible 服務(wù)器都會(huì)抱怨,因?yàn)槿绻鼈兲幱诿摍C(jī)狀態(tài),Ansible 就無法聯(lián)系到我的機(jī)器。我們更需要的是按需方式,我們通過利用 ansible-pull
來實(shí)現(xiàn)這一目標(biāo)。ansible-pull
命令是 Ansible 的一個(gè)命令,允許你從 Git 倉(cāng)庫(kù)下載配置并立即應(yīng)用它。你不需要維護(hù)服務(wù)器或庫(kù)存清單;你只需運(yùn)行 ansible-pull
命令,給它一個(gè) Git 倉(cāng)庫(kù) URL,它將為你完成剩下的工作。
起步
首先,在要管理的計(jì)算機(jī)上安裝 Ansible。有一個(gè)問題是許多發(fā)行版都附帶了舊版本的 Ansible。根據(jù)經(jīng)驗(yàn),你肯定希望獲得***版本。Ansible 中經(jīng)常引入新功能,如果你運(yùn)行的是舊版本,則你在網(wǎng)上找到的示例語(yǔ)法可能無法正常運(yùn)行,因?yàn)樗褂玫墓δ芪丛谀惆惭b的版本中實(shí)現(xiàn)。甚至發(fā)布的小版本都有很多新功能。其中一個(gè)例子是 dconf
模塊,它是從 Ansible 2.4 開始的新功能。如果你嘗試使用使用此模塊的語(yǔ)法,除非你使用 2.4 或更新版本,否則會(huì)失敗。在 Ubuntu 及其衍生產(chǎn)品中,我們可以使用官方個(gè)人包存檔(PPA)輕松安裝***版本的 Ansible。以下命令可以解決這個(gè)問題:
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible
如果你沒有使用 Ubuntu,請(qǐng)參閱 Ansible 的文檔 了解如何為你的平臺(tái)獲取它。
接下來,我們需要一個(gè) Git 倉(cāng)庫(kù)來保存我們的配置。滿足此要求的最簡(jiǎn)單方法是在 GitHub 上創(chuàng)建一個(gè)空的倉(cāng)庫(kù),或者如果有的話,也可以使用自己的 Git 服務(wù)器。為了簡(jiǎn)單起見,我假設(shè)你正在使用 GitHub,因此如果你正在使用其他倉(cāng)庫(kù),請(qǐng)相應(yīng)調(diào)整命令。在 GitHub 中創(chuàng)建一個(gè)倉(cāng)庫(kù);你最終會(huì)得到一個(gè)與此類似的倉(cāng)庫(kù) URL:
git@github.com:<your_user_name>/ansible.git
將該倉(cāng)庫(kù)克隆到你的本地工作目錄(忽略任何抱怨倉(cāng)庫(kù)為空的消息):
git clone git@github.com:<your_user_name>/ansible.git
現(xiàn)在我們有了一個(gè)可以使用的空倉(cāng)庫(kù)。將你的工作目錄切換到倉(cāng)庫(kù)(例如 cd ./ansible
),并在你喜歡的文本編輯器中創(chuàng)建名為 local.yml
的文件。將以下配置放在該文件中:
- hosts: localhost
become: true
tasks:
- name: Install htop
apt: name=htop
你剛剛創(chuàng)建的文件被稱為劇本,安裝 htop
的指令(我任意選擇的一個(gè)包作為例子)被稱為動(dòng)作。劇本本身是一個(gè) YAML 格式的文件,它是一種易于閱讀的標(biāo)記語(yǔ)言。對(duì) YAML 的完整講述超出了本文的范圍,但你無需專業(yè)理解即可熟練使用 Ansible。該配置易于閱讀;只需查看此文件,你就可以輕松理解我們正在安裝的 htop
軟件包。要注意一下***一行的 apt
模塊,它只適用于基于 Debian 的系統(tǒng)。如果你使用的是 Red Hat 平臺(tái),你可以將其更改為 yum
而不是 apt
,或者如果你正在使用 Fedora,則將其更改為 dnf
。name
行只是提供有關(guān)我們?nèi)蝿?wù)的信息,并將顯示在輸出中。因此,你需要確保名稱具有描述性,以便在需要對(duì)多個(gè)動(dòng)作進(jìn)行故障排除時(shí)很容易找到。
接下來,讓我們將新文件提交到我們的倉(cāng)庫(kù):
git add local.yml
git commit -m "initial commit"
git push origin master
現(xiàn)在我們的新劇本應(yīng)該出現(xiàn)在我們的 GitHub 上的倉(cāng)庫(kù)中。我們可以使用以下命令應(yīng)用我們創(chuàng)建的劇本:
sudo ansible-pull -U https://github.com/<your_user_name>/ansible.git
如果執(zhí)行正確,htop
包應(yīng)該會(huì)安裝在你的系統(tǒng)上。你可能會(huì)在開頭附近看到一些警告,抱怨缺少庫(kù)存清單文件。這很好,因?yàn)槲覀儧]有使用庫(kù)存清單文件(我們也不需要這樣做)。在輸出結(jié)束時(shí),它將概述它做的內(nèi)容。如果 htop
安裝正確,你應(yīng)該在輸出的***一行看到 changed = 1
。
它是如何工作的呢?ansible-pull
命令使用了 -U
選項(xiàng),它需要一個(gè)倉(cāng)庫(kù) URL。出于安全考慮,我給它提供了倉(cāng)庫(kù) URL 的 https 版本,因?yàn)槲也幌M魏沃鳈C(jī)對(duì)倉(cāng)庫(kù)具有寫訪問權(quán)限(默認(rèn)情況下 https 是只讀的)。local.yml
是預(yù)設(shè)的劇本名稱,因此我們不需要為劇本提供文件名:如果它在倉(cāng)庫(kù)的根目錄中找到名為 local.yml
的劇本,它將自動(dòng)運(yùn)行它。接下來,我們?cè)诿钋懊媸褂昧?sudo
,因?yàn)槲覀冋谛薷南到y(tǒng)。
讓我們繼續(xù)為我們的劇本添加更多的包。我將添加兩個(gè)包,使它看起來像這樣:
- hosts: localhost
become: true
tasks:
- name: Install htop
apt: name=htop
- name: Install mc
apt: name=mc
- name: Install tmux
apt: name=tmux
我添加了更多的動(dòng)作(任務(wù))來安裝另外兩個(gè)包,mc
和 tmux
。在此劇本中選擇安裝的哪些軟件包并不重要;我只是隨意挑選這些。你應(yīng)該安裝你希望所有的系統(tǒng)都具有的軟件包。唯一需要注意的是,在你分發(fā)前,你必須知道那個(gè)包存在于軟件倉(cāng)庫(kù)中。
在我們提交并應(yīng)用這個(gè)更新的劇本之前,我們應(yīng)該整理一下它。它可以很好地工作,但(說實(shí)話)它看起來有點(diǎn)混亂。讓我們嘗試在一個(gè)動(dòng)作中安裝所有三個(gè)包。用下面這個(gè)替換你的 local.yml
的內(nèi)容:
- hosts: localhost
become: true
tasks:
- name: Install packages
apt: name={{item}}
with_items:
- htop
- mc
- tmux
現(xiàn)在看起來更干凈、更有效率了。我們使用 with_items
將我們的包列表合并為一個(gè)動(dòng)作。如果我們想要添加其他包,我們只需添加另一個(gè)帶有連字符和包名稱的行。可以把 with_items
看做類似于 for
循環(huán)。我們列出的每個(gè)包都將安裝。
將我們的新更改提交回倉(cāng)庫(kù):
git add local.yml
git commit -m "added additional packages, cleaned up formatting"
git push origin master
現(xiàn)在我們可以運(yùn)行我們的劇本以接受新的新配置:
sudo ansible-pull -U https://github.com/<your_user_name>/ansible.git
不可否認(rèn),這個(gè)例子還沒有做多少事情;它所做的就是安裝一些軟件包。你可以使用包管理器更快地安裝這些包。然而,隨著這個(gè)系列的繼續(xù),這些例子將變得更加復(fù)雜,我們將自動(dòng)化更多的東西。***,你創(chuàng)建的 Ansible 配置將自動(dòng)執(zhí)行越來越多的任務(wù)。例如,我自己使用的那個(gè)配置可以自動(dòng)安裝數(shù)百個(gè)軟件包、設(shè)置cron 作業(yè)、處理桌面配置等等。
從我們迄今為止所取得的成就來看,你可能已經(jīng)有了大概了解。我們所要做的就是創(chuàng)建一個(gè)倉(cāng)庫(kù),在該倉(cāng)庫(kù)中放置一個(gè)劇本,然后利用 ansible-pull
命令拉取該倉(cāng)庫(kù)并將其應(yīng)用到我們的機(jī)器上。我們不需要設(shè)置服務(wù)器。將來,如果我們想要更改配置,我們可以拉取該倉(cāng)庫(kù)、更新它,然后將其推回到我們的倉(cāng)庫(kù)并應(yīng)用它。如果我們要設(shè)置新機(jī)器,我們只需要安裝 Ansible 并應(yīng)用配置。
在下一篇文章中,我們將通過 cron 和一些其他項(xiàng)目進(jìn)一步自動(dòng)化。與此同時(shí),我已將本文的代碼復(fù)制到 我的 GitHub 倉(cāng)庫(kù) 中,以便你可以用你的語(yǔ)法對(duì)比一下我的。隨著我們的進(jìn)展,我會(huì)不斷更新代碼。