經過 Ansible role 安裝 Jenkins Server

建立 CI 流程的第一件事應該是安裝 CI 工具,本文以最多見的 Jenkins 爲例,介紹如何使用 Ansible 自動安裝 Jenkins Server。說明:本文的演示環境爲 ubuntu 16.04。html

Ansible roles(角色)

Ansible 中除了 playbook,還有更高層級的抽象,稱爲 role(角色)。所謂的 role 其實就是把一些 playbook 組織成爲一個更簡潔、清晰的可重用對象。好比把安裝 Jenkins Server 的 playbook 組織成爲一個 role。
感謝開源社區,當咱們須要安裝 Jenkins Server 的時候並不須要本身寫一個對應的 role,直接使用大神們寫好的就能夠了。java

Ansible Galaxy
Ansible Galaxy 是社區和分享 Ansible role 的地方。直接搜索 jenkins,由 geerlingguy 貢獻的 jenkins role 是目前最受歡迎的:git

ansible-galaxy 命令
經過 ansible-galaxy 命令能夠把上面搜索到的 role 安裝到本地:github

$ ansible-galaxy install geerlingguy.jenkins

因爲 geerlingguy.jenkins role 依賴 geerlingguy.java role,因此在安裝 geerlingguy.jenkins role 的同時也安裝了 geerlingguy.java role。默認的安裝目錄在當前用戶家目錄下的 .ansible/roles
同時會安裝其依賴的 geerlingguy.java role(可以自行處理依賴關係):apache

瞭解 jenkins role 的基本配置

咱們安裝的 geerlingguy.jenkins role 的主要配置文件爲:~/.ansible/roles/geerlingguy.jenkins/defaults/main.yml。下面介紹一下其中的一些比較重要的配置項。
jenkins_package_state: present
安裝的 jenkins 版本,present 表示僅安裝系統默認包中的版本,若是須要最新版本的 jenkins,須要把 jenkins_package_state 設置爲 latest。ubuntu

jenkins_hostname: localhost
經過 http 協議訪問 Jenkins 時使用的域名或主機名稱,做爲演示,設置爲 localhost 就能夠了。服務器

jenkins_home: /var/lib/jenkins
Jenkins 的主目錄。網絡

jenkins_http_port: 8080
Jenkins 服務器監聽的端口號。curl

jenkins_url_prefix: ""
若是不想經過域名或主機名稱直接訪問 Jenkins,能夠設置 jenkins_url_prefix 變量。好比設置爲 /jenkins,這樣咱們就須要經過下面的 URL 來訪問 Jenkins server 了:
http://localhost:8080/jenkins工具

jenkins_jar_location: /opt/jenkins-cli.jar
Jenkins CLI 程序的位置,該程序主要用來以命令行的方式與 Jenkins server 交互。

jenkins_plugins: []
指定在安裝 Jenkins server 的同時安裝的插件,默認是一個插件都不裝的:

若是須要安裝插件,使用逗號分隔插件名稱並寫入到中括號中就能夠了,下面是一個小 demo:
[junit,greenballs,git]

jenkins_plugins_state: present
指定插件的版本,若是設置爲 latest,就會保證全部的插件都是最新版本。

jenkins_plugin_timeout: 30
安裝插件時的鏈接超時時間。須要注意安裝插件時的超時問題,國內安裝插件很是耗時,最好把 jenkins_plugin_timeout 設置的大些,否則常常會碰到 timeout 錯誤:

jenkins_plugins_install_dependencies: true
安裝插件時是否安裝其所依賴的插件。

jenkins_admin_username: admin
jenkins_admin_password: admin
安裝 Jenkins 時建立的管理員帳號和密碼。

jenkins_java_options: "-Djenkins.install.runSetupWizard=false"
能夠經過 jenkins_java_options 來設置額外的 java 命令行參數。好比咱們能夠經過下面的配置來設置 Jenkings server 的時區爲紐約:
jenkins_java_options: "-Dorg.apache.commons.jelly.tags.fmt.timeZone=America/New_York"

jenkins_version: "1.644"
jenkins_pkg_url: "http://www.example.com"
這兩個配置是可選的,經過 jenkins_version 變量咱們能夠指定安裝的 Jenkins 版本,這樣每次都會安裝相同的版本,固然必須是出如今 http://pkg.jenkins-ci.org/debian/ (Ubuntu)中的版本。
若是你不想使用官方的包,能夠經過 jenkins_pkg_url 指定本身的包。默認這兩個選項是被註釋掉的,也就是說會安裝官方的包。

jenkins_connection_delay: 5
jenkins_connection_retries: 60
啓動後鏈接到 Jenkins 時須要等待的時間和次數,以驗證 Jenkins 是否正在運行。等待的總時間=延遲*重試,所以默認狀況下,這個角色在超時前將等待 300 秒。

jenkins_init_changes:
  - option: "JENKINS_ARGS"
    value: "--prefix={{ jenkins_url_prefix }}"
  - option: "JENKINS_JAVA_OPTIONS"
    value: "{{ jenkins_java_options }}"
修改 Jenkings 的初始腳本,默認的更改設置了配置的 URL 前綴,併爲 Jenkins 的啓動添加了配置的 Java 選項。若是要爲 Jenkins 的初始化腳本設置其餘選項,添加其餘的 選項/值 就能夠了。

下面的配置與平臺相關,因此 Ubuntu 相關的配置放在配置文件 ~/.ansible/roles/geerlingguy.jenkins/vars/Debian.yml 中:
# For Debian (role default):
__jenkins_repo_url: deb https://pkg.jenkins.io/debian binary/
__jenkins_repo_key_url: https://pkg.jenkins.io/debian/jenkins.io.key
默認安裝的是 Jenkins 的最新版本,若是要安裝穩定版本請設置爲下面的配置:
# For Debian/Ubuntu LTS:
__jenkins_repo_url: deb http://pkg.jenkins-ci.org/debian-stable binary/
__jenkins_repo_key_url: http://pkg.jenkins-ci.org/debian-stable/jenkins-ci.org.key

先在目標機器上安裝 curl

因爲在安裝 Jenkins 的時候須要用到 curl 工具,因此有必要先安裝該工具。具體的作法咱們能夠寫一個簡單 playbook 來實現,把下面的內容保存到文件 pb_curl.yml 文件中:

---
- hosts: jenkinsservers
  become: true
  become_user: root
  tasks:
    - name: install curl on Ubuntu
      apt:
        name: curl
        state: 'latest'
        update_cache: no

而後在 /etc/ansible/hosts 文件中添加一個組 jenkinsservers 來保存目標主機:

[jenkinsservers]
192.168.21.145

最後執行命令在目標機器上安裝 curl:

$ ansible-playbook -u nick pb_curl.yml

若是你還不熟悉 Ansible 及其 playbook,請參考筆者的《Ansible 簡介》一文。

安裝 Jenkins

下面咱們建立一個很是簡單的 playbook 文件 pb_jenkins.yml,其中引用已經安裝好的 role 來完成 jenkins 的安裝:

---
- hosts: jenkinsservers
  vars:
    jenkins_hostname: localhost
  roles:
    - role: geerlingguy.java
      become: yes
    - role: geerlingguy.jenkins
      become: yes

注意,playbook 中先配置了 geerlingguy.java 來安裝 Jenkins 依賴的 java。
執行下面的命令進行安裝:

$ ansible-playbook -u nick pb_jenkins.yml 

安裝成功後,到目標機器上檢查一下:

Jenkins 服務器已經能夠正常運行了,但此時只能經過 localhost 在本機訪問。若是須要在局域網內訪問,在配置文件中把 localhost 換成主機的 IP 就能夠了。
注意,Ansible 的命令是能夠重複執行的,若是由於網絡等緣由形成的失敗問題,能夠調整相關的超時參數而後從新執行一遍就好了。

總結

對於自動化來講,其本質是件一直在路上的工做。明確目標,而後找對工具進行持續的改進。筆者認爲   Ansible 就是這麼一款值得信賴的自動化利器,而且它可以經過 playbook 和 role 等概念把咱們的使用經驗積澱下來進行分享。

參考:
Integrating Ansible with Jenkins in a CI/CD process
ansible-role-jenkins
galaxy role jenkins(geerlingguy)

相關文章
相關標籤/搜索