jenkins 持續交付 - 遠程構建交付(ssh、ansible)

使用 ssh 進行遠程交付

我們在開啓一臺虛擬機server5進行交付,同樣使用容器的方式。

安裝docker,並配置:

[root@server5 run]# cat /etc/sysctl.d/bridge.conf 
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
[root@server5 run]# cat /etc/hosts

172.25.254.3	server3 reg.caoaoyuan.org

[root@server5 run]# cat /etc/docker/daemon.json 
{
	"registry-mirrors": ["https://vo5twm71.mirror.aliyuncs.com"]
}
[root@server5 run]# ls /etc/docker/certs.d/reg.caoaoyuan.org/ca.crt 			# 證書
/etc/docker/certs.d/reg.caoaoyuan.org/ca.crt

我們將通過jinkens的 ssh插件進行遠程交付,將代碼部署到類生產環境中。
我們首先要安裝ssh插件。

在這裏插入圖片描述
這個插件可以讓我們在遠程主機執行shell命令。

安裝完成後jenkins的系統配置就會多出:
在這裏插入圖片描述
測試連接成功。
然後我們打開之前做的docker項目,讓他去在server5上進行交付。
這裏我們之前的配置執行shell命令是本地的,所以我們使用遠程執行shell命令。
在這裏插入圖片描述
它會從指定的harbor倉庫去拉取鏡像,然後執行docker run。
然後觸發一次。
server1上更改代碼:

[root@server1 demo]# vim index.html 
hhhhhhhhhhhhhhh
hhhhhhhhhhhhhhh
hhhhhhhhhhhhhhh
hhhhhhhhhhhhhhh
[root@server1 demo]# git commit -a -m "add index.html v5"
[master 2509044] add index.html v5
 1 file changed, 4 insertions(+), 4 deletions(-)
[root@server1 demo]# git push -u origin master

在這裏插入圖片描述
構建成功。

[root@server5 run]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                NAMES
0efe29507964        myweb               "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp   webserver
[root@server5 run]# curl localhost
hhhhhhhhhhhhhhh
hhhhhhhhhhhhhhh
hhhhhhhhhhhhhhh
hhhhhhhhhhhhhhh

交付成功。

使用ansible參數化構建交付。

上面我們一直使用的都是使用容器進行交付,接下來我們使用ansible交付一些二進制的文件。

這裏我們也使用server4 和server5 做交付的主機。開不起來了,內存都滿,簡易開啓新的虛擬機。

我們需要做:

  • Jenkins服務器提前部署好到目標主機的ssh免密,並安裝ansible軟件包。
  • 由於是以jenkins用戶調用ansible命令,所以需要設置jenkins用戶到目標主機的
    免密。
  • 新建playbook代碼倉庫

首先切換到jenkins 用戶,獲得密鑰:

[root@server2 docker]# usermod -s /bin/bash jenkins		# 不然jenkins用戶無法切換
[root@server2 docker]# su - jenkins
-bash-4.2$ ssh-keygen 

-bash-4.2$ 
-bash-4.2$ cd .ssh/
-bash-4.2$ ls
id_rsa  id_rsa.pub  known_hosts

-bash-4.2$ ssh-copy-id server4:
jenkins@server4's password: 
Permission denied, please try again.		# 被拒絕是因爲jenkings只是普通用戶
[root@server4 ~]# useradd -u 1000 ansible		# 4 和 5上創建ansible用戶用來免密登陸
[root@server4 ~]# passwd ansible
passwd: all authentication tokens updated successfully.

[root@server5 run]# useradd -u 1000 ansible
[root@server5 run]# passwd ansible
passwd: all authentication tokens updated successfully.

# jenkins用戶做免密:
-bash-4.2$ ssh-copy-id [email protected]

-bash-4.2$ ssh-copy-id [email protected]

-bash-4.2$ ssh [email protected]
[ansible@server4 ~]$ logout
Connection to 172.25.254.4 closed.
-bash-4.2$ ssh [email protected]
[ansible@server5 ~]$ logout
Connection to 172.25.254.5 closed.		# 可以了

由於ansible用戶是沒有權限的所以做visudo
[root@server5 run]# visudo
ansible ALL=(ALL)       NOPASSWD: ALL

[root@server4 ~]# visudo
ansible ALL=(ALL)       NOPASSWD: ALL

然後我們去新建playbook代碼倉庫:
在這裏插入圖片描述

[root@server1 ~]# git clone [email protected]:root/playbook.git
Cloning into 'playbook'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
[root@server1 ~]# cd playbook/
[root@server1 playbook]# ls		# 拉取倉庫
README.md

然後在jenkins上也新建一個項目ansible。
在這裏插入圖片描述
我們先只給它設置一個git,去抓取源碼。手動觸發一次:

-bash-4.2$ pwd
/var/lib/jenkins
-bash-4.2$ cd workspace
-bash-4.2$ ls
demo  demo@tmp  docker
-bash-4.2$ ls
ansible  ansible@tmp  demo  demo@tmp  docker
-bash-4.2$ cd ansible
-bash-4.2$ ls
README.md
## jenkins就同步過來了
  1. 首先在jenkins主機安裝ansible,可以使用阿里雲的epel倉庫。
[root@server2 yum.repos.d]# yum install ansible -y
  1. 然後去gitlab主機寫一個inventory配置文件playbook
[root@server1 playbook]# pwd
/root/playbook
[root@server1 playbook]# vim ansible.cfg
[defaults]
remote_user = ansible			# 遠程用戶
command_warnings = False		# 忽略警告

[privilege_escalation]			# sudo 配置
become=True
become_method=sudo
become_user=root
become_ask_pass=False

[root@server1 playbook]# mkdir inventory
[root@server1 playbook]# ls
ansible.cfg  inventory  README.md
[root@server1 playbook]# cd inventory/
[root@server1 inventory]# vim test 
[test]
172.25.254.4
[root@server1 inventory]# vim prod
[prod]				
172.25.254.5				# 分別指定兩個主機

[root@server1 playbook]# vim playbook.yml
---
- hosts: all
  tasks: 
    - name: install apache
      yum:
        name: httpd
        state: present
    - name: start apache
      service:
        name: httpd					# 安裝啓動apache。
        state: started
[root@server1 playbook]# git add .

[root@server1 playbook]# git commit -m "add playbook"
[root@server1 playbook]# git remote -v
origin	[email protected]:root/playbook.git (fetch)
origin	[email protected]:root/playbook.git (push)
[root@server1 playbook]# git push -u origin master
	# 添加上傳

在這裏插入圖片描述

然後去jenkins上的ansible項目進行配置,
首先要在jenkins上安裝Build with ParametersExtended Choice ParameterPersistent Parameter插件。然後重啓jenkins。

quansible項目中配置:
在這裏插入圖片描述
選擇選項參數。
這裏的testprod都是deploy的值,指的inventory中的兩個文件。

在這裏插入圖片描述
然後再構建這裏選擇 shell執行,因爲我們是已經做過ssh免密的。因爲使用jenkins用戶,它把這些文件都放在 workspace裏,所以我們要先進入目錄,在使用參數化的方式構建, ${deploy} 就是我們上面設置的變量,裏面有testprod兩個值.

-bash-4.2$ cd workspace/
-bash-4.2$ ls
ansible  ansible@tmp  demo  demo@tmp  docker
-bash-4.2$ cd ansible
-bash-4.2$ ls
ansible.cfg  inventory  playbook.yml  README.md

進行測試:
在這裏插入圖片描述
點擊build with parmeters,選擇在test環境部署,點擊開始構建。
在這裏插入圖片描述jenkins 主就就會先抓取gitlab上的文件,然後在進入到工作目錄,在執行ansble-playbook。
在這裏插入圖片描述
server4測試環境就部署好了。

在這裏插入圖片描述
生產環境部署一次:
在這裏插入圖片描述
這裏我們只部署了一臺主機,在生產環境我們可以部署多臺。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章