1. 程式人生 > 實用技巧 >ansible筆記(1):ansible的基本概念

ansible筆記(1):ansible的基本概念

一些基礎概念

ansible是什麼?

它是一個"配置管理工具",它是一個"自動化運維工具",如果你沒有使用過任何配置管理工具,不要害怕,看完這篇文章,你自然會對ansible有所瞭解。

ansible能做什麼?

正如其他配置管理工具一樣,ansible可以幫助我們完成一些批量任務,或者完成一些需要經常重複的工作。

  • 比如:同時在100臺伺服器上安裝nginx服務,並在安裝後啟動它們。

  • 比如:將某個檔案一次性拷貝到100臺伺服器上。

  • 比如:每當有新伺服器加入工作環境時,你都要為新伺服器部署redis服務,也就是說你需要經常重複的完成相同的工作。

這些場景中我們都可以使用到ansible。

看到這裡,你可能會說,我編寫一些指令碼,也能夠滿足上面的工作場景,為什麼還要使用ansible呢?沒錯,使用指令碼也可以完成這些工作,不過我還是推薦你使用ansible,因為ansible支援一些優秀的特性,比如"冪等性","冪等性"是什麼意思呢?舉個例子,你想把一個檔案拷貝到目標主機的某個目錄上,但是你不確定此目錄中是否已經存在此檔案,當你使用ansible完成這項任務時,就非常簡單了,因為如果目標主機的對應目錄中已經存在此檔案,那麼ansible則不會進行任何操作,如果目標主機的對應目錄中並不存在此檔案,ansible就會將檔案拷貝到對應目錄中,說白了,ansible是"以結果為導向的",我們指定了一個"目標狀態",ansible會自動判斷,"當前狀態"是否與"目標狀態"一致,如果一致,則不進行任何操作,如果不一致,那麼就將"當前狀態"變成"目標狀態",這就是"冪等性","冪等性"可以保證我們重複的執行同一項操作時,得到的結果是一樣的,這種特性在很多場景中相對於指令碼來說都有一定優勢,單單這樣說,可能並不容易理解,當你在後面真正使用到時,自然會有自己的體會,所以此處不用糾結,繼續向下看。

如果你瞭解過其他的配置管理工具,比如puppet或者saltstack,那麼你一定知道,如果我們想要使用puppet管理100臺主機,就要在這100臺主機上安裝puppet對應的agent(客戶端代理程式),而ansible則不同,ansible只需要依賴ssh即可正常工作,不用在受管主機上安裝agent,也就是說,只要你能通過ssh連線到對應主機,你就可以通過ansible管理對應的主機。

經過上述描述,我想你應該對ansible已經有了一個初步的、大概的印象:

ansible是一個配置管理工具,可以幫助我們完成一些批量工作或者重複性工作,ansible通過ssh管理其他受管主機,並且具有一些特性,比如冪等性、劇本、模板,角色等,我們會慢慢的介紹這些特性以及怎樣使用ansible。

ansible怎麼使用

怎樣使用ansible呢?我們通過一條簡單的命令開始認識它吧,命令如下

注:執行如下命令前,需要進行一些配置,如下命令才能正常執行,後文中會對這些操作進行描述,此處先行略過

ansible 10.1.1.60 -m ping

上述命令表示,使用ansible去ping 10.1.1.60這臺主機,很容易理解吧。

"ping"是ansible中的一個模組,這個模組的作用就是ping對應的主機,ansible呼叫ping模組,就相當於我們手動執行ping命令一樣,上述命令中的"-m ping"表示呼叫ping模組,當然,ansible肯定不止這一個模組,它有很多模組,不同的模組可以幫助我們完成不同的工作,你應該已經猜到了,我們在實際使用時,會使用到各種模組,ansible是基於這些模組完成實際任務的。

剛才,我們使用了一個簡單的ansible命令作為示例,但是如果想要讓上述命令正常執行,則必須同時滿足兩個最基本的條件,如下

  • 條件一、ansible所在的主機可以通過ssh連線到受管主機。

  • 條件二、受管主機的IP地址等資訊已經新增到ansible的"管理清單"中。

之前說過,ansible不用在受管主機上安裝agent,但是它需要依賴ssh,所以,條件一併不難理解,但是,在滿足條件一的情況下,還要同時滿足條件二,也就是說,即使ansible所在的主機能夠通過ssh連線到受管主機,仍然需要將受管主機的IP地址、ssh埠號等資訊新增到一個被稱作為"清單(Inventory)"的配置檔案中,如果對應的主機資訊在ansible的"清單"中不存在,那麼ansible則無法操作對應主機,後文會詳細的介紹怎樣配置ansible的"清單"。

好了,基本概念先了解到這裡,現在需要動動手了。

一些基礎配置

我們首先要做的就是安裝ansible。

但是在安裝之前,先介紹一下我的演示環境。

我有四臺主機,IP地址分別如下

10.1.1.71
10.1.1.70
10.1.1.61
10.1.1.60 

我將主機10.1.1.71(後文中簡稱71)作為配置管理主機,所以我們需要在71上安裝ansible,剩下的主機作為受管主機,主機71和主機70的的作業系統版本為centos7.4,主機61和主機60的作業系統版本為centos6.9。

我使用yum源的方式安裝ansible,因為安裝ansible需要epel源,所以我配置了阿里的epel源和centos7系統映象源,yum源配置如下

# pwd/etc/yum.repos.d # cat aliBase.repo[aliBase]name=aliBasebaseurl=https://mirrors.aliyun.com/centos/releasever/os/basearch/enabled=1gpgcheck=1gpgkey=https://mirrors.aliyun.com/centos/releasever/os/basearch/RPM-GPG-KEY-CentOS-releasever # cat aliEpel.repo[aliEpel]name=aliEpelbaseurl=https://mirrors.aliyun.com/epel/releasever\Server/$basearch/enabled=1gpgcheck=0

yum源配置完成後,安裝ansible

yum install ansible

此時yum源中對應的版本為ansible-2.4.2.0-1

安裝完畢,不過別急,我們還需要做一些其他的基本配置,在介紹ansible的概念時,我們說過,如果想要通過ansible管理某主機,還需要將對應主機的資訊新增到ansible的"配置清單"中,清單中沒有的主機無法通過ansible進行配置管理,現在,我們就來介紹一下ansible的"清單",當安裝完ansible以後,ansible會提供一個預設的"清單",這個清單就是/etc/ansible/hosts,開啟此檔案,你會看到一些配置示例,沒錯,還是熟悉的配方,還是熟悉的味道,此檔案使用的就是INI的配置風格,那麼,我們一起來看看怎樣進行配置吧。

以我們的演示環境為例,我們想要通過ansible主機管理60主機,所以,最直接的方式就是將它的IP地址寫入到/etc/ansible/hosts檔案中,配置如下,在/etc/ansible/hosts檔案底部寫入如下IP

10.1.1.60

就是這麼簡單,那麼,完成上述配置,就能夠通過ansible主機管理10.1.1.60這臺主機了嗎?我們來動手試試,看看會發生什麼情況。

執行之前的示例命令:ansible 10.1.1.60 -m ping

使用ansible去ping主機10.1.1.60,返回結果如下

從命令的返回資訊中可以看到,10.1.1.60不可達,也就是說,ansible無法通過ssh連線到主機60。

返回上述資訊是正常的,因為ansible主機並不知道10.1.1.60這臺主機的使用者名稱和密碼,所以ansible無法通過ssh連線到它。

所以,我們還需要在清單中,配置10.1.1.60主機的ssh資訊,才能夠進行正確的進行連線,配置示例如下:

修改清單檔案,在之前的主機IP後加入ssh的相關配置資訊,如上圖所示

ansible_port 用於配置對應主機上的sshd服務埠號,在實際的生產環境中,各個主機的埠號通常不會使用預設的22號埠,所以用此引數指定對應埠。

  • ansible_user : 用於配置連線到對應主機時所使用的使用者名稱稱。

  • ansible_ssh_pass : 用於配置對應使用者的連線密碼。

所以,上圖中的配置表示,10.1.1.60這臺主機的sshd服務監聽在22號埠,當ansible通過ssh連線到主機60時,會使用主機60的root使用者進行連線,主機60的root使用者的密碼為123123

好了,主機60的ssh資訊已經配置完畢,我們再來嘗試一下,看看之前的命令能不能正常執行,如下

可以看到,上述命令已經正常執行了,ansible主機成功的ping通了10.1.1.60,從此以後,我們就可以通過ansible主機,管理10.1.1.60這臺主機了。

其實,為了更加方便的使用,ansible還支援對主機新增別名,當主機存在別名時,我們可以通過主機的"別名"管理對應主機。

比如,我們想要將10.1.1.60這臺主機的別名命名為test60,那麼,我們在配置清單時,可以進行如下配置

如上圖所示,當為主機配置別名時,主機的IP地址必須使用anible_host關鍵字進行指明,否則ansible將無法正確的識別對應的主機。

主機的別名配置完成後,則可以使用主機的別名管理對應主機,示例如下。

不過,如果你只使用了上述方式配置了主機,則無法通過主機的IP進行管理了,除非你同時使用了別名的方式與IP的方式配置兩個主機條目。

注意:上述配置引數都是ansible2.0版本以後的寫法,2.0版本之前,應遵從如下寫法

ansible_port應該寫成ansible_ssh_port

ansible_user應該寫成ansible_ssh_user

ansible_host應該寫成ansible_ssh_host

因為當前演示環境的ansible版本為2.4,所以,我們使用新的寫法進行演示,2.4版本同時也相容之前的語法。

上述引數,其實都是為了建立ssh連線所使用的,而說到ssh,我們都知道,建立ssh連線時,可以基於密碼進行認證,也可以基於金鑰進行認證,而在生產環境中,為了提高安全性,我們通常會基於金鑰進行ssh認證,甚至會禁用密碼認證,那麼,當ansible主機需要與受管主機建立ssh連線時,能夠基於金鑰進行認證碼?必須能的。

其實,在實際的使用環境中,我們通常會根據業務和使用者將公鑰打入"配置管理機(ansible主機)"中,私鑰存放在CMDB中,然後獲取並通過私鑰認證的方式連線到對應的受管主機中。

那麼,我們就在ansible主機中生成金鑰,並進行相應的配置吧。

首先,生成預設格式的金鑰對,私鑰與公鑰。

# ssh-keygen

然後將生成的公鑰加入到10.1.1.60的認證列表

# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

好了,公鑰認證的相關操作配置完成,此刻,我們已經可以通過ansible主機免密碼連線到主機60中了。

因為配置了金鑰認證,所以可以實現免密碼建立ssh連線,既然已經能夠免密碼建立ssh連線,那麼在配置"主機清單"時,就沒有必要再提供對應主機的使用者名稱與密碼了,所以,在完成了金鑰認證的相關配置後,我們可以將清單中的配置精簡為如下格式。

或者使用別名的格式

當然,如果你的受管伺服器中的sshd服務使用了預設的22號埠,上述配置中的ansible_port也是可以省略的,為了方便演示,演示環境中的所有受管主機均使用預設的sshd埠號。

如果你的ansible主機上同時存在多對金鑰,有可能需要通過不同的金鑰連線不同的受管主機,這個時候,你可以通過ssh-agent幫助我們管理金鑰。

如果你不想使用ssh-agent管理金鑰,也可以通過ansible_ssh_private_key_file引數,指定連線對應主機時所使用的私鑰,由於演示環境中並沒有同時使用多對金鑰,所以此處不再贅述。

在今後的演示中,預設使用金鑰認證的方式連線到對應主機,我會提前配置好各個受管主機的金鑰認證,後文中將不再對金鑰認證的配置過程進行描述。

好了,說了這麼多,我想你應該已經瞭解了ansible的基本概念,以及ansible的一些最基本的配置,在之後的文章中,我們會徐徐漸進,慢慢的介紹ansible的。