Ansible基础入门
1.1 Ansible是什么
??????? 隨著移動互聯、物聯網、互聯網+、大數據、云計算等大規模應用的催生推動,以及人們日常生活的互聯網化,互聯網的蓬勃發展不僅沖擊影響著整個經濟體,更對人們的生活理念影響深遠。在體驗到互聯網帶來的便利和舒適的同時,人們也不再滿足與"可以用",而是要"用的爽",在政策、需求、利益、趨勢等原因的刺激下,互聯網的發展速度可想而知。眾所周知,智能的背后意味著復雜,這一現象在互聯網的發展中體現的淋漓盡致。在互聯網迅猛發展的同時,運維這個工種也從默默無聞的后臺走向公眾視野,被更多的人所知曉。早期公司業務有數十臺、上百臺服務器已經是非常龐大的規模,每個運維同時操作10-20臺機器,忙碌的奔波于各電腦之間配置重啟服務,數十人摩肩接踵的場面是何等壯觀。只是每個人都在數十臺機器上做同樣的修改、配置、操作,如何保證每臺機器的操作都完全一樣呢?又如何保證其他所有人的操作都能準確無誤、沒有遺漏過失呢?更何況,隨著互聯網的迅猛發展,一個公司擁有幾十臺上百臺機器早已不是稀奇事,巨型公司數以萬計的機器都不在話下,在沿用老一套辦法一臺臺的人工修改配置已然不現實,這該怎么辦呢?相信此時你已然明白運維自動化具體是什么了。簡單來講,運維自動化就是將日常重復性的工作通過規則設定使其遵循預先既定規則,在指定的范圍時間內自動化運行,但整個過程無需人工參與。而Ansible正是幫助運維人員實現自動化的工具之一。
???????? 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等,對應的模塊有ec2、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等;
商業化硬件:F5、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.html
1.2 Ansible發展史
1.3 為什么選擇Ansible
Ansible完全基于Python開發,而Devops在國內依然是一種趨勢,Python逐漸普及,運維人員自己開發工具的門檻逐步降低,得益于此,方便對Ansible二次開發;
Ansible豐富的內置模塊,甚至還有專門為商業平臺開發的功能模塊,近600個模塊完全可以滿足日常功能所需;
在Ansible去中心化概念下,一個簡單的復制操作即可完成管理配置中心的遷移;
Agentless(無客戶端),客戶端無需任何配置,由管理配置好后即可使用,這點非常誘人。
1.4 Ansible是如何工作的
???????? Ansible沒有客戶端,因此底層通信依賴于系統軟件,Linux系統下基于OpenSSH通信,Windows系統下基于PowerShell,管理端必須是Linux系統,使用者認證后在管理節點通過Ansible工具調用各應用模塊將指令推送至被管理端執行,并在執行完畢后自動刪除產生的臨時文件。
???????? 根據Ansible使用過程的不同角色,我們將其分為:
使用者
Ansible工具集
作用對象
????????? (1)使用者
????????? 第一種方式:CMDB(Configuration Management Database,配置管理數據庫),CMDB存儲和管理著企業IT架構的各項配置信息,是構建ITIL項目的核心工具,運維人員可以組合CMDB和Ansible,通過CMDB直接下發指令調用Ansible工具集完成操作者所希望達成的目標;
????????? 第二種方式:PUBLIC/PRIVATE方式,Ansible除了豐富的內置模塊外,同時提供豐富的API接口,如PHP、Python、PERL等多種當下流行語言,基于PUBLIC(公有云)/PRIVATE(私有云),Ansible以API調用的方式運行;
???????? 第三種方式:USERS直接調用使用Ad-Hoc臨時命令集調用Ansible工具集來完成任務執行。
???????? 第四種方式: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
?
轉載于:https://www.cnblogs.com/duanxz/p/9908262.html
總結
以上是生活随笔為你收集整理的Ansible基础入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: delphi使用sqlite数据库时的中
- 下一篇: 前端读者 | 别人写的css,你敢用吗?