Jenkins + Ansible + Gitlab(二)

版本控制系統    Gitlab Github

持續集成工具    Jenkins

部署工具    Ansible Saltstack Chef

本文經過Jenkins + Ansible + Gitlab實現自動化部署。html


Ansible介紹

Ansible是一個開源部署工具,由Python開發,不須要安裝客戶端,經過SSH協議通訊,全平臺,模塊化部署管理。python

  • 區別:
Chef
    Ruby開發,C/S架構,配置須要Git依賴,
    Recipe腳本編寫規範,須要編程經驗
    
Saltstack
    Python開發,C/S架構,模塊化配置管理,
    TAML腳本編寫規範,適合大規模集羣部署
    
Ansible
    Python開發,無Client,模塊化配置管理,
    Playbook腳本編寫規範,易於上手,適合中小規模快速部署

  • ansible的優點:
1. 輕量級,無客戶端(agentless)

2. 開源免費,學習成本低,快速上手

3. 使用Playbook做爲核心配置架構,統一的腳本格式

4. 完善的模塊化擴展,支持目前主流的開發場景

5. 強大的穩定性和兼容性


環境準備

3臺機器須要作環境準備。mysql

  • 角色劃分:
Jenkins + Ansible   192.168.30.128

test host   192.168.30.129

gitlab  192.168.30.130

  • 關閉防火牆和selinux:
# systemctl stop firewalld && systemctl disable firewalld# setenforce 0 && sed -i 's/=enforcing/=disabled/g' /etc/selinux/config

  • 添加本地dns:
# vim /etc/hosts192.168.30.128 jenkins.lzxlinux.com
192.168.30.129 test.lzxlinux.com
192.168.30.130 gitlab.lzxlinux.com

在Windows電腦hosts文件中添加本地dns:linux

192.168.30.128 jenkins.lzxlinux.com
192.168.30.129 test.lzxlinux.com
192.168.30.130 gitlab.lzxlinux.com


Ansible安裝

ansible有兩種安裝方式。nginx

  • yum安裝(不推薦):
# yum install -y ansible

  • git安裝(推薦):
# yum install -y git nss curl zlib* libffi-devel openssl openssl-devel# cd /software# wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz# tar zxf Python-3.7.3.tgz# cd Python-3.7.3# ./configure --prefix=/usr/local --with-ensurepip=install --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"# make && make altinstall# ln -s /usr/local/bin/pip3.7 /usr/local/bin/pip

# pip install --upgrade pip# pip install virtualenv# useradd deploy                #建立ansible部署用戶deploy# su - deploy$ virtualenv -p /usr/local/bin/python3.7 .py3-a2.8-env

$ cd /home/deploy/.py3-a2.8-env

$ git clone https://github.com/ansible/ansible.git

$ source /home/deploy/.py3-a2.8-env/bin/activate

$ pip install paramiko PyYAML jinja2

$ cd ansible/

$ git checkout stable-2.8

$ source /home/deploy/.py3-a2.8-env/ansible/hacking/env-setup -q

$ ansible --version

ansible 2.8.5.post0
  config file = None
  configured module search path = ['/home/deploy/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/deploy/.py3-a2.8-env/ansible/lib/ansible
  executable location = /home/deploy/.py3-a2.8-env/ansible/bin/ansible
  python version = 3.7.3 (default, Oct  9 2019, 18:19:25) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]

經過這種方式安裝的ansible隔離於宿主機的python環境。git

  • 免密認證:
(.py3-a2.8-env) [deploy@test1 ansible]$ ssh-keygen -t rsa               #直接回車(.py3-a2.8-env) [deploy@test1 ansible]$ ssh-copy-id -i /home/deploy/.ssh/id_rsa.pub root@test.lzxlinux.com(.py3-a2.8-env) [deploy@test1 ansible]$ ssh root@test.lzxlinux.com
Last login: Fri Oct 11 17:56:06 2019 from 192.168.30.1# logoutConnection to test.lzxlinux.com closed.


Playbook介紹

Playbook是ansible的腳本,不一樣於ansible命令行,是經過YAML格式來編寫的。github

  • 核心組成元素:
Tasks:任務,執行的任務列表

Vars:變量,執行playbook須要定義的變量

Templates:模板,執行playbook的模板文件,通常爲腳本

Handlers:處理器,條件觸發執行的操做

Roles:角色,由上面Tasks、Vars、Templates、Handlers等組成

  • 框架與格式:

對於一個playbook,如test playbook,大體框架以下,sql

inventory/      server詳細清單目錄
    testenv     具體清單與變量聲明文件
roles/      roles任務列表
    textbox/        testbox詳細任務
        tasks/
            main.yml        testbox主任務文件
            task1.yml       testbox其它任務文件
            task2.yml
deploy.yml      playbook任務入口文件

testenv的格式以下,shell

[testservers]       多個相同部署任務的server組成一個server組
test.example.com        目標部署主機hostname、domain、ip
test.lzxlinux.com
192.168.30.100

[testservers:vars]      server組參數
server_name=test.example.com        目標主機key/value參數
user=root
output=/root/test.txt

main.yml的格式以下,編程

#引用同目錄下其它任務文件- include:task1.yml- include:task2.yml

task1.yml的格式以下,

- name: print server name               #任務名稱
  shell: "echo {{ server_name }}"               #使用shell模塊執行命令
  - name: print server user  shell: "echo {{ user }}"

deploy.yml的格式以下,

- hosts: "testservers"              #server組
  gather_facts: true                #獲取server基本信息,便於使用內置變量,如當前主機ip
  remote_user: root             #執行任務的server系統用戶
  roles:
    - testbox               #執行role包含的任務

  • ssh免密認證:

ansible部署節點建立ssh本地密鑰

# ssh-keygen -t rsa

拷貝公鑰至目標節點

# ssh-copy-id -i root@test.example.com


Ansible經常使用模塊

無論是使用命令行執行ansible命令,仍是經過playbook執行ansible命令,都要經過ansible模塊來執行。

  • group模塊:

管理目標節點上的用戶組及其權限。

示例:

- name: create group mysql  group: name=mysql state=present

  • user模塊:

管理目標節點上的用戶及其權限。

示例:

- name: create user mysql  user: name=mysql group=mysql state=present create_home=False shell=/sbin/nologin

  • file模塊:

在目標節點建立文件或目錄,並賦予其系統權限(屬主屬組、rwx及特殊權限等)。

示例:

- name: create a file  file: name=/root/1.txt state=touch owner=root group=root mode=0644

  • copy模塊:

實現ansible部署節點到目標節點的文件傳送,同時可指定文件的系統權限。

示例:

- name: copy a file  copy: src=/root/1.txt dest=/tmp/1.txt owner=root group=root mode=0644 force=yes

  • stat模塊:

獲取遠程文件狀態信息。

示例:

- name: check if foo.sh exists  stat: path=/root/foo.sh  register: script_stat

  • debug模塊:

打印語句到ansible執行輸出。

示例:

- debug: msg=foo.sh exists  when: script_stat.stat.exists

  • command/shell模塊:

用來執行linux命令行。

示例:

- name: run the script  command: "sh /root/foo.sh"
  - name: run the script  shell: "echo 'test' > /root/1.txt"

shell支持$home$HOME<<<>>>|;&;而command不支持這些。通常狀況下推薦使用shell模塊。

  • template模塊:

實現ansible部署節點到目標節點的jinja2模板傳送,同時可指定文件的系統權限。

示例:

- name: write the nginx config file  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf owner=root group=root

  • yum模塊:

用來管理redhat系的Linux上的安裝包。

示例:

- name: install the latest version of Nginx  yum:
    name: nginx    state: latest

  • service模塊:

用來管理模板節點的系統服務。

示例:

- name: start nginx service and enable nginx service  service: 
    name: nginx    state: started    enabled: yes

  • get_url模塊:

用來下載指定連接的文件。

示例:

- name: download mysql tar package  get_url: 
    url=https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-5.7/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
    dest=/software

  • unarchive模塊:

用來解壓目標節點上的壓縮包。

參數:

copy:默認爲yes,當copy=yes,那麼拷貝的文件是從ansible主機複製到遠程主機上的;若是設置爲copy=no,那麼會在遠程主機上src路徑尋找源文件。

src:源路徑,能夠是部署節點上的路徑,也能夠是目標節點上的路徑,若是是目標節點上的路徑,則須要設置copy=no。

示例:

- name: unarchive mysql tar package  unarchive: src=/software/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz dest=/usr/local/ owner=mysql group=mysql copy=no

經常使用模塊案例操做參考:ansible-playbook批量部署nginx

相關文章
相關標籤/搜索