主機準備:
主機 | 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新建一個項目:
在server1克隆這個項目:
[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
在server3進行與server4同樣的配置。
配置jenkins項目ansible:
保存後在gitlab主機push測試文件:
[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端口不被佔用,否則會構建失敗。