天天看点

Ansible 实战:基于docker运行ansible准备工作python3 版本的问题实战 playbook

准备好安装了Ansible的主机,作为实验环境。

有一台新安装的Centos7系统,利用ansible在主机上完成以下操作:

主机初始化设置,主要是yum

安装python3

安装docker,并且制作一个ansible的镜像

SSH和用户账号安全设置

准备好一台安装了Centos7系统的主机,然后去ansible的主机上对目标主机进行操作。

我这里的ansible也是新安装的,所以如果遇到一些没有的工具,也会在遇到的时候一步一步进行添加。下面是汇总的内容。

对于一台新装好的ansible,还是会缺少很多依赖项,有些和特定模块关联的比较紧密,可以在使用特定模块的时候再安装。

还有一些使用范围比较广,建议先装好:

yum 安装 sshpass。# yum install sshpass

目标主机安装了python3,就需要将pip更新到最新,并且安装好selinux。# pip install selinux

修改ansible.cfg配置文件

我的实验环境,为了测试方便,暂时只有下面3项做了设置:

配置文件第一行的[defaults]不能省。

编辑 /etc/ansible/hosts 添加主机信息:

我的实验环境是直接放到了家目录里了

先用ping模块测试一下连通性:

这里使用了-k参数,手动输入密码。

测试联通性,可以再加上-c参数,指定local。不过这里要验证一下ssh连接。

安装 sshpass

如果是第一次使用,可能会提示需要安装sshpass。这个简单,yum安装即可:

添加密码信息

最好的做法是用SSHKey实现免密码登录。这里讲使用密码的情况。

为了方便,也可以把密码加到配置中,这样不用每次都输入密码:

这样做,密码就是明码存放了,很不安全。下面有更安全的做法。

使用 ansible-vault 来加密敏感信息

修改配置文件

这步不是必须的,运行命令的时候可以加上参数 --vault_password_file 来指定你的密码文件。不过通过设置就可以把这个参数省了:

使用openssl来生成随机密码

使用 openssl 来生成随机的base64编码的内容:

文件生成后,对文件做了一些保护,防止文件被修改。修改文件的ugo权限只对普通用户有效,root依然可以修改文件。后面的命令可以锁定文件,即使root也无法修改了,防止对文件的意外操作。

如果需要修改或者删除文件,可以先把文件解锁,只要把命令的 +i 改成 -i 就可以了:

生成加密后的字符串

下面是使用 ansible-vault 来生成加密后的字符串:

接下来需要把这里获得的信息复制到配置文件中。

修改主机配置文件

这里对配置文件进行了大修改,原来是INI格式的,现在改成了YAML格式:

要使用YAML是因为INI格式不支持内嵌vault,官方的说明如下:

This is an example using an extract from a YAML inventory, as the INI format does not support inline vaults:

INI格式的主机配置文件,可读性感觉更好。如果依然希望使用INI格式的配置,可以另外再创建vars文件,把额外的参数以YAML格式写在另一个文件中。

验证

这次用command模块了进行验证:

至此准备工作都做完了,已经能成功连接到主机。

python多个版本并存是很常见的情况。Centos7系统安装后默认就有一个python2,一般自己要使用python3就会再安装一个,这个就会带来一些问题。

之前遇到的问题,就是ansible使用了目标主机的python3来执行任务,而有模块使用python3会有问题。

之前有问题的主机是将系统的python命令指向了python3。并且去yum相关的命令中修改了开头的<code>#!/usr/bin/python2</code>来保证yum可以正常运行。

而ansible默认就会去目标主机查找 <code>/usr/bin/python</code> 来执行,这就造成了默认使用python3来执行的情况。

这里就强行将ansible_python_interpreter的值指向目标主机的python3来将问题再现出来。

yum 是用python2写的,所以不支持python3。下面是报错的情况:

根据msg的提示。建议使用dnf,但是尝试之后还是失败了。

简单的办法就是指定 ansible_python_interpreter 参数,使用Python2。

使用yum模块必须指定python2,暂时没别的办法。

在使用 get_utl 模块的时候,就会遇到selinux的问题。这类问题应该只要把selinux关掉应该就解决了(没试过),不过这里看看不关的情况。

一个办法还是使用python2,因为系统默认已经安装好了python2版本的selnux,应该就是下面这个:

如果使用python2也就没这个问题了。

使用python3也是可以的,只要把这个包装上。在yum里没有找到对应的python3版本,不过pip里有:

这里的操作是在目标主机上进行的,也可以用ansible远程来操作。不过这里主要是为了讲明白问题。

建议在目标主机上安装python3之后,就顺便把selinux也装上。这样有些python2和python3都兼容的模块使用任何版本都不会有问题

初始的系统是没有pip的,之后我也只会为python3安装pip。并且所有需要pip安装的python模块都是为python3安装的。

所以在安装pip的时候,需要指定 ansible_python_interpreter 参数,使用Python3。这个和yum模块正好相反。

使用pip模块的时候,可以加参数 <code>extra_args: -i https://mirrors.aliyun.com/pypi/simple/</code> 来指定pypi源。

不过为方便起见,也可以直接写在配置文件中指定默认的pypi源。配置文件也用命令可以添加,不用编辑文件。使用的命令如下:

运行命令可以用command模块来实现。

安装pip和更新

安装我是用yum模块来安装python36-pip(使用easy_install模块安装会有问题,我解决不了)。安装完成后,再用pip模块更新pip。

更新了pip之后,再顺便把selinux也装上,就是上一小节的问题。

这里要用自己测试环境的ansible去配置一台主机。完成初始配置后,要安装好python3和docker,然后再创建一个ansible的镜像。最后还有SSH和账户的安全设置。

主要是设置国内的镜像源,然后使用yum来安装工具:

使用yum来安装python3和pip,然后再更新pip到最新版本,并设置国内的pip镜像源:

按之前说的,顺便把selinux也安装上。

安装docker没有太大问题,需要先把docker-py安装上。用pip安装,所以docker模块只能在python3环境上运行、

之前已经把selinux也装上。这样除了yum,其他都可以在python3环境上运行了。

docker的配置文件是json格式的,json没有注释,所以不能用blockinfile模块。可以用lineinfile模块,也可以用copy模块。不过copy模块有个小问题,没法递归创建目录。而lineinfile模块有create参数,并且也支持多行。

这个是构架ansible的Dockerfile:

创建镜像查找的Dockerfile所在的文件夹是在目标主机上的。所以需要先用copy模块将文件夹复制过去。

copy模块使用相对目录时,源文件的起始目录是playbook所在的目录,目标的起始目录有目标主机决定(Centos的系统,默认登录后就在用户的家目录)。

中文乱码

测试后发现这个基础镜像是不支持中文字符的。需要在Dockerfile中在添加如下的内容:

只在做好的镜像上解决了中文字符的问题。上面的内容没有测试,所以先单独列出来,没有合并到整个Dockerfile中。

主要做了2件事:

开启一个管理员账号

修改默认ssh使用的端口号

playbook如下:

去目标主机上验证: