Ansible自動化從零到入門

我們知道現在自動化工具中,最簡單、易於上手,而且最流行的當屬Ansible莫屬了。和Chef、Puppet等Ruby工具甚至同時Python系的Saltstack等CS架構的自動化工具相比雖然執行性能上可能會稍一點,但是無需客戶端,只需SSH就可以管理優勢還是相當明顯的。服務器上架後無需額外操作就可以直接進行操作,比如服務器的初始化標準配置等。本文蟲蟲給大家介紹就是Ansible入門教程,如果此前已有對應的基礎可以忽略本文。

Ansible自動化從零到入門

概述

Ansible是一個開源配置管理工具,可以使用它來自動化任務,部署應用程序實現IT基礎架構。Ansible可以用來自動化日常任務,比如,服務器的初始化配置、安全基線配置、更新和打補丁系統,安裝軟件包等。Ansible架構相對比較簡單,僅需通過SSH連接客戶機執行任務即可:

Ansible自動化從零到入門

Ansible使用過程中會用到一些概念術語,我們先介紹一下。

Ansible的與節點有關的重要術語包括控制節點,受管節點,清單和主機文件:

控制節點(Control node):指安裝了Ansible的主機,也叫Ansible服務器端,管理機。 Ansible控制節點主要用於發佈運行任務,執行控制命令。Ansible的程序都安裝在控制節點上,控制節點需要安裝Python和Ansible所需的各種依賴庫。注意:目前Ansible還不能安裝在Windows下。

受控節點(Managed nodes):也叫客戶機,就是想用Ansible執行任務的客戶服務器。

清單(Inventory):受控節點的列表,就是所有要管理的主機列表。

host文件:清單列表通常保存在一個名為host文件中。在host文件中,可以使用IP地址或者主機名來表示具體的管理主機和認證信息,並可以根據主機的用戶進行分組。缺省文件:/etc/ansible/hosts,可以通過-i指定自定義的host文件。

模塊(Modules):模塊是Ansible執行特定任務的代碼塊。比如:添加用戶,上傳文件和對客戶機執行ping操作等。Ansible現在默認自帶450多個模塊,,Ansible Galaxy公共存儲庫則包含大約1600個模塊。

任務(Task):是Ansible客戶機上執行的操作。可以使用ad-hoc單行命令執行一個任務。

劇本(Playbook):是利用YAML標記語言編寫的可重複執行的任務的列表,playbook實現任務的更便捷的讀寫和貢獻。比如,在Github上有大量的Ansible playbooks共享,你要你有一雙善於發現的眼睛你就能找到大量的寶藏。

角色(roles):角色是Ansible 1.2版本引入的新特性,用於層次性、結構化地組織playbook。roles能夠根據層次型結構自動裝載變量文件、tasks以及handlers等。

Ansible自動化從零到入門

Ansible的優勢

Ansible作為最受歡迎的自動化配置工具,主要得益於其設計上的優勢。

無需客戶端

與Chef、Puppet以及Saltstack(現在也支持Agentless方式salt-ssh)不同,Ansible是無客戶端Agent的,所以無需在客戶機上安裝或配置任何程序,就可以運行Ansible任務。由於Ansible不會在客戶機上安裝任何軟件或運行監聽程序,因此消除了許多管理開銷,我們可以在即可上手使用Ansible管理服務器,同時Ansible的更新也不會影響任何客戶機。

使用SSH進行通訊

默認情況下,Ansible使用SSH協議在管理機和客戶機之間進行通信。可以使用SFTP與客戶機進行安全的文件傳輸。

並行執行

Ansible與客戶機並行通信,可以更快地運行自動化任務。默認情況下,forks值為5,可以按需,在配置文件中增大該值。

安裝Ansible

Ansible可以運行在任何機器上,但是對管理機有一定要求。管理機應安裝Python 2(2.7)或Python 3(3.5或更高版本),另外,管理機不支持Windows控制節點。我們可以使用Linux發行版包管理器、源碼安裝或者Python包管理器(PIP)來安裝Ansible。

redhat系

sudo yum install ansible 或者dnf install ansible

Ansible自動化從零到入門

ubuntu

sudo apt update

sudo apt install software-properties-common

sudo apt-add-repository --yes --update ppa:ansible/ansible

sudo apt install ansible

通過Pip安裝

pip install --user ansible

或者全局性安裝

sudo pip install ansible

源碼安裝

git clone github.com/ansible/ansible.git

cd ./ansible

source ./hacking/env-setup

安裝成功後,可以使用下面命令檢查Ansible的安裝版本:

ansible –version

ansible 2.9.1

config file = /etc/ansible/ansible.cfg

configured module search path = [u'/home/xx/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']

ansible python module location = /usr/lib/python2.7/site-packages/ansible

executable location = /usr/bin/ansible

python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

安全配置

為了使Ansible與客戶端通信,需要使用用戶帳戶配置管理機和客戶機。為了方便快捷安全,一般會配置證書方式連接客戶機。

帳號規劃

假設我們有四臺客戶機(node1,node2,node3和node4)和管理機(manage)。為了方便,我們創建一個ansible用戶帳戶,將該ansible用戶添加到wheel組,然後配置SSH身份驗證。在配置新用戶帳戶時,請在所有節點上創建該帳戶(注意可以使用ansible批量創建):

sudo useradd ansible

然後將ansible用戶添加到wheel組:

sudo usermod -aG wheel ansible

為用戶設置密碼:

sudo passwd ansible

接下來,使用visudo配置/etc/sudoers文件,賦予ansible用戶使用sudo執行特權命令:

%wheel ALL=(ALL) NOPASSWD: ALL

配置證書登陸

在所有客戶機和管理上創建新的ansible用戶之後,我們在管理機(ansible用戶)生成SSH密鑰,然後將SSH公鑰複製到所有客戶機。

sudo su - ansible

ssh-keygen

Ansible自動化從零到入門

現在,將SSH公鑰複製到所有客戶機,這使管理機ansible用戶無需輸入密碼即可登錄客戶機:

ssh-copy-id ansible@node1

Ansible自動化從零到入門

第一次使用,完成以後,就可以直接用證書登陸了。

Ansible配置

默認的配置文件位於/etc/ansible/ansible.cfg下。可以使用此配置文件來修改絕Ansible大多數設置,一般無需額外多配置,默認配置應能滿足大多數使用情況。關於Ansible配置文件,其執行程序會按照一定順序搜索配置:

Ansible按照以下順序搜索配置文件,優先配置優先使用,而忽略其餘配置文件:

$ANSIBLE_CONFIG環境變量。

任務當前目錄下的:ansible.cfg(如果在當前目錄中)。

當前用戶下的ansible.cfg:~/.ansible.cfg

默認配置文件:/etc/ansible/ansible.cfg。

默認清單配置文件位於/etc/ansible/hosts中,但是通過ansible.cfg配置文件中修改此位置。也可以通過-i自定義hosts清單。

為了安全起見,蟲蟲建議你,不要直接在/etc/ansible/host配置清單,尤其是有用戶認賬等信息時候。對於長期不執行ansible可以將host文件加密鎖定,防止信息洩露,引起安全事故。

清單文件格式如下:

[nodes]

node1

node2

node3

node4

[web]

node2

node3

可以對不同用途分組,用[]指定分組名。

Ansible ad-hoc單行命令執行

ad-hoc命令行是我們可以隨手執行的單個ansible任務,是ansible任務快速執行方式。對於一些快速獲取的任務使用ad-doc命令非常簡便有效,而且有助於我們學習和熟悉Ansible的使用。

命令行選項

常用的Ansible命令行選項如下:

-b,--become:特權方式運行命令。

-m:要使用的模塊名稱。

-a,--args:制定模塊所需的參數。

-u:制定連接的用戶名。

-h,--help顯示幫助內容。

-v,--verbose以詳細信息模式運行命令,可以用來調試錯誤。

更多選項和說明詳見Ansible官方文檔。下面我們介紹幾個簡單實例示範:

使用ping模塊檢查與客戶機的連接性,請執行以下操作:

ansible all -m ping

在上面的命令中,all指定Ansible應該在所有主機上運行此命令,也可以按照分組比如nodes 或者主機 node1等。執行結果如下:

Ansible自動化從零到入門

可見node1是通的,而node2和node4不通。

使用ad-hoc命令管理軟件包

使用Ansible的ad-hoc命令,可以給客戶端安裝軟件包。我們只需執行一個單行命令,然後實現安裝。

比如:在分組客戶機安裝Apache只需要執行:

ansible web -m yum yum -a "name=httpd state=present" -b

使用ad-hoc命令管理服務

上面我們給web組的客戶機批量安裝了Apache服務器,下面我們來看怎麼啟動httpd服務。

啟動httpd服務只需要執行:

ansible web -b -m service -a "name=httpd enabled=yes"

要啟動,重新啟動和停止該服務,只需state參數的值更改為started以啟動服務,restarted以重新啟動服務,stop來停止服務:

ansible webservers -b -m service -a "name=httpd state=started"

Ansible ad-hoc命令非常出色,適合於運行單個任務。具體任務模塊可以參考官方文檔:

(docs.ansible.com/ansible/latest/modules/list_of_all_modules.html)。

Ansible Playbook

Ansible自動化從零到入門

Playbook 是Ansible提供的最強大的任務執行方法。與ad-hoc命令不同,Playbooks配置在文件中,可以重用和共享給其他人。

playbooks是以YAML標記語言來定義的。每個playbook由一個或多個play組成。play的目標是將一組主機映射到任務中去。每個play包含一個或多個任務,這些任務每次執行一次。

下面是一個簡單的Ansible httpd.yaml playbook,用於給web組上安裝Apache服務器:

---

- hosts: web

remote_user: ansible

tasks:

- name: Ensure apache is installed and updated

yum:

name: httpd

state: latest

become: yes

執行playbook使用ansible-playbook命令,格式如下:

ansible-playbook -i <hostfile> <playbook.yaml>/<hostfile>

ansible-playbook httpd.yaml結果:

Ansible自動化從零到入門

下面是一個綜合多個任務的多個play的playbook,實現

安裝apche服務器。

在Web服務器組中啟用並啟動httpd服務。

在所有客戶機上安裝git。

其內容如下:

---

- hosts: web

remote_user: ansible

become: yes

tasks:

- name: Installing apache

yum:

name: httpd

state: latest

- name: Enabling httpd service

service:

name: httpd

enabled: yes

notify:

- name: restart httpd

handlers:

- name: restart httpd

service:

name: httpd

state: restarted

- hosts: all

remote_user: ansible

become: yes

tasks:

- name: Installing git

yum:

name: git

state: latest

總結

Ansible是一個方便快捷又功能強大的自動化執行和配置管理工具。本文只是Ansible的入門教程,介紹了Ansible的基本概念、優勢、安裝,配置和簡單的使用。師傅領進門修行靠自己,Ansible更強大的功能和實現自己基於它的全任務自動化需要自己使用探索。當然前面也提到了網絡上尤其是Github上已經有大量Ansible的技術積累(ansible-role-xxxx)可供大家學習參考。


分享到:


相關文章: