1. 程式人生 > >通過 Ansible 建立 Jenkins Server

通過 Ansible 建立 Jenkins Server

Ansible roles(角色)

Ansible 中除了 playbook,還有更高層級的抽象,稱為 role(角色)。所謂的 role 其實就是把一些 playbook 組織成為一個更簡潔、清晰的可重用物件。比如把安裝 Jenkins Server 的 playbook 組織成為一個 role。
感謝開源社群,當我們需要安裝 Jenkins Server 的時候並不需要自己寫一個對應的 role,直接使用大神們寫好的就可以了。

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

ansible-galaxy 命令
通過 ansible-galaxy 命令可以把上面搜尋到的 role 安裝到本地:

$ ansible-galaxy install geerlingguy.jenkins

由於 geerlingguy.jenkins role 依賴 geerlingguy.java role,所以在安裝 geerlingguy.jenkins role 的同時也安裝了 geerlingguy.java role。預設的安裝目錄在當前使用者家目錄下的 .ansible/roles
同時會安裝其依賴的 geerlingguy.java role(能夠自行處理依賴關係):

瞭解 jenkins role 的基本配置

我們安裝的 geerlingguy.jenkins role 的主要配置檔案為:~/.ansible/roles/geerlingguy.jenkins/defaults/main.yml。下面介紹一下其中的一些比較重要的配置項。
jenkins_package_state: present
安裝的 jenkins 版本,present 表示僅安裝系統預設包中的版本,如果需要最新版本的 jenkins,需要把 jenkins_package_state 設定為 latest。

jenkins_hostname: localhost
通過 http 協議訪問 Jenkins 時使用的域名或主機名稱,作為演示,設定為 localhost 就可以了。

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

jenkins_http_port: 8080
Jenkins 伺服器監聽的埠號。

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)