1、Ansible介绍
Ansible 是一个简单轻量级的自动化运维管理工具,基于Python语言实现。主要包含了两大模块Paramiko和PyYAML两个关键模块构建。可用于自动化部署应用、分发修改配置、CI等。
Ansible与Saltstack最大的却别时Ansible无需被控主机部署任何的客户端代理,默认直接通过ssh通道进行远程执行或者下发配置:相同点是具备功能强大、灵活的系统管理、状态设置,两者都提供丰富的模块及API。
不过Ansible虽然说不要客户端,但是客户端必须要有python的环境,而且默认情况下,Ansible识别的时python ,不能有其他任何的名字,否则,就会造成服务端和客户端的工作出现错误。在后期如果执行了一些强大的模块,还需要python客户端有这个模块才能执行,否则报错。下面演示下
演示:
主机:
服务端:192.168.59.126|python2.7|ansible 2.4.2.0
客户端:192.168.59.195|python2.6|xxxxxxxxxx
客户端的python正常存在的情况下:
# ansible 192.168.59.195 -m ping
192.168.59.195 | SUCCESS => {
"changed": false,
"ping": "pong"
}
接下来把192.168.59.195的python改名成python_backup:
# whereis python
python: /usr/bin/python2.6 /usr/bin/python /usr/lib/python2.6 /usr/lib64/python2.6 /usr/include/python2.6 /usr/share/man/man1/python.1.gz
# cd /usr/bin/
# mv python python_bakcup
# python
-bash: python: command not found
服务端执行后报错:
# ansible 192.168.59.195 -m ping
192.168.59.195 | FAILED! => {
"changed": false,
"module_stderr": "Shared connection to 192.168.59.195 closed.\r\n",
"module_stdout": "/bin/sh: /usr/bin/python: 没有那个文件或目录\r\n",
"msg": "MODULE FAILURE",
"rc": 0
}
+可以指定目标主机的python解释器:
# ansible 192.168.59.195 -m ping -e "ansible_python_interpreter=/usr/bin/python2.6"
192.168.59.195 | SUCCESS => {
"changed": false,
"ping": "pong"
}
# ansible 192.168.59.195 -m ping
192.168.59.195 | SUCCESS => {
"changed": false,
"ping": "pong"
}
---
- hosts: 192.168.59.195
remote_user: root
vars:
ansible_python_interpreter: /usr/bin/env python2.6
tasks:
- name: Ping hosts
ping:
# ansible-playbook basice.yml
PLAY [192.168.59.195] ******************************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************************************
ok: [192.168.59.195]
TASK [Ping hosts] **********************************************************************************************************************************************
ok: [192.168.59.195]
PLAY RECAP *****************************************************************************************************************************************************
192.168.59.195 : ok=2 changed=0 unreachable=0 failed=0
2、Ansible安装
=三种方法=:
这里以centos6 为例
1)使用源码编译安装
Github上有源码包,但是需要确定系统是否有git,如果没有执行#yum install git -y 即可。
# git clone https://github.com/ansible/ansible.git
# cd ansible/
# make rpm
#成功后倒数几行内容如下
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/ansible/rpm-build/BUILDROOT/ansible-2.5.0-100.git201712201153.b3ff93e.devel.el6.x86_64
Wrote: /root/ansible/rpm-build/ansible-2.5.0-100.git201712201153.b3ff93e.devel.el6.src.rpm
Wrote: /root/ansible/rpm-build/ansible-2.5.0-100.git201712201153.b3ff93e.devel.el6.noarch.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.RH4zrH
+ umask 022
+ cd /root/ansible/rpm-build
+ cd ansible-2.5.0
+ rm -rf /root/ansible/rpm-build/BUILDROOT/ansible-2.5.0-100.git201712201153.b3ff93e.devel.el6.x86_64
+ exit 0
#############################################
Ansible RPM is built:
rpm-build/ansible-2.5.0-100.git201712201153.b3ff93e.devel.el6.noarch.rpm
#############################################
# echo $?
0
# rpm -Uvh ./rpm-build/ansible-2.5.0-100.git201712201153.b3ff93e.devel.el6.noarch.rpm
# rpm -qa | grep ansible
ansible-2.5.0-100.git201712201153.b3ff93e.devel.el6.noarch
注意:
编译是最麻烦的一种方法,但是编译自由度非常高,这里编译可能会遇到各种软件包的没有,需要自己手动安装,或者python模块不存在,默认编译的时候调用的是系统环境变量中/usr/bin/env python版本,所以安装python模块也需要安装与之对应的python上去。如果出错一定要学会看报错的那几行,尤其是倒数10行,基本上就是他说缺什么,你装的什么的节奏很快的。
先说yum安装把,以centos6为例
*首先需要安装epel源,这个源可以安装官方的也可以安装国内的,国内的比如阿里云的epel源等等速度都是非常客观的。
或者前往官方的地址下载最新的ansible版本,地址:http://releases.ansible.com/ansible/rpm/release/(这个就不多阐述了)
*安装ansible,ansible2.4 需要python版本为python2.6 或者更高的python版本。
检查系统的python版本:
# python --version
Python 2.6.6
运气很好,刚好2.6
检查系统是否有epel源:
如果是安装epel的rpm包的话可以使用命令查看:
#rpm -qa | grep epel
# yum makecache
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* epel: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
base | 3.7 kB 00:00
epel | 4.7 kB 00:00
extras | 3.4 kB 00:00
updates | 3.4 kB 00:00
元数据缓存已建立
# yum install ansible -y
ubuntu安装:
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible
3)使用python的pypi仓库安装
这种方法需要有一个自信的网络,默认的pypi仓库时国外的,当然软件也会是最新的。一般建议修改成国内的pypi镜像仓库,比如aliyun、豆瓣、清华、中科院等等开源镜像站都有。使用国内的开源镜像站或者指定的开源镜像站的方法也很简单。
临时生效:
pip install -i https://pypi.douban.com/simple 软件包名
在用户的家目录下(一般是root),创建一个目录:
mkdir ~/.pip/ -p
echo "[global]" > ~/.pip/pip.conf
echo "https://pypi.douban.com/simple/ " >> ~/pip/pip.conf
下面开始使用pip安装ansible
# pip install ansible
使用pip安装的时候可能会报错,如果是以下错误,我这里提供一个解决思路:
/latest/security.html#insecureplatformwarning.
InsecurePlatformWarning
Downloading PyNaCl-1.0.1.tar.gz (2.7MB)
100% |████████████████████████████████| 2.7MB 230kB/s
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.1.0
Traceback (most recent call last):
File "", line 20, in
File "/tmp/pip-build-ABovhP/pynacl/setup.py", line 259, in
"Programming Language :: Python :: 3.5",
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.1.0')
(2)既然没有那我们就安装一下(这里后来我又安装了1.7.0):
# pip install cffi==1.1.0
InsecurePlatformWarning
Downloading cffi-1.1.0.tar.gz (323kB)
100% |████████████████████████████████| 327kB 324kB/s
Complete output from command python setup.py egg_info:
unable to execute gcc: No such file or directory
unable to execute gcc: No such file or directory
No working compiler found, or bogus compiler options
passed to the compiler from Python's distutils module.
See the error messages above.
(If they are about -mno-fused-madd and you are on OS/X 10.8,
see http://stackoverflow.com/questions/22313407/ .)
compiling '_configtest.c':
__thread int some_threadlocal_variable_42;
compiling '_configtest.c':
int some_regular_variable_42;
----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-7EP_ql/cffi
如上提示中:unable to execute gcc: No such file or directory
没有gcc目录,那是不是gcc没有安装呢?
带着这个疑问我们去安装一下yum install gcc -y 果然没有安装
(3)安装gcc后我们再来执行
# pip install cffi==1.1.0
You are using pip version 7.1.0, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting cffi==1.1.0
/usr/lib/python2.6/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
InsecurePlatformWarning
Using cached cffi-1.1.0.tar.gz
Collecting pycparser (from cffi==1.1.0)
Downloading pycparser-2.18.tar.gz (245kB)
100% |████████████████████████████████| 249kB 1.3MB/s
Installing collected packages: pycparser, cffi
Running setup.py install for pycparser
Running setup.py install for cffi
Successfully installed cffi-1.1.0 pycparser-2.18
这里要等等,前面不是还有一个pynacl的包也安装失败了,那么我先安装一下:
# pip install pynacl==1.0.1
You are using pip version 7.1.0, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting pynacl==1.0.1
/usr/lib/python2.6/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
InsecurePlatformWarning
Using cached PyNaCl-1.0.1.tar.gz
Collecting six (from pynacl==1.0.1)
Downloading six-1.11.0-py2.py3-none-any.whl
Requirement already satisfied (use --upgrade to upgrade): cffi>=1.1.0 in /usr/lib64/python2.6/site-packages (from pynacl==1.0.1)
Requirement already satisfied (use --upgrade to upgrade): pycparser in /usr/lib/python2.6/site-packages (from cffi>=1.1.0->pynacl==1.0.1)
Installing collected packages: six, pynacl
Running setup.py install for pynacl
Successfully installed pynacl-1.0.1 six-1.11.0
# pip install ansible
You are using pip version 7.1.0, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting ansible
/usr/lib/python2.6/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
InsecurePlatformWarning
Using cached ansible-2.4.2.0.tar.gz
Requirement already satisfied (use --upgrade to upgrade): jinja2 in /usr/lib/python2.6/site-packages (from ansible)
Requirement already satisfied (use --upgrade to upgrade): PyYAML in /usr/lib64/python2.6/site-packages (from ansible)
Collecting paramiko (from ansible)
Using cached paramiko-2.4.0-py2.py3-none-any.whl
Requirement already satisfied (use --upgrade to upgrade): cryptography in /usr/lib64/python2.6/site-packages (from ansible)
Requirement already satisfied (use --upgrade to upgrade): setuptools in /usr/lib/python2.6/site-packages (from ansible)
Requirement already satisfied (use --upgrade to upgrade): MarkupSafe>=0.23 in /usr/lib64/python2.6/site-packages (from jinja2->ansible)
Collecting bcrypt>=3.1.3 (from paramiko->ansible)
Using cached bcrypt-3.1.4.tar.gz
Collecting pyasn1>=0.1.7 (from paramiko->ansible)
Using cached pyasn1-0.4.2-py2.py3-none-any.whl
Requirement already satisfied (use --upgrade to upgrade): pynacl>=1.0.1 in /usr/lib64/python2.6/site-packages (from paramiko->ansible)
Requirement already satisfied (use --upgrade to upgrade): idna>=2.1 in /usr/lib/python2.6/site-packages (from cryptography->ansible)
Requirement already satisfied (use --upgrade to upgrade): asn1crypto>=0.21.0 in /usr/lib/python2.6/site-packages (from cryptography->ansible)
Requirement already satisfied (use --upgrade to upgrade): six>=1.4.1 in /usr/lib/python2.6/site-packages (from cryptography->ansible)
Requirement already satisfied (use --upgrade to upgrade): enum34 in /usr/lib/python2.6/site-packages (from cryptography->ansible)
Requirement already satisfied (use --upgrade to upgrade): ipaddress in /usr/lib/python2.6/site-packages (from cryptography->ansible)
Requirement already satisfied (use --upgrade to upgrade): cffi>=1.1 in /usr/lib64/python2.6/site-packages (from bcrypt>=3.1.3->paramiko->ansible)
Requirement already satisfied (use --upgrade to upgrade): pycparser in /usr/lib/python2.6/site-packages (from cffi>=1.1->bcrypt>=3.1.3->paramiko->ansible)
Installing collected packages: bcrypt, pyasn1, paramiko, ansible
Running setup.py install for bcrypt
Running setup.py install for ansible
Successfully installed ansible-2.4.2.0 bcrypt-3.1.4 paramiko-2.4.0 pyasn1-0.4.2
这里说明一下,pypi仓库中的软件有很多版本,有很多时候报错是由于版本不兼容导致的。
在使用pip安装的时候,官方还提供了一个安装开发版本的方法:
pip install git+https://github.com/ansible/ansible.git@devel
参考:
http://docs.ansible.com/ansible/latest/