Ansible是目前非常流行的运维自动化工具之一,Ansible默认通过SSH协议管理机器,安装Ansible之后,不需要启动或运行一个后台进程,或是添加一个数据库。只要在一台电脑上安装好Ansible,就可以通过这台电脑管理一组远程的机器,在远程被管理的机器上不需要安装运行任何软件。 Ansible一般每两个月出一个发行版本。Ansible可以很简单的从源码运行,且不必在远程被管理机器上安装任何软件,很多Ansible用户会跟进使用开发版本。
有几种方式可以安装Ansible: 若你希望使用Ansible的最新版本,并且你使用的操作系统是RHEL、CentOS、Fedora、Debian或者Ubuntu,建议使用系统的软件包管理器。 另有一种选择是通过“pip”工具安装,“pip”是一个安装和管理Python包的工具。 若你希望跟进开发版本,想使用和测试最新的功能特性,可以从源码运行Ansible,从源码运行程序不需要进行软件安装。
Ansible对管理主机的要求
当前的Ansible(2.7版本)可以运行在任何安装了Python 2(2.7版本)或者Python3(3.5及以上版本)的Red Hat、Debian、CentOS、OS X、BSD等机器上,Windows系统不可以做管理主机。
- 自2.0版本开始,ansible使用了更多句柄来管理它的子进程,对于OS X系统,你需要增加ulimit值才能使用15个以上子进程,方法“sudo launchctl limit maxfiles unlimited”,否则你可能会出现”Too many open file”的错误提示.
Ansible对被管理节点的要求
通常我们使用ssh与被管理节点通信,默认使用sftp。如果sftp不可用,可在ansible.cfg配置文件中配置成scp的方式。在被管理节点上也需要安装 Python 2(2.6或以上版本)或者Python3(3.5及以上版本)。
如果被管理节点上开启了SElinux,你需要安装libselinux-python,这样才可使用Ansible中与copy/file/template相关的功能.你可以通过Ansible的yum模块或者dnf模块在需要的被管理节点上安装libselinux-python. Ansible默认使用位于/usr/bin/python的Python解释器来运行它的模块。然而有的Linux发行版也许只有位于/usr/bin/python3的Python 3解释器,在这些系统上你也许会遇到下面的错误:
"module_stdout": "/bin/sh: /usr/bin/python: No such file or directory\r\n"
你可以设置ansible_python_interpreter清单变量来指明Python解释器,或者安装Python 2解释器,如果Python 2解释器不是安装在/usr/bin/python仍然需要设置ansible_python_interpreter变量。
Ansible的”raw”模块(以一种快速和干净的方式运行命令)和script模块甚至不需要Python环境,因此从技术上讲,你可以通过Ansible的”raw”模块安装兼容版本的Python,之后就可以使用Ansible的所有功能了.比如,可以使用下面的命令在基于RHEL的系统上安装Python 2:
$ ansible myhost --sudo -m raw -a "yum install -y python2"
安装Ansible管理主机的步骤
这里仅介绍以源码安装的方式给管理主机安装Ansible,更多安装方式参考Ansible安装指导。
克隆Ansible的git仓库:
[wedot@ityoudao ~]$ cd /u01/app
[wedot@ityoudao app]$ git clone git://github.com/ansible/ansible.git --recursive
正克隆到 'ansible'...
remote: Enumerating objects: 291, done.
remote: Counting objects: 100% (291/291), done.
remote: Compressing objects: 100% (239/239), done.
remote: Total 387812 (delta 212), reused 56 (delta 50), pack-reused 387521
接收对象中: 100% (387812/387812), 137.03 MiB | 10.30 MiB/s, done.
处理 delta 中: 100% (249071/249071), done.
[wedot@ityoudao app]$ cd ansible/
配置Ansible运行环境:
[wedot@ityoudao ansible]$ source ./hacking/env-setup
Ansible now needs setuptools in order to build. Install it using your package manager (usually python-setuptools) or via pip (pip install setuptools).
Setting up Ansible to run out of checkout...
PATH=/u01/app/ansible/bin:/u01/app/jdk/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/wedot/.local/bin:/home/wedot/bin:/home/wedot/.local/bin:/home/wedot/bin:/u01/app/php/bin
PYTHONPATH=/u01/app/ansible/lib
MANPATH=/u01/app/ansible/docs/man:/u01/app/jdk/man:/usr/local/share/man:/usr/share/man
Remember, you may wish to specify your host file with -i
Done!
- 可以添加“-q”参数抑制虚假的警告或错误。
设置环境变量:
[wedot@ityoudao bin]$ echo "export PATH=$PATH:/u01/app/ansible/bin" >> ~/.bash_profile
[wedot@ityoudao bin]$ source ~/.bash_profile
如果没有安装easy_install, 先安装python-setuptools:
[wedot@ityoudao ansible]$ sudo yum install python-setuptools
如果没有安装pip, 先安装对应Python版本的pip:
[wedot@ityoudao ansible]$ sudo easy_install pip
安装需要的Python模块:
[wedot@ityoudao ansible]$ sudo pip install -r ./requirements.txt
使用带“–rebase”选项的pull更新Ansible版本:
$ git pull --rebase
若Ansible版本低于2.2,当更新ansible版本时,不仅要更新git的源码树,还要更新git中指向Ansible自身模块的 “submodules”:
$ git pull --rebase $ git submodule update --init --recursive
一旦运行env-setup脚本,就意味着Ansible从源码中运行起来了。默认的inventory文件是/etc/ansible/hosts.inventory,也可以使用下面的命令另行指定:
[wedot@ityoudao ansible]$ echo "127.0.0.1" > ~/ansible_hosts
[wedot@ityoudao ansible]$ export ANSIBLE_INVENTORY=~/ansible_hosts
- 从Ansible 1.9版本开始,使用“ANSIBLE_INVENTORY”替换了“ANSIBLE_HOSTS”。
使用ping模块测试:
[admin@ityoudao ansible]$ ansible all -m ping --ask-pass
SSH password:
127.0.0.1 | FAILED! => {
"msg": "to use the 'ssh' connection type with passwords, you must install the sshpass program"
}
//使用“--ask-pass”选项的SSH连接必须安装sshpass软件包
[admin@ityoudao ansible]$ sudo yum install sshpass -y
[admin@ityoudao ansible]$ ansible all -m ping --ask-pass
SSH password:
127.0.0.1 | FAILED! => {
"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."
}
//必须添加被管理的节点到known_hosts文件
[admin@ityoudao ansible]$ ssh 127.0.0.1
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:1tLbaByE3/f25WTDwKhM+8T6OYd67NeWlsvQgJ7laP0.
ECDSA key fingerprint is MD5:31:26:32:2d:c2:92:e2:0e:6c:5a:06:e5:46:ac:d6:2f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '127.0.0.1' (ECDSA) to the list of known hosts.
...
[admin@ityoudao ansible]$ ansible all -m ping --ask-pass
SSH password:
127.0.0.1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
遇到的问题和解决办法
运行ansible命令报如下错误“ImportError: No module named ansible.errors”:
问题详情:
[admin@ityoudao ~]$ ansible --version
Traceback (most recent call last):
File "/u01/app/ansible/bin/ansible", line 32, in
from ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError
ImportError: No module named ansible.errors
问题原因:
出现该错误是因为没有执行hacking/env-setup脚本配置Ansible运行环境。
解决方法:
执行该脚本即可解决问题:
[admin@ityoudao ~]$ source /u01/app/ansible/hacking/env-setup
running egg_info
creating lib/ansible.egg-info
writing requirements to lib/ansible.egg-info/requires.txt
writing lib/ansible.egg-info/PKG-INFO
writing top-level names to lib/ansible.egg-info/top_level.txt
writing dependency_links to lib/ansible.egg-info/dependency_links.txt
writing manifest file 'lib/ansible.egg-info/SOURCES.txt'
reading manifest file 'lib/ansible.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no files found matching 'SYMLINK_CACHE.json'
writing manifest file 'lib/ansible.egg-info/SOURCES.txt'
Setting up Ansible to run out of checkout...
PATH=/u01/app/ansible/bin:/u01/app/mysql/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/admin/.local/bin:/home/admin/bin:/u01/app/ansible/bin
PYTHONPATH=/u01/app/ansible/lib
MANPATH=/u01/app/ansible/docs/man:/u01/app/mysql/man:/usr/local/share/man:/usr/share/man
Remember, you may wish to specify your host file with -i
Done!
[admin@ityoudao ~]$ ansible --version
ansible 2.8.0.dev0 (devel 65ce1b727e) last updated 2018/12/19 14:42:00 (GMT +800)
config file = None
configured module search path = [u'/home/admin/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /u01/app/ansible/lib/ansible
executable location = /u01/app/ansible/bin/ansible
python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
可以在使用下面的命令将配置Ansible环境的命令加入到当前用户的.bashrc文件,登录时自动执行配置Ansible环境:
[admin@ityoudao ~]$ echo "source /u01/app/ansible/hacking/env-setup -q" >> ~/.bashrc
Ansible安装文件说明
安装Ansible之后,可以看到如下几个可执行文件:
其中:
- ansible是执行Ad-hoc任务(临时任务)的程序;
- ansible-doc是查看插件文档的工具;
- ansible-galaxy是安装Ansible role的工具;
- ansible-playbook是读取并运行Playbook剧本的程序;
- ansible-pull切换Ansible模式为pull,Ansible默认采用push模式;
- ansible-vault加密配置文件的工具。