我們知道現在自動化工具中,最簡單、易於上手,而且最流行的當屬Ansible莫屬了。和Chef、Puppet等Ruby工具甚至同時Python系的Saltstack等CS架構的自動化工具相比雖然執行性能上可能會稍一點,但是無需客戶端,只需SSH就可以管理優勢還是相當明顯的。服務器上架後無需額外操作就可以直接進行操作,比如服務器的初始化標準配置等。本文蟲蟲給大家介紹就是Ansible入門教程,如果此前已有對應的基礎可以忽略本文。
概述
Ansible是一個開源配置管理工具,可以使用它來自動化任務,部署應用程序實現IT基礎架構。Ansible可以用來自動化日常任務,比如,服務器的初始化配置、安全基線配置、更新和打補丁系統,安裝軟件包等。Ansible架構相對比較簡單,僅需通過SSH連接客戶機執行任務即可:
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作為最受歡迎的自動化配置工具,主要得益於其設計上的優勢。
無需客戶端
與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
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
現在,將SSH公鑰複製到所有客戶機,這使管理機ansible用戶無需輸入密碼即可登錄客戶機:
ssh-copy-id ansible@node1
第一次使用,完成以後,就可以直接用證書登陸了。
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等。執行結果如下:
可見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
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結果:
下面是一個綜合多個任務的多個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)可供大家學習參考。
閱讀更多 蟲蟲安全 的文章