主机准备:
主机 | ip | 作用 |
---|---|---|
server1 | 172.25.63.1 | gitlab主机 |
server2 | 172.25.63.2 | jenkins+ansible主机 |
server3 | 172.25.63.3 | 客户端主机 |
server4 | 172.25.63.4 | 客户端主机 |
各主机selinux和火墙全部关闭。
首先在server2安装ansible:
[root@server2 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@server2 ~]# yum install ansible -y
在gitlab新建一个项目:
[root@server1 ~]# git clone git@172.25.63.1:root/playbook.git
编辑一个playbook:
[root@server1 ~]# ls
anaconda-ks.cfg demo playbook
[root@server1 ~]# cd playbook/
[root@server1 playbook]# vim playbook.yml
[root@server1 playbook]# cat playbook.yml
---
- hosts: all
tasks:
- name: install httpd
yum:
name: httpd
state: present
- name: start httpd
service:
name: httpd
state: started
playbook的内容为安装并启动httpd。
jenkins可以通过参数化构建,创建inventory文件:
[root@server1 playbook]# mkdir inventory
[root@server1 playbook]# cd inventory/
[root@server1 inventory]# vim test
[root@server1 inventory]# cat test
[test]
172.25.63.4
[root@server1 inventory]# vim prod
[root@server1 inventory]# cat prod
[prod]
172.25.63.3
在运行playbook时可以通过-i
选项来指定不同的inventory文件。
创建ansible配置文件,要求远程连接时使用ansible用户并以sudo的方式执行:
[root@server1 playbook]# vim ansible.cfg
[root@server1 playbook]# cat ansible.cfg
[defaults]
remote_user = ansible
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
在jenkins创建一个ansible项目:
在执行ansible playbook时需要ssh免密,但是jenkins在构建的时候使用的是普通用户jenkins,因此需要在这个用户下做免密:
[root@server2 ~]# usermod -s /bin/bash jenkins
[root@server2 ~]# su - jenkins
-bash-4.2$ ssh-keygen
Enter passphrase (empty for no passphrase): #输入通行码
Enter same passphrase again:
-bash-4.2$ ssh-copy-id ansible@172.25.63.4
-bash-4.2$ ssh-copy-id ansible@172.25.63.3
以上远程连接使用的用户是普通用户ansible,需要在客户端主机添加这个用户并进行配置:
[root@server4 ~]# useradd ansible
[root@server4 ~]# passwd ansible #设置密码
[root@server4 ~]# visudo
ansible ALL=(ALL) NOPASSWD: ALL
配置jenkins项目ansible:
[root@server1 playbook]# git add .
[root@server1 playbook]# git commit -m "add playbook"
[root@server1 playbook]# git push -u origin master
push后查看gitlab:
会触发jenkins项目的触发:
可以看到创建成功。
此时在jenkins主机查看workspace:
[root@server2 ~]# su - jenkins
-bash-4.2$ cd workspace/
-bash-4.2$ ls
ansible ansible@tmp docker test test@tmp
-bash-4.2$ cd ansible
-bash-4.2$ ls
ansible.cfg inventory playbook.yml README.md
可以看到已经拿到了gitlab中的文件。
接下来使用参数化构建jenkins,在ansible项目的配置中:
构建中选择执行shell,并运行ansible playbook:
保存后可以开始构建,首先需要选择构建参数:
根据inventory文件的信息,选择test参数就意味着在server4远程执行这个playbook,点击开始构建,查看控制台输出:
可以看出构建成功:
在网页测试访问httpd:
部署成功。
当然也可以将参数设置为prod,那么就会在server3部署httpd。
需要注意的是当构建时需要保证客户端主机的80端口不被占用,否则会构建失败。