1. 程式人生 > 其它 >Ansible基本概念

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 192.168.99.181 -m ping

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

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地址分別如下:

主機名 IP OS
ansible 192.168.99.180 CentOS 7.6
test181 192.168.99.181 CentOS 7.6
test182 192.168.99.182 CentOS 7.6
test183 192.168.99.183 CentOS 7.6

我將主機192.168.99.180(後文中稱ansible主機)作為配置管理主機,所以我們需要在192.168.99.180上安裝ansible,剩下的主機作為受管主機!

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

$ cd /etc/yum.repos.d/
$ cat aliBase.repo 
[aliBase]
name=aliBase
baseurl=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/
enabled=1
gpgcheck=0

$ cat aliEpel.repo 
[aliEpel]
name=aliEpel
baseurl=https://mirrors.aliyun.com/epel/$releasever\Server/$basearch/
enabled=1
gpgcheck=0

$ yum clean all && yum makecache fast
$ yum install ansible -y

此時,yum源中對應的版本為ansible.noarch 0:2.9.27-1.el7

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

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

$ echo 192.168.99.181 >> /etc/ansible/hosts

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

# 執行之前的示例命令:
$ ansible 192.168.99.181 -m ping

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

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

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

$ cat /etc/ansible/hosts 
192.168.99.181 ansible_port=22 ansible_user=root ansible_ssh_pass=123456

修改清單檔案,在之前的主機IP後加入ssh的相關配置資訊!配置資訊欄位解釋:

  • ansible_port:用於配置對應主機上的sshd服務埠號,在實際的生產環境中,各個主機的埠號通常不會使用預設的22號埠,所以用此引數指定對應埠;
  • ansible_user:用於配置連線到對應主機時所使用的使用者名稱稱;
  • ansible_ssh_pass:用於配置對應使用者的連線密碼;

所以,配置檔案表示:192.168.99.181這臺主機的sshd服務監聽在22號埠,當ansible通過ssh連線到主機192.168.99.181時,會使用主機192.168.99.181的root使用者進行連線,主機192.168.99.181的root使用者的密碼為123456

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

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

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

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

$ cat /etc/ansible/hosts 
test181 ansible_host=192.168.99.181 ansible_port=22 ansible_user=root ansible_ssh_pass=123456

當為主機配置別名時,主機的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.9,所以,我們使用新的寫法進行演示,2.9版本同時也相容之前的語法。

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

其實,在實際的使用環境中,我們通常會在配置管理機(ansible主機)中生成金鑰,然後通過公鑰認證的方式連線到對應的受管主機中,如果你對基於金鑰認證的方式還不是特別瞭解,則可以參考如下ssh使用金鑰進行認證

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

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

$ ssh-keygen

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

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

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

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

$ cat /etc/ansible/hosts
192.168.99.181 ansible_port=22

或者使用別名的格式:

$ cat /etc/ansible/hosts
test181 ansible_host=192.168.99.181 ansible_port=22

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

如果你的ansible主機上同時存在多對金鑰,有可能需要通過不同的金鑰連線不同的受管主機,這個時候,你可以通過ssh-agent幫助我們管理金鑰,如果你還不瞭解ssh-agent,那麼可以參考如下瞭解ssh代理:ssh-agent

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

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

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