一个专注于IT互联网运维的技术博客

如何安装Ansible?Ansible管理主机的配置

2018.12.28

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之后,可以看到如下几个可执行文件: Files of Ansible

其中:

  • ansible是执行Ad-hoc任务(临时任务)的程序;
  • ansible-doc是查看插件文档的工具;
  • ansible-galaxy是安装Ansible role的工具;
  • ansible-playbook是读取并运行Playbook剧本的程序;
  • ansible-pull切换Ansible模式为pull,Ansible默认采用push模式;
  • ansible-vault加密配置文件的工具。
发表评论