Ansible是新出現的自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、cfengine、chef、func、fabric)的優勢,實現了批量系統配置、批量程序部署、批量運行命令等功能,ansible是基於模塊工做的,自己沒有批量部署的能力,真正具備批量部署的是ansible所運行的模塊,ansible只是提供一種框架,在下面的章節中我大家先來熟悉一下Ansible的幾個經常使用的安裝方式,包括源碼安裝,Yum倉庫安裝,而後咱們會來解析一下Ansible的配置文件,以及管理兩臺主機小實驗,在從此的章節中咱們使用Yum安裝的Ansible來說解其內容.python
Ansible 系統概述linux
Ansible是一款爲類Unix系統開發的自由開源的配置和自動化工具.它用Python寫成,相似於saltstack和Puppet可是有一個不一樣和優勢是咱們不須要在節點中安裝任何客戶端.它使用SSH來和節點進行通訊,Ansible基於 Python paramiko 開發,分佈式,無需客戶端,輕量級,配置語法使用 YMAL 及 Jinja2模板語言,更強的遠程命令執行操做.web
IT自動化配置管理最近20年得到了迅猛的發展,特別最近幾年在移動互聯、雲計算、大數據、互聯網+等大規模應用平臺的需求推進下,涌現出一批成熟的大規模自動化運維工具.維基百科裏列出了二十多個,其中 Puppet、Chef和Salt,以及 CFEngine、agrant和NixOS,你們均可能耳熟能詳了.不事後起之秀Ansible (www.ansible.com) 的人氣更高,已是當今最經常使用的管理基礎架構的開源管理工具之一.數據庫
Ansible使用Python語言做爲開發語言,巧妙地設計,實現了簡單易用,功能強大的自動化管理工具,Ansible由Michael DeHaan發起,開發,建立,他同時也是著名的工具軟件Cobbler與Func的開發者,Ansible的第一個版本發佈於2012年2月,目前的下載數量超過120萬人,當前在GitHub上,它是排名前十的Python項目,能夠預見Ansible的發展不可限量,Ansible已經普遍應用於各類規模的企業中,包括Rackspace,Twitter,Evernote,NASA,GoPro,等知名企業.json
2015年10月紅帽(Red Hat)宣佈收購軟件開發公司 Ansible 消息稱這次收購耗資逾 1億美圓,也有消息稱接近 1.5億美圓.vim
Ansible 應用領域安全
Ansible的編排引擎能夠出色地完成配置管理、流程控制、資源部署等多方面工做,與其餘IT自動化產品相比較,Ansible爲你提供一種不須要安裝客戶端軟件、管理簡便、功能強大的基礎架構配置、維護工具,Ansible 基於 Python 語言實現,由 Paramiko 和 PyYAML 兩個關鍵模塊構建bash
Ansible獨特的設計理念:架構
● 安裝部署過程簡單,容易學習
● 管理主機方便,支持多主機並行管理
● 無需再客戶端部署相應軟件
● 安全性高,很容易對內容審計評估
● 非ROOT帳戶也可使用框架
Ansible 公司負責 Ansible 開源軟件的維護、管理,是 Ansible 軟件發展的最大貢獻者 Ansible 開發團隊很是高效,軟件發佈週期大約是 2 個月發佈一個新版本.因爲發佈週期如此之短,輕微的 bug 一般是在下一個版本中獲得修補,而不是對穩定版本發佈新補丁.稍大的 bug 經評估後,若是確實須要將會發布對穩定版本的補丁,但這種狀況不多出現.
Ansible 系統架構
Ansible 集合衆多優秀運維工具 (Puppet、Cfengine、Chef、Func、Fabric) 的優勢,實現了批量系統配置、批量程序部署、批量運行命令等功能, Ansible 是基於模塊工做的,自己沒有批量部署的能力.真正具備批量部署的是 Ansible 所運行的模塊,Ansible 只是提供一種框架.Ansible 的基本架構見下圖,用戶經過 Ansible 編排引擎操做公有云/私有云或 CMDB (配置管理數據庫)中的主機.
由上圖能夠看到 Ansible 由 5 個部分組成:
● Ansible (Ansible的核心組件,負責執行命令的東西)
● Modules (Ansible 自帶的核心模塊及自定義模塊)
● Plugins (完成模塊功能的補充,包括鏈接插件、郵件插件等)
● Playbooks (劇本,定義 Ansible 多任務配置文件,由Ansible自動執行)
● Inventory (定義 Ansible 管理主機的清單)
Ansible 採用 paramiko 協議庫 (Fabric 也使用這個),經過 SSH 或者 zeroMQ 等鏈接主機 Ansible 在控制主機將 Ansible 模塊經過 SSH 協議 (或者Kerberos、LDAP) 推送到被管節點執行,執行完以後自動刪除,可使用 SVN 等來管理自定義模塊及編排.從上圖能夠了解到,控制主機與被管節點之間支持 ocal、SSH、ZeroMQ 三種鏈接方式,默認使用基於 SSH 的鏈接,在規模較大的狀況下使用 ZeroMQ 鏈接方式會明顯改善執行速度.
接下來,來看一下幾個小實驗和配置參數的解析吧.
Ansible 的安裝方式很是靈活知足各類環境部署的需求,通常能夠直接用源碼進行安裝,也可用操做系統軟件包管理工具進行安裝,下面咱們只介紹比較複雜的源碼安裝,可是咱們後期的小實驗會使用Yum安裝的來進行講解.
1.首先安裝gcc編譯器,和Python的相關依賴包.
[root@localhost ~]# yum -y install gcc zlib zlib-devel openssl openssl-devel libffi-devel Package gcc-4.8.5-36.el7.x86_64 already installed and latest version Package zlib-1.2.7-18.el7.x86_64 already installed and latest version Package zlib-devel-1.2.7-18.el7.x86_64 already installed and latest version Package 1:openssl-1.0.2k-16.el7.x86_64 already installed and latest version Package 1:openssl-devel-1.0.2k-16.el7.x86_64 already installed and latest version Package libffi-devel-3.0.13-18.el7.x86_64 already installed and latest version Nothing to do
2.因爲Ansible是使用Python開發的,這裏咱們須要編譯並安裝Python解釋器.
[root@localhost ~]# yum install -y readline [root@localhost ~]# wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz [root@localhost ~]# tar xvzf Python-3.7.0.tgz -C /usr/src/python3.7 [root@localhost ~]# cd /usr/src/Python-3.7.0/ [root@localhost ~]# ./configure --prefix=/usr/local/python3.7 [root@localhost ~]# make && make altinstall
3.將python頭文件拷貝到標準目錄,以免編譯ansible時,找不到所需的頭文件.
[root@localhost ~]# cd /usr/local/include/python3.7/ [root@localhost ~]# cp -a ./* /usr/local/include/
4.接着咱們備份一下舊版本的Python,並建立符號連接連接到新版本的Python上面/
[root@localhost ~]# cd /usr/bin/ [root@localhost bin]# mv python python.old [root@localhost bin]# ln -s /usr/local/bin/python3.7 /usr/local/bin/python [root@localhost bin]# rm -rf /usr/bin/python [root@localhost bin]# cp /usr/local/bin/python3.7 /usr/bin/python
5.因爲yum是用python開發的,這裏爲了不衝突要改掉他的配置.
[root@localhost ~]# vim /usr/bin/yum #!/usr/bin/python2.7 ←此處將python改爲python2.7 [root@localhost ~]# vim /usr/libexec/urlgrabber-ext-down #!/usr/bin/python2.7 ←此處將python改爲python2.7
6.最後測試python新版本是否生效了.
[root@localhost ~]# python Python 3.7.0 (default, Apr 17 2018, 11:03:21) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> exit()
7.安裝setuptools模塊.
[root@localhost ~]# wget https://files.pythonhosted.org/packages/72/c2/c09362ab29338413ab687b47dab03bab4a792e2bbb727a1eb5e0a88e3b86/setuptools-39.0.1.zip [root@localhost ~]# unzip setuptools-39.0.1.zip -d /usr/src/ [root@localhost ~]# cd /usr/src/setuptools-39.0.1/ [root@localhost setuptools-39.0.1]# python setup.py install
8.pycrypto模塊安裝.
[root@localhost ~]# wget https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz [root@localhost ~]# tar xvzf pycrypto-2.6.1.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/pycrypto-2.6.1/ [root@localhost pycrypto-2.6.1]# python setup.py install
9.PyYAML模塊安裝.
[root@localhost ~]# wget http://pyyaml.org/download/libyaml/yaml-0.1.7.tar.gz [root@localhost ~]# tar xvzf yaml-0.1.7.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/yaml-0.1.7/ [root@localhost yaml-0.1.7]# ./configure --prefix=/usr/local [root@localhost yaml-0.1.7]# make --jobs=`grep processor /proc/cpuinfo | wc -l` [root@localhost yaml-0.1.7]# make install [root@localhost ~]# wget http://pyyaml.org/download/pyyaml/PyYAML-3.12.tar.gz [root@localhost ~]# tar xvzf PyYAML-3.12.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/PyYAML-3.12/ [root@localhost PyYAML-3.12]# python setup.py install
10.Jinja2模塊安裝
[root@localhost ~]# wget https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz [root@localhost ~]# tar xvzf MarkupSafe-0.9.3.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/MarkupSafe-0.9.3/ [root@localhost MarkupSafe-0.9.3]# python setup.py install [root@localhost ~]# wget https://files.pythonhosted.org/packages/56/e6/332789f295cf22308386cf5bbd1f4e00ed11484299c5d7383378cf48ba47/Jinja2-2.10.tar.gz [root@localhost ~]# tar xvzf Jinja2-2.10.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/Jinja2-2.10/ [root@localhost Jinja2-2.10]# python setup.py install
11.paramiko模塊安裝.
[root@localhost ~]# wget https://files.pythonhosted.org/packages/f9/e5/99ebb176e47f150ac115ffeda5fedb6a3dbb3c00c74a59fd84ddf12f5857/ecdsa-0.13.tar.gz [root@localhost ~]# tar xvzf ecdsa-0.13.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/ecdsa-0.13/ [root@localhost ecdsa-0.13]# python setup.py install [root@localhost ~]# https://files.pythonhosted.org/packages/29/65/83181630befb17cd1370a6abb9a87957947a43c2332216e5975353f61d64/paramiko-2.4.1.tar.gz [root@localhost ~]# tar xvzf paramiko-2.4.1.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/paramiko-2.4.1/ [root@localhost paramiko-2.4.1]# python setup.py install
12.simplejson模塊安裝.
[root@localhost ~]# wget https://files.pythonhosted.org/packages/0d/3f/3a16847fe5c010110a8f54dd8fe7b091b4e22922def374fe1cce9c1cb7e9/simplejson-3.13.2.tar.gz [root@localhost ~]# tar xvff simplejson-3.13.2.tar.gz -C /usr/src/ [root@localhost src]# cd /usr/src/simplejson-3.13.2/ [root@localhost simplejson-3.13.2]# python setup.py install
13.Ansible安裝.
[root@localhost ~]# wget https://files.pythonhosted.org/packages/4a/3b/9d98e132074bb6a3f18fd811db2819fbde6fc8a26fad9a40b49e53cb2455/ansible-2.5.0.tar.gz [root@localhost ~]# tar xf ansible-2.5.0.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/ansible-2.5.0/ [root@localhost ansible-2.5.0]# python setup.py install
下面的小實驗,咱們將採用如下的IP地址規劃,請自行配置好.
[實驗環境] [狀態] [主機列表] [python版本] 控制機 192.168.1.10 Python2.6/2.7 被控機 192.168.1.20 Python2.4 被控機 192.168.1.30 Python2.4
爲了不 Ansible 下發指令時輸入目標主機密碼,經過證書籤名達到 SSH 無密碼是一個好的方案,推薦使用 ssh-keygen
與 ssh-copy-id
來實現快速證書的生成及公鑰下發.
1.在控制主機建立密鑰,執行 ssh-keygen -t rsa
,有詢問直接按回車鍵便可,將在 /root/.ssh 下生成一對密鑰,其中 id_rsa 爲私鑰,id_rsa.pub 爲公鑰,代碼以下:
[root@localhost ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): 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:TbU6Vvtwf0SP/rFW3c6NTBHHwN/pADsJsIstP/4f96k root@localhost.localdomain The key s randomart image is: +---[RSA 2048]----+ | .. ...o | | .. o .o o| | . o * ++| | o .o * o.++| | o oS = + =.=| | o . . =.++| | o . +o==| | . . o +oO| | ..... Eo+.| +----[SHA256]-----+ [root@localhost ~]#
2.下發密鑰就是控制主機把公鑰id_rsa.pub下發到被管節點上用戶下.ssh目錄,並重命名成 authorized_keys 且權限值爲 400,接下來推薦經常使用的密鑰拷貝工具 ssh-copy-id
把公鑰文件id_rsa.pub公鑰拷貝到被管節點,命令格式以下:
[root@localhost ~]# ssh-copy-id root@192.168.1.20 [root@localhost ~]# ssh-copy-id root@192.168.1.30
3.RHEL7.0安裝Ansible後發現找不到ansible.cfg,配置文件的路徑,咱們須要手動將它的配置文件拷貝到/etc/目錄下去.
[root@localhost ~]# cd /usr/src/ansible-2.5.0/examples [root@localhost exampless]# mkdir /etc/ansible [root@localhost exampless]# cp -a ansible.cfg hosts /etc/ansible
4.編輯Ansible,寫入被控主機IP地址,若是要寫入一組IP咱們能夠加中括號 webserver
表明的含義就是,執行下面一組IP的操做,admin
組則表明指定一個範圍.
[root@localhost ~]# vim /etc/ansible/hosts 192.168.1.20 #寫入單個IP地址 192.168.1.30 [webserver] #指定一個組 192.168.1.20 192.168.1.30 [admin] #指定一個範圍 192.168.1.[1:100]
5.修改Ansible主配置文件,修改兩處位置便可,分別是禁用每次執行命令檢查ssh,和開啓日誌記錄功能,取消兩處的註釋便可.
[root@localhost ~]# vim /etc/ansible/ansible.cfg 61 # uncomment this to disable SSH key host checking 62 host_key_checking = False #禁用每次執行命令檢查ssh,取消註釋 100 # logging is off by default unless this path is defined 101 # if so defined, consider logrotate 102 log_path = /var/log/ansible.log #開啓日誌記錄功能,取消註釋
6.此時Ansible控制主機就配置完畢了,咱們來執行如下命令,看一下它的連通性吧,通常咱們Ping一下看到pong說明成功啦.
[root@localhost ~]# ansible all -m ping 192.168.1.20 | SUCCESS => { #說明成功 "changed": false, "ping": "pong" } 192.168.1.30 | SUCCESS => { #說明成功 "changed": false, "ping": "pong" } [root@localhost ~]# ansible webserver -m ping 192.168.1.20 | SUCCESS => { #說明成功 "changed": false, "ping": "pong" } 192.168.1.30 | SUCCESS => { #說明成功 "changed": false, "ping": "pong" }
這裏測試時在控制主機與被管節點之間配置了 SSH 證書信任,若是沒有用證書認證,則須要在執行 Ansible 命令時添加 -k 參數,在提示 "SSH password:"時輸入 root 帳號密碼,實際生產環境中,大多數更傾向於使用 Linux 普通用戶帳戶進行鏈接並經過 sudo 命令實現: root 權限,格式爲: ansible all -m ping -u ansible -sudo
參考文獻:《Ansible自動化運維:技術與最佳實踐》