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