1. 程式人生 > >自動化運維之Ansible概述及Ansible部署|(持續更新中)

自動化運維之Ansible概述及Ansible部署|(持續更新中)

nss red hat 優秀 分發 程序 paramik and gho 統一

Ansible概述

由於互聯網的快速發展導致產品更新換代速度逐漸加快,運維人員每天都要進行大量的維護操作,仍舊按照傳統方式進行維護使得工作效率低下。這時,部署自動化運維就可以盡可能安全,高效地完成這些工作。
一般會把自動化運維工具劃分為兩類:一類是需要使用代理工具的,也就是基於專用的Agent程序來完成管理功能,如:Puppet、Func、Zabbix等;另外一類是不需要配置代理工具的,可以直接基於SSH服務來完成管理功能,如:Ansible、Fabric等。

1.Puppet

Puppet基於Ruby開發,支持Linux、UNIX、Windows平臺,可以針對用戶、系統服務、配置文件、軟件包、軟件包等進行管理,有很強的擴展性,但遠程執行命令相對較弱。

2.SaltStack

SaltStack基於Python開發,允許管理員對多個操作系統創建統一的管理系統,比Puppet更輕量級。

3.Ansible

Ansible基於Python開發,集合了眾多優秀運維工具的優點,實現了批量運行命令、部署程序、配置系統等功能。默認通過SSH協議進行遠程命令執行或下發配置,無需部署任何客戶端代理軟件,從而使得自動化環境部署變得更加簡單。可同時支持多臺主機並行管理,使得管理主機更加便捷。

工具 開發語言 結構 配置文件 運行任務
Ansible Python YAML 執行命令行
SaltStack Python C/S YAML 支持命令行
Puppet Ruby C/S Ruby語法格式 通過模塊實現

Ansible核心組件

Ansible可以看作是一種基於模塊進行工作的框架結構,批量部署能力就是由Ansible所運行的模塊實現的。簡而言之Ansible是基於“模塊”完成各種“任務”的。其基本框架結構如圖所示:
技術分享圖片

可以看出Ansible基本架構由六個部分構成:

  • Ansible core核心引擎
  • Host inventory主機清單:用來定義Ansible所管理的主機,默認是在Ansible的hosts配置文件中定義被管理主機,同時也支持自定義動態主機清單和指定其他配置文件的位置
  • Connection plugins連接插件:負責和被管理主機實現通信。除支持使用SSH連接被管理主機外,Ansible還支持其他的連接方式,所以需要有連接插件將各個主機用連接插件連接到Ansible
  • Playbooks(yam1,yam2)劇本:用來集中定義Ansible任務的配置文件,即將多個任務定義在一個劇本中由Ansible自動執行,可以由控制主機針對多臺被管理主機同時運行多個任務
  • Core modules核心模塊:是Ansible自帶的模塊,使用這些模塊將資源分發到被管理主機,使其執行特定任務或匹配特定的狀態
  • Custom modules自定義模塊:用於完成模塊功能的補充,可借助相關插件完成記錄日誌、發送郵件等功能

安裝部署Ansible服務

Ansible自動化運維環境由控制主機與被管理主機組成,由於Ansible是基於SSH協議進行通信的,所以控制主機安裝Ansible軟件後不需要重啟或運行任何程序,被管理主機也不需要安裝和運行任何代理程序。

角色 主機名 IP地址
控制主機 node1 192.168.88.11
被管理主機 websrvs node2 192.168.88.10
被管理主機 dbsrvs node3 192.168.88.12

1.安裝Ansible

[root@localhost ~]# yum install epel-release -y     //安裝epel源
[root@localhost ~]# yum install ansible -y          //安裝Ansible
[root@localhost ~]# ansible --version               //查看版本信息
ansible 2.6.2
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u‘/root/.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, Aug  4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]
[root@localhost ansible]# cd /etc/ansible/
[root@localhost ansible]# ll
總用量 24
-rw-r--r--. 1 root root 19549 7月  29 04:07 ansible.cfg     //配置文件
-rw-r--r--. 1 root root  1016 7月  29 04:07 hosts           //管控主機文件
drwxr-xr-x. 2 root root     6 7月  29 04:07 roles

附:配置文件ansible.cfg解析:

hostfile    = /etc/ansible/hosts   //hosts文件的位置
 library      = /usr/share/ansible //ansible默認搜尋模塊的位置
 pattern     = *  //如果沒有提供hosts節點,這是playbook要通信的默認主機組.默認值是對所有主機通信
 remote_tmp  = $HOME/.ansible/tmp   //Ansible通過遠程傳輸模塊到遠程主機,然後遠程執行,執行後在清理現場.在有些場景下,你也許想使用默認路徑希望像更換補丁一樣使用
 forks   = 5    //在與主機通信時的默認並行進程數 ,默認是5d
 poll_interval  = 15  //當具體的poll interval 沒有定義時,多少時間回查一下這些任務的狀態, 默認值是5秒                                                      
 sudo_user  = root   //sudo使用的默認用戶 ,默認是root
 #ask_sudo_pass = True   //用來控制Ansible playbook 在執行sudo之前是否詢問sudo密碼.默認為no
 #ask_pass    = True    //控制Ansible playbook 是否會自動默認彈出密碼
 transport   = smart   //通信機制.默認 值為’smart’。如果本地系統支持 ControlPersist技術的話,將會使用(基於OpenSSH)‘ssh’,如果不支持將使用‘paramiko’.其他傳輸選項‘local’,‘chroot’,’jail’等等
 #remote_port  = 22    //遠程SSH端口。 默認是22
 module_lang   = C   //模塊和系統之間通信的計算機語言,默認是C語言
 #host_key_checking = False    //檢查主機密鑰
 timeout = 10    //SSH超時時間
 #log_path = /var/log/ansible.log     //日誌文件存放路徑
 #module_name = command     //ansible命令執行默認的模塊
 #private_key_file = /path/to/file     //私鑰文件存儲位置

主機列表文件Hosts可使用的指令

ansible_ssh_host     //指定主機別名對應的真實 IP
ansible_ssh_port      //指定連接到這個主機的 ssh 端口,默認 22
ansible_ssh_user     //指定連接到該主機上的用戶
ansible_sudo_pass      //sudo 密碼
ansible_sudo_exe       //sudo 命令路徑
ansible_connection   //連接類型,可以是 local、ssh 或paramiko,ansible1.2 之前默認為 paramiko
ansible_ssh_private_key_file      //私鑰文件路徑
ansible_shell_type       // 目標系統的 shell 類型,默認為sh

2.配置主機清單

Ansible通過讀取默認主機清單/etc/ansible/hosts文件,修改主機與組配置後,可同時連接到多個被管理主機上執行任務。比如定義一個websrvs組,包含兩臺主機的IP地址,再定義一個dbsrvs組,包含一個主機的IP地址,內容如下:

[root@localhost ansible]# vi hosts 
...
[webserver]
192.168.88.10
[mysql]
192.168.88.12

3.設置SSH無密碼登錄

[root@localhost ansible]# ssh-keygen -t rsa         //基於SSH秘鑰的連接
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):    //直接Enter使用默認路徑
Created directory ‘/root/.ssh‘.
Enter passphrase (empty for no passphrase):         //直接Enter不加密
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:NGsx7HoUljEOpgUU6Fp1vay+aDkgHO2AHhtedcrXoD8 [email protected]
The key‘s randomart image is:
+---[RSA 2048]----+
|   o+o+.o        |
|  . .=.*.+       |
|....+.+.&.       |
|.=oo + =oB       |
|+oO   o.S        |
|o=..  .E         |
| . . o. o        |
|    +...         |
|   .....         |
+----[SHA256]-----+

[root@localhost ansible]# ssh-copy-id [email protected]
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host ‘192.168.88.10 (192.168.88.10)‘ can‘t be established.
ECDSA key fingerprint is SHA256:LVQy8BE9xArhgdx5buiZoCIhYKAzoTkl7SPX6geEFdk.
ECDSA key fingerprint is MD5:af:47:6d:64:8f:0f:e6:25:7f:7b:d1:10:a5:31:83:29.
Are you sure you want to continue connecting (yes/no)? y
Please type ‘yes‘ or ‘no‘: yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]‘s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh ‘[email protected]‘"
and check to make sure that only the key(s) you wanted were added.

[root@localhost ansible]# ssh-copy-id [email protected]
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host ‘192.168.88.12 (192.168.88.12)‘ can‘t be established.
ECDSA key fingerprint is SHA256:/E8PrN6v7MJRRcWbmU0mXwELY+yABUuNTyDiTl7O2lU.
ECDSA key fingerprint is MD5:1e:f1:8e:93:d6:65:1d:fd:1d:ff:71:15:a4:6c:2f:4e.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]‘s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh ‘[email protected]‘"
and check to make sure that only the key(s) you wanted were added.

至此一個簡單的Ansible環境就部署成功了!

自動化運維之Ansible概述及Ansible部署|(持續更新中)