通过 Ansible 创建 Jenkins Server
创建 CI 流程的第一件事应该是安装 CI 工具,本文以最常见的 Jenkins 为例,介绍如何使用 Ansible 自动安装 Jenkins Server。说明:本文的演示环境为 ubuntu 16.04。
Ansible roles(角色)
Ansible 中除了 playbook,还有更高层级的抽象,称为 role(角色)。所谓的 role 其实就是把一些 playbook 组织成为一个更简洁、清晰的可重用对象。比如把安装 Jenkins Server 的 playbook 组织成为一个 role。
感谢开源社区,当我们需要安装 Jenkins Server 的时候并不需要自己写一个对应的 role,直接使用大神们写好的就可以了。
Ansible Galaxy
Ansible Galaxy 是社区和分享 Ansible role 的地方。直接搜索 jenkins,由 geerlingguy 贡献的 jenkins role 是目前最受欢迎的:

ansible-galaxy 命令
通过 ansible-galaxy 命令可以把上面搜索到的 role 安装到本地:
$ ansible-galaxy install geerlingguy.jenkins
由于 geerlingguy.jenkins role 依赖 geerlingguy.java role,所以在安装 geerlingguy.jenkins role 的同时也安装了 geerlingguy.java role。默认的安装目录在当前用户家目录下的 .ansible/roles
同时会安装其依赖的 geerlingguy.java role(能够自行处理依赖关系):

了解 jenkins role 的基本配置
我们安装的 geerlingguy.jenkins role 的主要配置文件为:~/.ansible/roles/geerlingguy.jenkins/defaults/main.yml。下面介绍一下其中的一些比较重要的配置项。
jenkins_package_state: present
安装的 jenkins 版本,present 表示仅安装系统默认包中的版本,如果需要最新版本的 jenkins,需要把 jenkins_package_state 设置为 latest。
jenkins_hostname: localhost
通过 http 协议访问 Jenkins 时使用的域名或主机名称,作为演示,设置为 localhost 就可以了。
jenkins_home: /var/lib/jenkins
Jenkins 的主目录。
jenkins_http_port: 8080
Jenkins 服务器监听的端口号。
jenkins_url_prefix: ""
如果不想通过域名或主机名称直接访问 Jenkins,可以设置 jenkins_url_prefix 变量。比如设置为 /jenkins,这样我们就需要通过下面的 URL 来访问 Jenkins server 了:
http://localhost:8080/jenkins
jenkins_jar_location: /opt/jenkins-cli.jar
Jenkins CLI 程序的位置,该程序主要用来以命令行的方式与 Jenkins server 交互。
jenkins_plugins: []
指定在安装 Jenkins server 的同时安装的插件,默认是一个插件都不装的:

如果需要安装插件,使用逗号分隔插件名称并写入到中括号中就可以了,下面是一个小 demo:
[junit,greenballs,git]
jenkins_plugins_state: present
指定插件的版本,如果设置为 latest,就会保证所有的插件都是最新版本。
jenkins_plugin_timeout: 30
安装插件时的连接超时时间。需要注意安装插件时的超时问题,国内安装插件非常耗时,最好把 jenkins_plugin_timeout 设置的大些,不然经常会碰到 timeout 错误:

jenkins_plugins_install_dependencies: true
安装插件时是否安装其所依赖的插件。
jenkins_admin_username: admin
jenkins_admin_password: admin
安装 Jenkins 时创建的管理员账号和密码。
jenkins_java_options: "-Djenkins.install.runSetupWizard=false"
可以通过 jenkins_java_options 来设置额外的 java 命令行参数。比如我们可以通过下面的配置来设置 Jenkings server 的时区为纽约:
jenkins_java_options: "-Dorg.apache.commons.jelly.tags.fmt.timeZone=America/New_York"
jenkins_version: "1.644"
jenkins_pkg_url: "http://www.example.com"
这两个配置是可选的,通过 jenkins_version 变量我们可以指定安装的 Jenkins 版本,这样每次都会安装相同的版本,当然必须是出现在 http://pkg.jenkins-ci.org/debian/ (Ubuntu)中的版本。
如果你不想使用官方的包,可以通过 jenkins_pkg_url 指定自己的包。默认这两个选项是被注释掉的,也就是说会安装官方的包。
jenkins_connection_delay: 5
jenkins_connection_retries: 60
启动后连接到 Jenkins 时需要等待的时间和次数,以验证 Jenkins 是否正在运行。等待的总时间=延迟*重试,因此默认情况下,这个角色在超时前将等待 300 秒。
jenkins_init_changes:
- option: "JENKINS_ARGS"
value: "--prefix={{ jenkins_url_prefix }}"
- option: "JENKINS_JAVA_OPTIONS"
value: "{{ jenkins_java_options }}"
修改 Jenkings 的初始脚本,默认的更改设置了配置的 URL 前缀,并为 Jenkins 的启动添加了配置的 Java 选项。如果要为 Jenkins 的初始化脚本设置其他选项,添加其他的 选项/值 就可以了。
下面的配置与平台相关,所以 Ubuntu 相关的配置放在配置文件 ~/.ansible/roles/geerlingguy.jenkins/vars/Debian.yml 中:
# For Debian (role default):
__jenkins_repo_url: deb https://pkg.jenkins.io/debian binary/
__jenkins_repo_key_url: https://pkg.jenkins.io/debian/jenkins.io.key
默认安装的是 Jenkins 的最新版本,如果要安装稳定版本请设置为下面的配置:
# For Debian/Ubuntu LTS:
__jenkins_repo_url: deb http://pkg.jenkins-ci.org/debian-stable binary/
__jenkins_repo_key_url: http://pkg.jenkins-ci.org/debian-stable/jenkins-ci.org.key
先在目标机器上安装 curl
由于在安装 Jenkins 的时候需要用到 curl 工具,所以有必要先安装该工具。具体的做法我们可以写一个简单 playbook 来实现,把下面的内容保存到文件 pb_curl.yml 文件中:
---
- hosts: jenkinsservers
become: true
become_user: root
tasks:
- name: install curl on Ubuntu
apt:
name: curl
state: 'latest'
update_cache: no
然后在 /etc/ansible/hosts 文件中添加一个组 jenkinsservers 来保存目标主机:
[jenkinsservers]
192.168.21.145
最后执行命令在目标机器上安装 curl:
$ ansible-playbook -u nick pb_curl.yml
如果你还不熟悉 Ansible 及其 playbook,请参考笔者的《Ansible 简介》一文。
安装 Jenkins
下面我们创建一个非常简单的 playbook 文件 pb_jenkins.yml,其中引用已经安装好的 role 来完成 jenkins 的安装:
---
- hosts: jenkinsservers
vars:
jenkins_hostname: localhost
roles:
- role: geerlingguy.java
become: yes
- role: geerlingguy.jenkins
become: yes
注意,playbook 中先配置了 geerlingguy.java 来安装 Jenkins 依赖的 java。
执行下面的命令进行安装:
$ ansible-playbook -u nick pb_jenkins.yml
安装成功后,到目标机器上检查一下:

Jenkins 服务器已经可以正常运行了,但此时只能通过 localhost 在本机访问。如果需要在局域网内访问,在配置文件中把 localhost 换成主机的 IP 就可以了。
注意,Ansible 的命令是可以重复执行的,如果因为网络等原因造成的失败问题,可以调整相关的超时参数然后重新执行一遍就行了。
总结
对于自动化来说,其本质是件一直在路上的工作。明确目标,然后找对工具进行持续的改进。笔者认为 Ansible 就是这么一款值得信赖的自动化利器,并且它能够通过 playbook 和 role 等概念把我们的使用经验积淀下来进行分享。
参考:
Integrating Ansible with Jenkins in a CI/CD process
ansible-role-jenkins
galaxy role jenkins(geerlingguy)
通过 Ansible 创建 Jenkins Server的更多相关文章
- 通过 CLI 管理 Jenkins Server
Jenkins 内置的命令行接口允许管理员通过命令行工具访问并管理 Jenkins.这让我们可以通过脚本自动化的创建配置或执行任务,也就是把 Jenkins 中的配置代码化了.Jenkins 同时支持 ...
- 用Vagrant创建Jenkins构建环境
这是一个关于Vagrant的学习系列,包含如下文章: Vagrant入门 创建自己的Vagrant box 用Vagrant搭建Jenkins构建环境 用Vagrant和Ansible搭建持续交付平台 ...
- docker 部署 jenkins server
1. 拉取一个jenkins 镜像 docker pull jenkins 2. 创建与jenkins配置目录对应的,容器外的,文件目录,并修改相应的权限 mkdir /home/jenkins ch ...
- [SDK2.2]Windows Azure Virtual Network (3) 创建AD Server并添加至Virtual Network
<Windows Azure Platform 系列文章目录> 在之前的文章中,笔者已经向大家介绍了如何创建一个简单的Azure Virtual Network. 本章我将创建一台域服务器 ...
- 创建link server链接服务器碰到的问题及解决办法
问题描述 今天在做数据库迁移,然后新建link server(链接服务器)的时候,碰到以下问题. 我的sql 脚本是这样的. 然后,执行的时候就收到以下错误信息. Msg 468, Level 16, ...
- c++ 创建 socket server
下面一段代码是创建socket server的代码片段: 需要引用的库包括: #include <sys/types.h> #include <sys/socket.h> #i ...
- [ci]jenkins server启动,通过jnlp的方式启动slave(容器模式)
jenkins server启动,通过jnlp的方式启动slave. java -jar jenkins.jar 配置jnlp端口--全局安全 配置云 配置项目 执行成功
- 使用Python命令创建jenkins的job
目的:通过调用jenkins的命令,动态创建jenkins的job 如何使用,使用Python的脚本,更多API可以进入到官网去查看,http://jenkinsapi.readthedocs.io/ ...
- Docker DevOps实战:Docker+Jenkins+Python+Pytest+Allure(1)- 创建Jenkins容器、安装Python环境、安装项目依赖类库、安装Allure报告插件
前言: 本文实操笔记参照菠萝笔记,安装过程中的坑大家可以参考下 创建Jenkins容器 # 下载Jenkins镜像 [root@localhost ~]# docker pull jenkins/je ...
随机推荐
- css初始
css概念及作用 css即层叠样式表的英文缩写 作用:1 渲染页面 2 页面布局 css语法 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. 格式: selector{ prope ...
- redis在游戏服务器中的使用初探(四) redis应用
文章系列先介绍环境搭建 介绍redis操作和代码编写运行 这是典型的实战工程过程.那么我们为何要使用redis而不是常规的数据库比如 mysql呢? 因为KV内存数据库最大的优势所有数据全部存储在内 ...
- 字符编码中ASCII、Unicode和UTF-8的区别
1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte). ...
- font-smoothing使用后字体看起来会更清晰舒服
CSS3里面加入了一个“-webkit-font-smoothing”属性. 这个属性可以使页面上的字体抗锯齿,使用后字体看起来会更清晰舒服. 加上之后就顿时感觉页面小清晰了. 淘宝也在用哦! 它有三 ...
- 【并发编程】IO模型
一.要点回顾 为了更好地了解IO模型,我们需要先回顾下几个概念:同步.异步.阻塞.非阻塞 同步: 一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行.就是在发出一个功能调用时,在没 ...
- Git的SSH-key生成、导入及使用
Git主要使用4种协议传输数据:本地协议,SSH协议,Git协议和HTTP/S协议. SSH协议是最为常用的一种,正式介绍SSH之前,简要说明一下其它协议. 本地协议(file://) 本地协议的优点 ...
- URI编码时遇到特殊字符的处理方式
今天遇到一个问题,在向一个地址发起get请求时,某个参数是这种形式:foo=xx&&yyyy,其中"&&"是参数值的一部分,在调用这个接口时,后台收 ...
- js实现粒子特效,particles.js的使用
今天偶然看到了一个比较炫酷的js网页.是粒子特效的,就试着用了用.一下是步骤,方便以后查看使用. 1.在网站下载源码https://github.com/VincentGarreau/particle ...
- oracle基础函数--decode
含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN R ...
- Linux Ubuntu部署web环境及项目tomcat+jdk+mysql
1,下载文件 在官网下载好 tomcat.jdk.mysql的linux压缩包 后缀名为.tar.gz 并通过xftp上传到服务器 或者直接通过linux命令 下在wget文件的下载地址 例如: wg ...