自動(dòng)化部署 docker 項(xiàng)目

自動(dòng)化部署 docker 項(xiàng)目

Jenkins + Ansible + Gitlab 自動(dòng)化部署 基于docker的nginx+flask+gunicorn+mysql項(xiàng)目

三劍客環(huán)境搭建

確保兩臺(tái)服務(wù)器一臺(tái) gitlab.example.com 提供 gitlab 代碼倉(cāng)庫(kù)服務(wù), 一臺(tái) jenkins.example.com 提供 jenkins + ansible 服務(wù)曾撤。兩臺(tái)服務(wù)器三個(gè)服務(wù)部署主機(jī) flask.example.com 上的 flask 項(xiàng)目

搭建過(guò)程參考

GitLab

準(zhǔn)備 flask 項(xiàng)目

[root@gitlab.example.com lab_project]# tree -L 3 ./
./
├── docker-compose.yml
├── flask
│   ├── Dockerfile
│   └── lab_app
│       ├── app
│       ├── manage.py
│       ├── __pycache__
│       ├── requirement.txt
│       └── venv
├── mysql
│   ├── Dockerfile
│   └── laboratory_web.sql
├── nginx
│   ├── Dockerfile
│   ├── nginx.conf
│   └── seafile.conf
└── seafile
    └── docker-compose.yml

8 directories, 10 files

將 flask 項(xiàng)目添加進(jìn)gitlab


# 在gitlab頁(yè)面建好一個(gè)項(xiàng)目
# 登錄gitlab主界面潦闲,添加一個(gè)New project,輸入 Project name: lab_project 和 Project description : lab_project repo迫皱,Visibility Level 選擇默認(rèn) Private歉闰,創(chuàng)建好后復(fù)制倉(cāng)庫(kù)http地址 COPY URL
# 回到 gitlab.example.com 服務(wù)器,在用戶下創(chuàng)建 repo 目錄
mkdir repo
cd repo
# 這里的 -c http.sslVerify=false 用來(lái)避免本地證書無(wú)法進(jìn)行clone操作卓起,如果沒(méi)有添加dns和敬,則直接訪問(wèn)ip/root/test-repo.git 輸入用戶名和密碼
git -c http.sslVerify=false clone https://gitlab.example.com/root/lab_project.git
mv /root/lab_project/ /root/repo/lab_project/
# 添加lab_project到本地倉(cāng)庫(kù)
git add . 
# 提交
git commit -m"First commit of lab_project"
# 提示創(chuàng)建本地git全局的郵箱和用戶名,再次運(yùn)行 git commit -m"First commit" 即可提交成功
git config --global user.email "admin@example.com"
git config --global user.name "admin"
# 輸入賬號(hào)密碼戏阅,同步本地master分支到遠(yuǎn)程服務(wù)器當(dāng)中
git -c http.sslVerify=false push origin master

Ansible

ansible-playbook

在 jenkins.example.com 上配置 ansible-playbook

# 加載ansible
source /root/ansible/hacking/env-setup -q
# 驗(yàn)證是否開啟ansible服務(wù)
ansible-playbook --version
cd repo
mkdir ansible-playbook-repo
cd ansible-playbook-repo
# 創(chuàng)建如下目錄結(jié)構(gòu)
[root@jenkins.example.com ~]# tree ./lab_project_playbook/
./lab_project_playbook/
├── deploy.retry
├── deploy.yml
├── inventory
│   ├── dev
│   └── prod
└── roles
    ├── docker-ce
    │   ├── handlers
    │   │   ├── main.yml
    │   │   ├── yum-clean-metadata.yml
    │   │   └── yum-makecache.yml
    │   ├── tasks
    │   │   ├── install_docker-ce_based.yml
    │   │   ├── install_docker-compose.yml
    │   │   ├── main.yml
    │   │   └── remove_oldder_version_docker.yml
    │   └── vars
    │       └── main.yml
    └── lab_project
        ├── tasks
        │   ├── install_based.yml
        │   ├── main.yml
        │   └── pull_base_image.yml
        └── vars
            └── main.yml

9 directories, 16 files


vim deploy.retry
flask.example.com

vim deploy.yml
- hosts: "lab_project"
  gather_facts: true
  remote_user: root
  roles:
    - { role: docker-ce }
    - { role: lab_project }

vim inventory/dev
vim inventory/prod
[lab_project]
flask.example.com

vim roles/docker-ce/tasks/main.yml
---
# tasks file for docker-ce
- include: remove_oldder_version_docker.yml

- name: clean repo
  yum_repository:
    name: docker-ce
    state: absent
  notify: yum-clean-metadata

- include: install_docker-ce_based.yml

- name: config repo
  shell: yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
  notify: yum-makecache

- name: install docker-ce
  yum:
    name: docker-ce
    state: present
  register: docker_installed

- name: enable & start docker
  when: docker_installed is success
  service:
    name: docker
    enabled: yes
    state: started

- include: install_docker-compose.yml

vim roles/docker-ce/tasks/remove_oldder_version_docker.yml
---
# possible saved as remove_oldder_version_docker.yml
- name: remove oldder version docker
  yum:
    name: "{{ item }}"
    state: absent
  with_items:
    - docker
    - docker-client
    - docker-client-latest
    - docker-common
    - docker-latest
    - docker-latest-logrotate
    - docker-selinux
    - docker-engine
    - docker-engine-selinux

vim roles/docker-ce/tasks/install_docker-ce_based.yml
---
# possible saved as install_docker-ce-based.yml
- name: install yum-utils device-mapper-persistent-data lvm2
  yum:
    name: "{{ item }}"
    state: latest
  with_items:
    - yum-utils
    - device-mapper-persistent-data
    - lvm2


vim roles/docker-ce/tasks/install_docker-compose.yml
---
# possible saved as install_docker-compose.yml
- name: check if docker-compose exists
  stat: "path={{ docker_compose_file_path }}"
  register: docker_compose_file

- name: install docker-compose
  when: not docker_compose_file.stat.exists
  get_url:
    url: "{{ docker_compose_file_url }}"
    dest: "{{ docker_compose_file_path }}"
    validate_certs: no
    mode: 0755

vim roles/docker-ce/handlers/main.yml
---
# handlers file for docker-ce
- include: yum-clean-metadata.yml
- include: yum-makecache.yml

vim roles/docker-ce/handlers/yum-clean-metadata.yml
---
- name: yum-clean-metadata
  command: "yum clean metadata"

vim roles/docker-ce/handlers/yum-makecache.yml
---
- name: yum-makecache
  command: "yum makecache"
  
vim roles/docker-ce/vars/main.yml
---
# vars file for docker-ce
docker_compose_file_url: https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Linux-x86_64
docker_compose_file_path: /usr/local/bin/docker-compose

vim roles/lab_project/tasks/main.yml
---
# tasks file for start lab_app
- include: install_based.yml

- include: pull_base_image.yml

- name: close git ssl verification
  command: "git config --global http.sslVerify false"
  register: git_sslVerify

- name: clone git.repo to remote
  when: git_sslVerify is success
  git:
    repo: "https://{{ gitlab_user | urlencode }}:{{ gitlab_pass | urlencode }}@192.168.220.132/root/lab_project.git"
    dest: "{{ lab_project_dir }}"
    force: yes

- name: check if lab_project exists
  stat: 'path={{ lab_project_dir }}'
  register: lab_project_stat

- name: run the docker-compose
  when: lab_project_stat.stat.exists
  command: 'docker-compose up -d'
  args:
    chdir: "{{ lab_project_dir }}"

vim roles/lab_project/tasks/install_base.yml
---
# possible saved as install_based.yml
- name: Install pip
  yum:
    name: python2-pip
    state: installed

- name: Install docker python lib
  pip:
    name: docker

- name: Install git package
  yum:
    name: git
    state: present
    
vim roles/lab_project/tasks/pull_base_image.yml
 ---
# possible saved as pull_base_image.yml
- name: pull base image
  docker_image:
    name: "{{ item }}"
    state: present
  with_items:
    - mysql:5.7.20
    - python:3.8.0-alpine
    - nginx:1.16.1

vim roles/lab_project/vars/main.yml
---
lab_project_dir: /root/lab_project
gitlab_user: root
gitlab_pass: 1234qwer

cd root/repo/ansible-playbook
# 添加修改后的 ansible-playbook 項(xiàng)目到 gitlab
git add .
# 提交
git commit -m"This is my lab_project ansible playbook commit"
#  輸入賬號(hào)密碼昼弟,同步本地master分支到遠(yuǎn)程服務(wù)器當(dāng)中
git -c http.sslVerify=false push origin master

Jenkins

Freestyle 任務(wù)構(gòu)建和自動(dòng)化部署

# 進(jìn)入 Jenkins 
# Jenkins 進(jìn)入 New Item 新建任務(wù)
輸入 lab_project 選擇Freestyle project
# 編輯描述信息
Description:This is lab project job
# 選擇參數(shù)化構(gòu)建過(guò)程,添加參數(shù)
# This project is parameterized -> Add Parameter -> Choice Parameter (選項(xiàng)參數(shù))
Name : deploy_env
Choices : dev
         prod
Description : Choose deploy environment
# 選擇 add Parameter 選擇 String Parameter (文本參數(shù))
Name : branch
Default Value : master
Description : Build branch
# 配置源代碼管理
進(jìn)入 gitlab 倉(cāng)庫(kù)奕筐, 選擇 Administrator / test-repo 代碼倉(cāng)庫(kù) clone URL
將 https://gitlab.example.com/root/ansible-playbook-repo.git 粘貼到
Jenkins Source Code Management 的 Git 選項(xiàng)中的 Repository URL
Credentials 選擇之前創(chuàng)建的 Git Credential 憑據(jù) (憑據(jù)驗(yàn)證通過(guò)可以看到錯(cuò)誤消失)
# Build配置 -e branch=$branch -e env=$deploy_env 表示在 jenkins 的環(huán)境變量引入到 ansible
選則 Build舱痘,點(diǎn)擊 Add build step变骡,選則 Execute shell
在 command 中輸入

#!/bin/sh

set +x
source /root/ansible/hacking/env-setup -q

cd $WORKSPACE/lab_project_playbook
ansible --version
ansible-playbook --version

ansible-playbook -i inventory/$deploy_env ./deploy.yml -e project=nginx -e branch=$branch -e env=$deploy_env

# 保存并開始構(gòu)建
# 訪問(wèn)部署目標(biāo)主機(jī)的域名或ip地址,即可訪問(wèn)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芭逝,一起剝皮案震驚了整個(gè)濱河市塌碌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铝耻,老刑警劉巖誊爹,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瓢捉,居然都是意外死亡频丘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門泡态,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)搂漠,“玉大人,你說(shuō)我怎么就攤上這事某弦⊥┨溃” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵靶壮,是天一觀的道長(zhǎng)怔毛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)腾降,這世上最難降的妖魔是什么拣度? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮螃壤,結(jié)果婚禮上抗果,老公的妹妹穿的比我還像新娘。我一直安慰自己奸晴,他們只是感情好冤馏,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著寄啼,像睡著了一般逮光。 火紅的嫁衣襯著肌膚如雪涕刚。 梳的紋絲不亂的頭發(fā)上走诞,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天蚣旱,我揣著相機(jī)與錄音,去河邊找鬼塞绿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛裹赴,可吹牛的內(nèi)容都是我干的诀浪。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼睛竣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了射沟?” 一聲冷哼從身側(cè)響起与境,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤摔刁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后簸搞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡域仇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年暇务,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怔软。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡括改,死狀恐怖嘱能,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惹骂,我是刑警寧澤苏携,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布右冻,位于F島的核電站纱扭,受9級(jí)特大地震影響茫死,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜峦萎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一爱榔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧详幽,春花似錦、人聲如沸版姑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)表制。三九已至控乾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜕衡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工久脯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓骡和,卻偏偏與公主長(zhǎng)得像相寇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唤衫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344