創(chuàng)建 CI 流程的第一件事應(yīng)該是安裝 CI 工具,本文以最常見的 Jenkins 為例,介紹如何使用 Ansible 自動安裝 Jenkins Server。說明:本文的演示環(huán)境為 Ubuntu 16.04。
Ansible roles(角色)
Ansible 中除了 playbook,還有更高層級的抽象,稱為 role(角色)。所謂的 role 其實(shí)就是把一些 playbook 組織成為一個更簡潔、清晰的可重用對象。比如把安裝 Jenkins Server 的 playbook 組織成為一個 role。
感謝開源社區(qū),當(dāng)我們需要安裝 Jenkins Server 的時候并不需要自己寫一個對應(yīng)的 role,直接使用大神們寫好的就可以了。
Ansible Galaxy
Ansible Galaxy 是社區(qū)和分享 Ansible role 的地方。直接搜索 jenkins,由 geerlingguy 貢獻(xiàn)的 jenkins role 是目前最受歡迎的:
ansible-galaxy 命令
通過 ansible-galaxy 命令可以把上面搜索到的 role 安裝到本地:
$ ansible-galaxy install geerlingguy.jenkins
由于 geerlingguy.jenkins role 依賴 geerlingguy.java role,所以在安裝 geerlingguy.jenkins role 的同時也安裝了 geerlingguy.java role。默認(rèn)的安裝目錄在當(dāng)前用戶家目錄下的 .ansible/roles
同時會安裝其依賴的 geerlingguy.java role(能夠自行處理依賴關(guān)系):
了解 jenkins role 的基本配置
我們安裝的 geerlingguy.jenkins role 的主要配置文件為:~/.ansible/roles/geerlingguy.jenkins/defaults/main.yml。下面介紹一下其中的一些比較重要的配置項(xiàng)。
jenkins_package_state: present
安裝的 jenkins 版本,present 表示僅安裝系統(tǒng)默認(rèn)包中的版本,如果需要最新版本的 jenkins,需要把 jenkins_package_state 設(shè)置為 latest。
jenkins_hostname: localhost
通過 http 協(xié)議訪問 Jenkins 時使用的域名或主機(jī)名稱,作為演示,設(shè)置為 localhost 就可以了。
jenkins_home: /var/lib/jenkins
Jenkins 的主目錄。
jenkins_http_port: 8080
Jenkins 服務(wù)器監(jiān)聽的端口號。
jenkins_url_prefix: “”
如果不想通過域名或主機(jī)名稱直接訪問 Jenkins,可以設(shè)置 jenkins_url_prefix 變量。比如設(shè)置為 /jenkins,這樣我們就需要通過下面的 URL 來訪問 Jenkins server 了:
http://localhost:8080/jenkins
jenkins_jar_location: /opt/jenkins-cli.jar
Jenkins CLI 程序的位置,該程序主要用來以命令行的方式與 Jenkins server 交互。
jenkins_plugins: []
指定在安裝 Jenkins server 的同時安裝的插件,默認(rèn)是一個插件都不裝的:
如果需要安裝插件,使用逗號分隔插件名稱并寫入到中括號中就可以了,下面是一個小 demo:
[junit,greenballs,git]
jenkins_plugins_state: present
指定插件的版本,如果設(shè)置為 latest,就會保證所有的插件都是最新版本。
jenkins_plugin_timeout: 30
安裝插件時的連接超時時間。需要注意安裝插件時的超時問題,國內(nèi)安裝插件非常耗時,最好把 jenkins_plugin_timeout 設(shè)置的大些,不然經(jīng)常會碰到 timeout 錯誤:
jenkins_plugins_install_dependencies: true
安裝插件時是否安裝其所依賴的插件。
jenkins_admin_username: admin
jenkins_admin_password: admin
安裝 Jenkins 時創(chuàng)建的管理員賬號和密碼。
jenkins_java_options: “-Djenkins.install.runSetupWizard=false”
可以通過 jenkins_java_options 來設(shè)置額外的 java 命令行參數(shù)。比如我們可以通過下面的配置來設(shè)置 Jenkings server 的時區(qū)為紐約:
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 版本,這樣每次都會安裝相同的版本,當(dāng)然必須是出現(xiàn)在 http://pkg.jenkins-ci.org/debian/ (Ubuntu)中的版本。
如果你不想使用官方的包,可以通過 jenkins_pkg_url 指定自己的包。默認(rèn)這兩個選項(xiàng)是被注釋掉的,也就是說會安裝官方的包。
jenkins_connection_delay: 5
jenkins_connection_retries: 60
啟動后連接到 Jenkins 時需要等待的時間和次數(shù),以驗(yàn)證 Jenkins 是否正在運(yùn)行。等待的總時間=延遲*重試,因此默認(rèn)情況下,這個角色在超時前將等待 300 秒。
jenkins_init_changes:
– option: “JENKINS_ARGS”
value: “–prefix={{ jenkins_url_prefix }}”
– option: “JENKINS_JAVA_OPTIONS”
value: “{{ jenkins_java_options }}”
修改 Jenkings 的初始腳本,默認(rèn)的更改設(shè)置了配置的 URL 前綴,并為 Jenkins 的啟動添加了配置的 Java 選項(xiàng)。如果要為 Jenkins 的初始化腳本設(shè)置其他選項(xiàng),添加其他的 選項(xiàng)/值 就可以了。
下面的配置與平臺相關(guān),所以 Ubuntu 相關(guān)的配置放在配置文件 ~/.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
默認(rèn)安裝的是 Jenkins 的最新版本,如果要安裝穩(wěn)定版本請?jiān)O(shè)置為下面的配置:
# 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
先在目標(biāo)機(jī)器上安裝 curl
由于在安裝 Jenkins 的時候需要用到 curl 工具,所以有必要先安裝該工具。具體的做法我們可以寫一個簡單 playbook 來實(shí)現(xiàn),把下面的內(nèi)容保存到文件 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 來保存目標(biāo)主機(jī):
[jenkinsservers] 192.168.21.145
最后執(zhí)行命令在目標(biāo)機(jī)器上安裝 curl:
$ ansible-playbook -u nick pb_curl.yml
如果你還不熟悉 Ansible 及其 playbook,請參考筆者的《Ansible 簡介》一文。
安裝 Jenkins
下面我們創(chuàng)建一個非常簡單的 playbook 文件 pb_jenkins.yml,其中引用已經(jīng)安裝好的 role 來完成 jenkins 的安裝:
--- - hosts: jenkinsservers vars: jenkins_hostname: localhost roles: - role: geerlingguy.java become: yes - role: geerlingguy.jenkins become: yes
注意,playbook 中先配置了 geerlingguy.java 來安裝 Jenkins 依賴的 java。
執(zhí)行下面的命令進(jìn)行安裝:
$ ansible-playbook -u nick pb_jenkins.yml
安裝成功后,到目標(biāo)機(jī)器上檢查一下:
Jenkins 服務(wù)器已經(jīng)可以正常運(yùn)行了,但此時只能通過 localhost 在本機(jī)訪問。如果需要在局域網(wǎng)內(nèi)訪問,在配置文件中把 localhost 換成主機(jī)的 IP 就可以了。
注意,Ansible 的命令是可以重復(fù)執(zhí)行的,如果因?yàn)榫W(wǎng)絡(luò)等原因造成的失敗問題,可以調(diào)整相關(guān)的超時參數(shù)然后重新執(zhí)行一遍就行了。
總結(jié)
對于自動化來說,其本質(zhì)是件一直在路上的工作。明確目標(biāo),然后找對工具進(jìn)行持續(xù)的改進(jìn)。筆者認(rèn)為 Ansible 就是這么一款值得信賴的自動化利器,并且它能夠通過 playbook 和 role 等概念把我們的使用經(jīng)驗(yàn)積淀下來進(jìn)行分享。
參考:
Integrating Ansible with Jenkins in a CI/CD process
ansible-role-jenkins
galaxy role jenkins(geerlingguy)