使用 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就同步過來了
- 首先在jenkins主機安裝ansible,可以使用阿里雲的epel倉庫。
[root@server2 yum.repos.d]# yum install ansible -y
- 然後去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 Parameters
和Extended Choice Parameter
和Persistent Parameter
插件。然後重啓jenkins。
quansible項目中配置:
選擇選項參數。
這裏的test
和prod
都是deploy的值,指的inventory中的兩個文件。
然後再構建這裏選擇 shell
執行,因爲我們是已經做過ssh免密
的。因爲使用jenkins
用戶,它把這些文件都放在 workspace
裏,所以我們要先進入目錄,在使用參數化的方式構建, ${deploy}
就是我們上面設置的變量,裏面有test
和prod
兩個值.
-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測試環境就部署好了。
生產環境部署一次:
這裏我們只部署了一臺主機,在生產環境我們可以部署多臺。