因爲互聯網的快速發展致使產品更新換代速度逐漸加快,運維人員天天都要進行大量的維護操做,仍舊按照傳統方式進行維護使得工做效率低下。這時,部署自動化運維就能夠儘量安全,高效地完成這些工做。
通常會把自動化運維工具劃分爲兩類:一類是須要使用代理工具的,也就是基於專用的Agent程序來完成管理功能,如:Puppet、Func、Zabbix等;另一類是不須要配置代理工具的,能夠直接基於SSH服務來完成管理功能,如:Ansible、Fabric等。 node
Puppet基於Ruby開發,支持Linux、UNIX、Windows平臺,能夠針對用戶、系統服務、配置文件、軟件包、軟件包等進行管理,有很強的擴展性,但遠程執行命令相對較弱。python
SaltStack基於Python開發,容許管理員對多個操做系統建立統一的管理系統,比Puppet更輕量級。mysql
Ansible基於Python開發,集合了衆多優秀運維工具的優勢,實現了批量運行命令、部署程序、配置系統等功能。默認經過SSH協議進行遠程命令執行或下發配置,無需部署任何客戶端代理軟件,從而使得自動化環境部署變得更加簡單。可同時支持多臺主機並行管理,使得管理主機更加便捷。web
工具 | 開發語言 | 結構 | 配置文件 | 運行任務 |
---|---|---|---|---|
Ansible | Python | 無 | YAML | 執行命令行 |
SaltStack | Python | C/S | YAML | 支持命令行 |
Puppet | Ruby | C/S | Ruby語法格式 | 經過模塊實現 |
Ansible能夠看做是一種基於模塊進行工做的框架結構,批量部署能力就是由Ansible所運行的模塊實現的。簡而言之Ansible是基於「模塊」完成各類「任務」的。其基本框架結構如圖所示:
sql
能夠看出Ansible基本架構由六個部分構成:shell
Ansible自動化運維環境由控制主機與被管理主機組成,因爲Ansible是基於SSH協議進行通訊的,因此控制主機安裝Ansible軟件後不須要重啓或運行任何程序,被管理主機也不須要安裝和運行任何代理程序。安全
角色 | 主機名 | IP地址 |
---|---|---|
控制主機 | node1 | 192.168.88.11 |
被管理主機 websrvs | node2 | 192.168.88.10 |
被管理主機 dbsrvs | node3 | 192.168.88.12 |
[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
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 //私鑰文件存儲位置
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
Ansible經過讀取默認主機清單/etc/ansible/hosts文件,修改主機與組配置後,可同時鏈接到多個被管理主機上執行任務。好比定義一個websrvs組,包含兩臺主機的IP地址,再定義一個dbsrvs組,包含一個主機的IP地址,內容以下:架構
[root@localhost ansible]# vi hosts ... [webserver] 192.168.88.10 [mysql] 192.168.88.12
[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 root@localhost.localdomain 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 root@192.168.88.10 /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 root@192.168.88.10's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.88.10'" and check to make sure that only the key(s) you wanted were added. [root@localhost ansible]# ssh-copy-id root@192.168.88.12 /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 root@192.168.88.12's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.88.12'" and check to make sure that only the key(s) you wanted were added.
至此一個簡單的Ansible環境就部署成功了!框架