在 CentOS 6.5 上使用 ansible 的 jenkins_job 模块

运行环境

  • CentOS 6.5
  • ansible 2.6.8
  • 系统自带python2.6
  • 用户为 root

问题/解决

最近试用了一下 ansible 的 jenkins_job 模块,在这里整理一下我遇到的问题和解决方法。

首先是模块的官方文档 https://docs.ansible.com/ansi...

根据官方文档,需要运行 jenkins_job 的目标机器需要安装2个依赖,分别是:

  • python-jenkins >= 0.4.12
  • lxml >= 3.3.3

首先说 lxml ,如果直接使用系统默认 python 的 pip 安装,安装过程中会报错:

error: command 'gcc' failed with exit status 1

在网络上查询一般的解决办法都会告知需要安装 libxml2 和 libxslt 的开发套件,也就是

yum install -y libxml2-devel libxslt-devel

但是如果你的系统是新的系统或者非常的“干净”的话,你会发现安装完成之后仍然不能 pip install lxml ,这时还需要安装 python-devel

yum install -y python-devel

安装完成之后就可以正常使用 pip 安装 lxml 了

pip install lxml

下面说 python-jenkins ,直接使用 pip 安装上 python-jenkins 后并不能使用,调用 ansible 的 jenkins_job 模块或者直接在目标主机上的 python 中 import jenkins 会报语法错误,像这样:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/site-packages/jenkins/__init__.py", line 59, in <module>
    import requests
  File "/usr/lib/python2.6/site-packages/requests/__init__.py", line 43, in <module>
    import urllib3
  File "/usr/lib/python2.6/site-packages/urllib3/__init__.py", line 8, in <module>
    from .connectionpool import (
  File "/usr/lib/python2.6/site-packages/urllib3/connectionpool.py", line 92
    _blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK}
                                    ^
SyntaxError: invalid syntax

在网络上查询到报错的原因是 python-jenkins 最新版本并不支持 python2.6 ,解决方法就是安装旧版本的 python-jenkins ,这里就选 jenkins_job 要求的最低版本 0.4.12 就好:

pip uninstall python-jenkins
pip install python-jenkins==0.4.12

这时再在目标主机的 python 中 import jenkins 不会报语法错误了,只会提示一个 "UserWarning: Support for python 2.6 is deprecated and will be removed." 即将不再支持 python2.6 ,这个版本能支持那么就一直使用这个版本好了。

使用方法

解决了 jenkins_job 模块的问题使之可以调用了之后,下面我们来看看如何使用这个模块。根据官网文档的描述,可以使用这个模块对 jenkins 的 job 进行 创建/删除/禁用/启用 的操作,认证方式可以使用 jenkins 的用户名加密码/token 的方式。下面放个简单的例子用于禁用某项目:

---
- hosts: localhost
  gather_facts: no
  vars:
  tasks:
  - name: "disable jenkins job"
    jenkins_job:
      url: http://you.jenkins.domainname:port
      user: yourusername
      password: yourpassword
      name: "jenkins_job_name"
      enabled: False

启用/禁用/删除 和选择密码还是 token 登录都非常好理解,下面看一下官方创建项目的例子:

# Create a jenkins job using basic authentication
- jenkins_job:
    config: "{{ lookup('file', 'templates/test.xml') }}"
    name: test
    password: admin
    url: http://localhost:8080
    user: admin

其他字段都非常好理解,只有 config 字段是获得了 templates/test.xml 这个文件的内容,而对于这个文件里的内容,并没有更多的解释。这部分应该属于 jenkins 定义的范围。不知道是很少人使用还是我搜索的方法不对,我并没有很容易的找到关于这个 xml 文件怎么定义的文档,但是我查到其实这个 xml 就是你的 jenkins 目录下的 jobs/yourJobName/config.xml 。所以最简单的方法就是在 jenkins 上创建好需要的 job 然后复制出这个 config.xml 文件,这样你就得到了你需要的 config 字段中的内容,也可以在其中修改一些值,改一个现有的配置文件总比从零开始写要容易。

config 字段除了使用 "{{ lookup('file','xxxx.xml') }}" 的形式之外,还可以使用 "{{ lookup('template', 'xxxx.xml.j2') }}" 将 xml 文件改成 jinja2 模板,这样就可以使用 ansible 的变量动态生成 job 了。

相关推荐