版本控制系統 Gitlab Github 持續集成工具 Jenkins 部署工具 Ansible Saltstack Chef
本文經過Jenkins + Ansible + Gitlab
實現自動化部署。html
Ansible是一個開源部署工具,由Python開發,不須要安裝客戶端,經過SSH協議通訊,全平臺,模塊化部署管理。python
Chef Ruby開發,C/S架構,配置須要Git依賴, Recipe腳本編寫規範,須要編程經驗 Saltstack Python開發,C/S架構,模塊化配置管理, TAML腳本編寫規範,適合大規模集羣部署 Ansible Python開發,無Client,模塊化配置管理, Playbook腳本編寫規範,易於上手,適合中小規模快速部署
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
# systemctl stop firewalld && systemctl disable firewalld# setenforce 0 && sed -i 's/=enforcing/=disabled/g' /etc/selinux/config
# 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有兩種安裝方式。nginx
# yum install -y ansible
# 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是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包含的任務
ansible部署節點建立ssh本地密鑰
# ssh-keygen -t rsa
拷貝公鑰至目標節點
# ssh-copy-id -i root@test.example.com
無論是使用命令行執行ansible命令,仍是經過playbook執行ansible命令,都要經過ansible模塊來執行。
管理目標節點上的用戶組及其權限。
示例:
- name: create group mysql group: name=mysql state=present
管理目標節點上的用戶及其權限。
示例:
- name: create user mysql user: name=mysql group=mysql state=present create_home=False shell=/sbin/nologin
在目標節點建立文件或目錄,並賦予其系統權限(屬主屬組、rwx及特殊權限等)。
示例:
- name: create a file file: name=/root/1.txt state=touch owner=root group=root mode=0644
實現ansible部署節點到目標節點的文件傳送,同時可指定文件的系統權限。
示例:
- name: copy a file copy: src=/root/1.txt dest=/tmp/1.txt owner=root group=root mode=0644 force=yes
獲取遠程文件狀態信息。
示例:
- name: check if foo.sh exists stat: path=/root/foo.sh register: script_stat
打印語句到ansible執行輸出。
示例:
- debug: msg=foo.sh exists when: script_stat.stat.exists
用來執行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模塊。
實現ansible部署節點到目標節點的jinja2模板傳送,同時可指定文件的系統權限。
示例:
- name: write the nginx config file template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf owner=root group=root
用來管理redhat系的Linux上的安裝包。
示例:
- name: install the latest version of Nginx yum: name: nginx state: latest
用來管理模板節點的系統服務。
示例:
- name: start nginx service and enable nginx service service: name: nginx state: started enabled: yes
用來下載指定連接的文件。
示例:
- 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
用來解壓目標節點上的壓縮包。
參數:
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