1.1 Ansible是什麼
隨着移動互聯、物聯網、互聯網+、大數據、雲計算等大規模應用的催生推進,以及人們平常生活的互聯網化,互聯網的蓬勃發展不只衝擊影響着整個經濟體,更對人們的生活理念影響深遠。在體驗到互聯網帶來的便利和溫馨的同時,人們也再也不知足與"能夠用",而是要"用的爽",在政策、需求、利益、趨勢等緣由的刺激下,互聯網的發展速度可想而知。衆所周知,智能的背後意味着複雜,這一現象在互聯網的發展中體現的淋漓盡致。在互聯網迅猛發展的同時,運維這個工種也從默默無聞的後臺走向公衆視野,被更多的人所知曉。早期公司業務有數十臺、上百臺服務器已是很是龐大的規模,每一個運維同時操做10-20臺機器,忙碌的奔波於各電腦之間配置重啓服務,數十人摩肩接踵的場面是何等壯觀。只是每一個人都在數十臺機器上作一樣的修改、配置、操做,如何保證每臺機器的操做都徹底同樣呢?又如何保證其餘全部人的操做都能準確無誤、沒有遺漏過失呢?更況且,隨着互聯網的迅猛發展,一個公司擁有幾十臺上百臺機器早已不是稀奇事,巨型公司數以萬計的機器都不在話下,在沿用老一套辦法一臺臺的人工修改配置已然不現實,這該怎麼辦呢?相信此時你已然明白運維自動化具體是什麼了。簡單來說,運維自動化就是將平常重複性的工做經過規則設定使其遵循預先既定規則,在指定的範圍時間內自動化運行,但整個過程無需人工參與。而Ansible正是幫助運維人員實現自動化的工具之一。html
Ansible在其官網上定義以下:Ansible is a radically simple IT automation engine。即Ansible是一款極其簡單的IT自動化工具。這裏特別使用了radically simple來形容Ansible的簡單程度,在0.X版本中的ansible官網中,更"過度"的使用Stupid Simple來形容Ansible是"使人髮指的簡單"。在Ansible官網的通篇文檔中也不時使用Incredibly Simples、Keep It Simple、Power+Simplicity等字眼,可見Ansible這款自動化工具的設計很是注重Simple的理念。但Ansible的功能卻很是不簡單,徹底沒有由於使用方式上的簡單而縮水,其自身內置模塊的數量達500多個,並且還在快速的增長新模塊,如下是這些模塊的覆蓋面的大體分類。前端
系統層:支持的系統有linux、windows、AIX等,對應的模塊有acl、cron、pip、easy_install、yum、authorized_key等大量的內置模塊;
知名的第三方平臺支持:支持的雲平臺有AWS、Azure、Cloudflare、OpenStack、Google、Linode、Digital Ocean等,對應的模塊有ec二、azure_rm_deployment、cloudflare_dns、clc_aa_policy、glance_image、gc_storage、digital_ocean等;
虛擬化:VMware、Docker、CloudStack、LXC、Openstack等,對應的模塊有vmware_vmkernel、docker、cs_account、lxc_container、glance_image等;
商業化硬件:F五、ASA、Citrix、Eos等,對應的模塊有bigip_facts、asa_acl、netscaler、eos_command等;
系統應用層:Apache、Zabbix、Rabbitmq、SVN、GIT等,對應的模塊有apache2_module,zabbix_group,rabbitmq_binding、subversion、git等。
Github上有衆多開源愛好者爲Ansible貢獻功能模塊,這些模塊徹底能夠知足平常工做所需。官方對模塊也從使用者角度進行詳細分類,如Cloud Modules(雲主機模塊)、Clustering Modules(集羣模塊)、Commands Modules(命令模塊)、Database Modules(數據庫模塊)等。詳細的模塊分類可參考官方模塊列表:http://docs.ansible.com/ansible/latest/modules_by_category.htmlnode
1.2 Ansible發展史python
1.3 爲何選擇Ansible
Ansible徹底基於Python開發,而Devops在國內依然是一種趨勢,Python逐漸普及,運維人員本身開發工具的門檻逐步下降,得益於此,方便對Ansible二次開發;
Ansible豐富的內置模塊,甚至還有專門爲商業平臺開發的功能模塊,近600個模塊徹底能夠知足平常功能所需;
在Ansible去中心化概念下,一個簡單的複製操做便可完成管理配置中心的遷移;
Agentless(無客戶端),客戶端無需任何配置,由管理配置好後便可使用,這點很是誘人。
1.4 Ansible是如何工做的
Ansible沒有客戶端,所以底層通訊依賴於系統軟件,Linux系統下基於OpenSSH通訊,Windows系統下基於PowerShell,管理端必須是Linux系統,使用者認證後在管理節點經過Ansible工具調用各應用模塊將指令推送至被管理端執行,並在執行完畢後自動刪除產生的臨時文件。linux
根據Ansible使用過程的不一樣角色,咱們將其分爲:git
使用者
Ansible工具集
做用對象
(1)使用者github
第一種方式:CMDB(Configuration Management Database,配置管理數據庫),CMDB存儲和管理着企業IT架構的各項配置信息,是構建ITIL項目的核心工具,運維人員能夠組合CMDB和Ansible,經過CMDB直接下發指令調用Ansible工具集完成操做者所但願達成的目標;sql
第二種方式:PUBLIC/PRIVATE方式,Ansible除了豐富的內置模塊外,同時提供豐富的API接口,如PHP、Python、PERL等多種當下流行語言,基於PUBLIC(公有云)/PRIVATE(私有云),Ansible以API調用的方式運行;docker
第三種方式:USERS直接調用使用Ad-Hoc臨時命令集調用Ansible工具集來完成任務執行。shell
第四種方式:USERS預先編寫好的ANSIBLE PLAYBOOKS,經過執行Playbooks中預先編排好的任務集按序完成任務執行。
(2)Ansible工具集
ansible命令是Ansible的核心工具,ansible命令並不是自身完成全部的功能集,其只是Ansible執行任務的調用入口,能夠理解爲"總指揮",全部命令的執行經過其"調兵遣將"最終完成。
(3)做用對象
Ansible的做用對象,不只僅是Linux和非Linux操做系統的主機(HOSTS),一樣也能夠做用於各種公有云/私有云,商業和非商業設備的網絡設施。
一樣,若是按照Ansible工具集的組成來說,由上圖能夠看出Ansible主要由6部分組成。
ANSIBLE PLAYBOOKS:任務劇本(任務集),編排定義Ansible任務集的配置文件,由Ansible順序依次執行,一般是JSON格式的YML文件;
INVENTORY:Ansible管理主機的清單;
MODULES:Ansible執行命令的功能模塊,多數爲內置的核心模塊,也可自定義;
PLUGINS:模塊功能的補充,如鏈接類型插件、循環插件、變量插件、過濾插件等,該功能不經常使用。
API:供第三方程序調用的應用程序編程接口
ANSIBLE:該部分圖中表示的不明顯,組合INVENTORY、API、MODULES、PLUGINS的綠框你們能夠理解爲是Ansible命令工具,其爲核心執行工具;
Ansible執行任務,這些組件相互調用關係以下圖所示:
使用者使用ansible或者ansible-playbook(會額外讀取Playbook文件)時,在服務端輸入Ansible的Ad-Hoc命令集或Playbook後,Ansible會遵循預先編排的規則將Playbooks逐條拆解爲Play,再將Play組織成Ansible可識別的任務(Task),隨後調用任務涉及的全部模塊(Module)插件(Plugin),根據Inventory中定義的主機列表經過SSH(Linux默認)將任務集以臨時文件或命令的形式傳輸到遠程客戶端執行並返回執行結果,若是是臨時文件則執行完畢後自動刪除。
1.5 Ansible通訊發展史
Ansible主推的賣點是其無需任何Daemon維護進程便可實現相互間的通訊,且通訊方式是基於業內統一標準的安全可靠的SSH安全鏈接。同時由於SSH是每臺Linux主機系統比裝的軟件,因此Ansible無需在遠程主機端安裝任何額外進城,便可實現Agentless(無客戶端),進而助力其實現去中心化的思想。儘管穩定、快速、安全的SSH鏈接是Ansible通訊能力的核心,但SSH的鏈接效率一直被詬病,因此Ansible的通訊方式和效率在過去的數年中也在不停地改變和提升。
1.Ansible SSH工做機制
Ansible執行命令時,經過其底層傳輸鏈接模塊,將一個或數個文件,或者定義一個Play或Command命令傳輸到遠程服務器/tmp目錄的臨時文件,並在遠程執行這些Play/Comand命令,而後刪除這些臨時文件,同時回傳總體命令執行結果。這一系列操做在將來的Ansible版本中會愈來愈簡單、直接,同時快速、穩定、安全。經過了解其工做機制及其一直以來秉承的去中心化思想,咱們能夠總結,Ansible是非C/S架構,自身沒有Client端,其主要特色以下。
無客戶端,只需安裝SSH、Python便可,其中Python建議版本爲2.6.6以上。
基於OpenSSH通訊,底層基於SSH協議(Windows基於PowerShell)。
支持密碼和SSH認證,因可經過系統帳戶密碼認證或公私鑰認證,因此整個過程簡單、方便、安全。建議使用公私鑰方式認證,由於密碼認證方式的密碼需明文寫配置文件,雖然配置文件可加密,但會增長Ansible使用的複雜度。
支持Windows,但僅支持客戶端,服務端必須是Linux系統。
Clear(簡易):YAML語法,Python語言編寫,易於管理,API簡單明瞭;
Fast(快捷):快速學習,設置簡單,無需任何第三方軟件;
Complete(全面):配置管理、應用部署、任務編排等功能集於一身,豐富的內置模塊知足平常功能所需;
Efficient(高效):沒有額外軟件包消耗系統性能;
Secure(安全):沒有客戶端,底層基於OpenSSH,保證通訊的安全可靠性。
2.Ansible通訊方式發展歷程
(1)Paramiko通訊模塊
(2)OpenSSH
(3)加速模式
(4)Faster OpenSSH in Ansible 1.5+
1.6 Ansible應用場景
系統下全部的操做可從運維操做角度劃分爲兩類:
文件傳輸
命令執行
從自動化工做類型角度歸類以下:
應用部署
配置管理
任務流編排
1.7 Ansible的安裝部署
1.7.1 PIP方式
步驟1:安裝python-pip及python-devel程序包
//安裝python-pip程序包及python-devel
#yum install python-pip python-devel -y
返回如下結果則表示安裝成功:
#yum -y install epel-release
#yum install python-pip
便可安裝成功
步驟2:安裝Ansible服務
//安裝前請確保服務器的gcc,glibc開發環境均已安裝,系統幾乎全部的軟件包編譯環境均基於gcc,如不確承認先執行以下命令:
#yum install gcc glibc-devel zlib-devel rpm-build openssl-devel -y
//升級本地pip至最新版本
#pip install --upgrade pip
//安裝Ansible服務
#pip install ansible --upgrade
安裝出錯:
DEPRECATION: Python 2.6 is no longer supported by the Python core team, please upgrade your Python. A future version of pip will drop support for Python 2.6
Collecting ansible
/usr/lib/python2.6/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:318: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/latest/security.html#snimissingwarning.
SNIMissingWarning
/usr/lib/python2.6/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/latest/security.html#insecureplatformwarning.
InsecurePlatformWarning
Using cached ansible-2.4.2.0.tar.gz
Collecting jinja2 (from ansible)
Using cached Jinja2-2.10-py2.py3-none-any.whl
Collecting PyYAML (from ansible)
Using cached PyYAML-3.12.tar.gz
Collecting paramiko (from ansible)
Using cached paramiko-2.4.0-py2.py3-none-any.whl
Collecting cryptography (from ansible)
Using cached cryptography-2.1.4.tar.gz
Collecting setuptools (from ansible)
Using cached setuptools-36.8.0-py2.py3-none-any.whl
Collecting MarkupSafe>=0.23 (from jinja2->ansible)
Using cached MarkupSafe-1.0.tar.gz
Collecting pyasn1>=0.1.7 (from paramiko->ansible)
Using cached pyasn1-0.4.2-py2.py3-none-any.whl
Collecting bcrypt>=3.1.3 (from paramiko->ansible)
Using cached bcrypt-3.1.4-cp26-cp26mu-manylinux1_x86_64.whl
Collecting pynacl>=1.0.1 (from paramiko->ansible)
Using cached PyNaCl-1.2.1.tar.gz
Complete output from command python setup.py egg_info:
Couldn't find index page for 'cffi' (maybe misspelled?)
No local packages or download links found for cffi>=1.4.1
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-build-2v1MSN/pynacl/setup.py", line 251, in <module>
"Programming Language :: Python :: 3.6",
File "/usr/lib64/python2.6/distutils/core.py", line 113, in setup
_setup_distribution = dist = klass(attrs)
File "/usr/lib/python2.6/site-packages/setuptools/dist.py", line 221, in __init__
self.fetch_build_eggs(attrs.pop('setup_requires'))
File "/usr/lib/python2.6/site-packages/setuptools/dist.py", line 245, in fetch_build_eggs
parse_requirements(requires), installer=self.fetch_build_egg
File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 538, in resolve
dist = best[req.key] = env.best_match(req, self, installer)
File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 780, in best_match
return self.obtain(req, installer) # try and download/install
File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 792, in obtain
return installer(requirement)
File "/usr/lib/python2.6/site-packages/setuptools/dist.py", line 293, in fetch_build_egg
return cmd.easy_install(req)
File "/usr/lib/python2.6/site-packages/setuptools/command/easy_install.py", line 466, in easy_install
raise DistutilsError(msg)
distutils.errors.DistutilsError: Could not find suitable distribution for Requirement.parse('cffi>=1.4.1')
----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-2v1MSN/pynacl
升級python2.7
1.下載python2.7.3
#wget http://python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2
2.解壓
#tar -jxvf Python-2.7.3.tar.bz2
3.更改工做目錄
#cd Python-2.7.3
4.安裝
#./configure
#make all
#make install
#make clean
#make distclean
5. 查看版本信息
#/usr/local/bin/python2.7 -V
6.創建軟鏈接,使系統默認的python指向Pytho2.7
#mv /usr/bin/python /usr/bin/python2.6.6
#ln -s /usr/local/bin/python2.7 /usr/bin/python
7.從新檢驗python版本
#python -V
8.解決系統 Python 軟連接指向 Python2.7 版本後,由於yum是不兼容 Python 2.7的,因此yum不能正常工做,咱們須要指定 yum 的Python版本
#vi /usr/bin/yum
將文件頭部的
#!/usr/bin/python
改爲
#!/usr/bin/python2.6
下載安裝腳本
#wget --no-check-certificate https://bootstrap.pypa.io/get-pip.py
安裝
#python get-pip.py
copy pip腳本到bin(能夠先檢查是否已經存在pip命令
#cp /usr/local/bin/pip2.7 /usr/bin/pip
#pip install ansible --upgrade
1.7.2 YUM方式安裝
YUM(Yellow dog Updater,Modified)是一個在Fedora和Redhat以及CentOS中的Shell前端軟件包管理器。基於RPM包管理,可以從指定的服務器自動下載RPM包而且安裝,能夠自動處理依賴的軟件包,無需繁瑣地一次次下載安裝。YUM安裝Ansible過程以下:
需事先安裝EPEL源後方可找到並安裝Ansible
#rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
安裝Ansible
#yum install ansible -y
返回以下表示安裝成功:
1.7.3 Apt-get方式
Apt-get全稱是Advanced Package Tool,是一款適用於UNIX和Linux系統的應用程序管理器,適用於Ubuntu、Debian等deb包管理式的操做系統,主要用於自動地從互聯網的軟件倉庫中搜索、安裝、升級、卸載軟件或操做系統。
添加Ansible源
#apt-add-repository -y ppa:ansible/ansible
升級庫文件
#apt-get update
安裝Ansible
#apt-get install -y ansible
1.7.4 源碼方式安裝
源碼安裝自己就是一道很高的門檻,做爲剛接觸Linux的新手不建議使用該方式 在什麼狀況下咱們須要從源代碼安裝軟件呢?其實源碼安裝是相對於二進制安裝而言的,所謂的二進制安裝及前沿講到的,pip,yum,apt-get都是二進制的安裝方式,通常當新軟件推出了新的版本,而所用的發行版並無及時跟進,這時候,想要"嚐鮮"的話,就非得靠本身而不可以使用源碼編譯安裝;另外一種情形是,無論是軟件的開發者仍是現用的系統都沒有提供可直接使用的二進制包,而本身又非要使用該軟件,那麼也須要源碼安裝才行。固然,還有其餘的情形。總而言之,學會源碼安裝軟件方式是一項很是重要的技能,但又因其編譯環境準備起來複雜不堪,同時安裝過程又需人工逐一解決安裝過程當中可能遇到的各項應用層依賴和系統庫依賴,因此門檻較高。不建議安裝Beta版安裝Git客戶端
#yum install git -y
整個安裝過程無報錯,有相似以下返回結果則表示安裝成功。
安裝Ansible軟件包
//使用Git將拉取指定的Ansible版本至當前目錄
#git clone git://github.com/ansible/ansible.git -recursive
//切換至程序包目錄
#cd ./ansible
//執行env-setup腳本,安裝Ansible軟件包
#source ./hacking/env-setup
1.7.5 驗證安裝結果
ansible --version
ansible 1.9.6
1.8 Python多環境擴展管理
Pyenv和Virtualenv均爲Python管理工具,不一樣的是,前者是對Python的版本進行管理,實現不一樣版本間的切換和使用;然後者則經過建立虛擬環境,實現與系統環境以及其餘Python環境的隔離,避免互相干擾。
1.8.1 Pyenv的部署與使用
Pyenv是一個簡單的Python版本管理工具,之前叫作Pythonbrew。他讓你可以方便地切換全局Python版本,安裝多個不一樣的Python版本,設置獨立的某個文件夾或者工程目錄特異的Python版本,同時建立Python虛擬環境(virtualenvs)。全部這些操做都可以在類UNIX系統的機器上(Linux和OS X)不須要依賴Python自己執行,並且他工做在用戶層,不須要任何sudo操做。
(1)部署
1)Pyenv安裝後會在系統PATH中插入shims路徑,每次執行Python相關的可執行文件時,會優先在shims裏尋找Python路徑~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin;
2)系統選擇Python版本,依以下順序選擇Python版本:
Shell變量設置(執行pyenv shell查看)
當前可執行文件目錄下的.python_version文件裏的版本號(執行pyenv shell查看)
上層目錄查詢找到的第一個.pyenv-version文件
全局的版本號在~/.pyenv/version文件內(執行pyenv global查看)
3)肯定版本文件的位置和Python版本後,Pyenv會根據版本號在~/.pyenv/versions/文件夾中查找對應的Python版本。執行命令pyenv versions可查看系統目前安裝的Python版本。
接下來開始部署Pyenv,具體部署方式以下:
//clone pyenv至家目錄
git clone git://github.com/yyuu/pyenv.git ~/.pyenv
//修改環境變量
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
//重啓當前Shell
exec $Shell -l
source ~/.bashrc
執行pyenv versions命令,有相似以下返回結果表示安裝正常:
(2)經過Pyenv管理多Python版本
Pyenv命令使用規則以下:
Usage: pyenv <command> [<args>]
咱們經過Pyenv安裝Python3.4.1版原本熟悉其用法。
//查看可安裝的版本列表
pyenv install -list
//安裝指定的Python版本
pyenv install 3.4.1
//切換當前目錄Python版本爲3.4.1
pyenv local 3.4.1
//切換全局目錄Python版本爲3.4.1
pyenv global 3.4.1
//刷新shims
pyenv rehash
yum install readline readline-devel readline-static openssl openssl-devel openssl-static sqlite-devel bzip2-devel bzip2-libs -y
便可安裝成功!
Pyenv更多用法以下:
commands 列出pyenv的全部可用命令
local 設置或列出當前環境下Python版本號
global 設置或列出全局環境下Python版本號
shell 設置或列出Shell環境下Python版本
install 安裝指定的Python版本
uninstall 卸載指定的Python版本
rehash 從新加載Pyenv的shims路徑(安裝完Python版本後需執行該命令)
version 展現當前Python版本號及其生效的路徑
versions 列出Pyenv管控的全部可用的Python版本
which 列出要使用命令的絕對路徑
whence 列出後綴命令的全部可用版本
1.8.2 Virtualenv的部署與使用
(1)部署
//安裝virtualenv
pip install virtualenv
(2)經過Virtualenv管理多Python版本
需強調說明的是:Virtualenv不是經過過版本管理的方式來實現系統同時兼容多Python環境的,而是其經過在工做目錄中虛擬完整的Python多環境並存。接下來咱們看Virtualenv的使用方式。
Virtualenv命令的使用格式以下:
virtualenv [OPTIONS] DEST_DIR
中括號OPTIONS表示參數選項,是可選項,機無關緊要;DEST_DIR表示命令要執行的目錄,如:
//建立/data/magedu/的虛擬目錄
virtualenv /data/magedu
可用的OPTIONS選項以下:
下面詳細看看virtualenv在工做中的應用方式。咱們先建立一個/data/datafile/software/virtualpy/的虛擬工做目錄,然後再切換至虛擬環境
//建立虛擬工做目錄virtualenv /data/datafile/software/virtualpy///經過source加載環境變量,使本地環境切換至虛擬工做目錄source /data/datafile/software/virtualpy/bin/activate