Jenkins+Ansible:助力基础设施建设

761 阅读3分钟

这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战

简述

ansible自动化:操作系统初始化具体实现》《ansible自动化:基础软件的自定义安装》两篇文章我们虽然通过ansible在字符界面满足了操作需求,但是这并不友好。我们希望团队内每个人都能直接上手无缝使用,因此就需要一个图形化界面来提高可操作性。

在此我们借助Jenkins+Ansible 来实现图形化的参数化构建过程:

25.png

我们在输入IP后,根据选择的PLAYBOOK(剧本),再进一步选择不同的TAG(标签),就可以按需自动化实现我们的需求。

下面就来讲解下我们具体实现。

Ansible

Ansible作为我们的配置中心,主要依靠Playbook(剧本)进行各种自动化操作的编排。另借助Tag(标签)将整个编排过程进行细分,有助于我们进行多样性的组合,灵活复用。

26.png

在基础设施建设阶段,我们需求比较多的就是操作系统初始化、基础组件的安装,这两个场景的具体实现过程在《ansible自动化:操作系统初始化具体实现》、《ansible自动化:基础软件的自定义安装》进行了讲解,在此我们只展示下目录结构,希望大家在实现具体需求时根据ansible的目录功能合理安排。

1.基础组件初始化

ansible playbook 用于安装filebeat、java、python、nginx 等各种基础组件。


roles/software_install/
├── files
│   ├── filebeat
│   │   ├── filebeat-6.4.3-x86_64.rpm
│   │   └── filebeat.yml
│   ├── java
│   │   ├── app.tar.gz
│   │   ├── app.zip
│   │   ├── data.zip
│   │   └── jdk1.8.0_40.zip
│   ├── nginx
│   │   ├── echo-nginx-module-master.zip
│   │   ├── nginx-module-vts-master.zip
│   │   ├── nginx_upstream_check_module-master.zip
│   │   └── tengine-2.3.2.tar.gz
│   └── python
│       └── Python-3.7.0.tgz
├── handlers
│   └── main.yml
├── tasks
│   ├── filebeat.yml
│   ├── java.yml
│   ├── main.yml
│   ├── nginx.yml
│   ├── python.yml
│   └── python.yml.bak
└── vars
    └── main.yml

2.系统初始化

ansible playbook 用于操作系统初始化,如时间同步、内核参数、用户初始化、环境变量、安全基线等。

roles/os_init/
├── files
│   ├── ansible_key
│   │   └── id_rsa.pub
│   ├── blueking_key
│   │   └── id_rsa.pub
│   ├── CentOS6-Base-LAN.repo
│   ├── CentOS7-Base-LAN.repo
│   ├── client.xml
│   ├── deploy_key
│   │   └── id_rsa.pub
│   ├── epel7-LAN.repo
│   ├── zabbix-agent-3.0.14-1.el7.x86_64.rpm
│   ├── zabbix-agent-4.2.1-1.el6.x86_64.rpm
│   ├── zabbix-release-3.0-1.el7.noarch.rpm
│   ├── zabbix-release-4.2-1.el6.noarch.rpm
│   ├── zabbix-sender-3.0.14-1.el7.x86_64.rpm
│   └── zabbix-sender-4.2.1-1.el6.x86_64.rpm
├── handlers
│   └── main.yml
├── tasks
│   ├── dir.yml
│   ├── dns.yml
│   ├── init_pkg.yml
│   ├── iptables.yml
│   ├── limits.yml
│   ├── main.yml
│   ├── ntp.yml
│   ├── profile.yml
│   ├── rc.local.yml
│   ├── repo.yml
│   ├── rsyslog.yml
│   ├── safe.yml
│   ├── selinux.yml
│   ├── sshd.yml
│   ├── sysctl.yml
│   ├── user.yml
│   └── zabbix_agent.yml
├── templates
│   └── sysctl.conf.j2
└── vars
   ├── main.yml

其中Tag可以根据实际情况按需添加,例如系统初始化中虽然分了很多Tag,但是我们并没有每个都使用。

Jenkins

我们借助Jenkins的功能丰富的插件,来实现不同层面的需求。

1.参数化构建

Jenkins自带"String Parameter"、"Choice Parameter"虽然在一定程度上满了我们对普通参数的需求,但是无法满足我们对选择参数的联动(即主动选择反应参数),如选择系统初始化剧本,可以和其相关的标签联动。

在此我们选择安装"Active Choices Plugin-in"插件,实现主动选择反应参数。将"Active Choices Reactive Parameter"配合"Multi-line String Parameter"、"Choice Parameter"实现参数化的选择。

(1)Multi-line String Parameter

多行字符串参数,便于我们输入多个IP,实现批量操作。

27.png

(2)Choice Parameter

通过此参数,可以和后面的Active Choices Reactive Parameter 进行Tag联动。

28.png

(3)Active Choices Reactive Parameter

此参数通过groovy 脚本实现PLAYBOOK和TAG的联动。

29.png

通过"Referenced parameters" 可以设置关联的源参数。

46.png

经过以上设置就可以实现参数间的联动:

25.png

2.与ansbile关联

Jenkins通过"Ansible plugin"可以和ansible进行关联,当然也可以在不安装插件的情况下用shell实现。

30.png

由于我们使用普通用户执行操作,因此ansible在安装过程中需要通过-b参数进行提权

31.png

总结

通过jenkins + ansible 我们在图形化界面上助力了基础设施方面的建设,提升了操作友好性。另通过本次介绍,希望我们能了解到jenkins不只是在DevOps中才发挥其价值,在自动化建设方面也同样能出一份力。

在此我们并没有使用Jenkins  pipeline,因为ansible playbook的编排一定程度上在操作系统级上都实现了。