天天看點

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或者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+

Ansible基礎入門

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

傳回以下結果則表示安裝成功:

Ansible基礎入門
Ansible基礎入門

#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

Ansible基礎入門

更新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

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

#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