使用Terraform在AWS上部署Jenkins
持續集成,持續交付和持續部署,這些概念和術語可以協同工作以實現應用程序生命周期的自動化,在這方面,如果您要實施CI/ CD,Jenkins可能是建立服務器以自動化該過程的主要工具。
這篇文章是部署以AWS Amazon作為IaaS的Jenkins的簡單任務。為了全面了解,我們將安裝Jenkins及其插件,注冊用戶,設置基本的安全規則,最后插入一個作業作為示例,因此,讓我們進一步闡述一下這個想法。
先決條件
- AWS Amazon中的EC2實例來測試此技術說明。
- 安裝terraform作為“基礎結構即代碼”工具。
安裝Jenkins及其工作
首先,我們需要觀看本節,因為這是我們可以找到如何通過腳本bash安裝Jenkins的過程,該bash腳本是作為通用腳本制作的,可在不同的CentOS Linux上使用。此安裝分為5部分,首先我們將安裝并啟動Jenkins,然后我們將注冊一個默認用戶并安裝基本插件,最后,注冊我們最好的朋友HelloWorld job,這將是一個很好的例子一個好的開始。
- jenkins_user=$1
- jenkins_password=$2
- jenkins_address=http://localhost:8080
- set -x
- function installing()
- {
- #Installing some necessary dependencies
- sudo yum -y update
- sudo yum -y install wget java-1.8.0 nano nc
- #Installing jenkins, instructions located in http://pkg.jenkins-ci.org/redhat/
- sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
- sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
- sudo yum install -y jenkins
- sleep 1
- echo "[INFO] Jenkins was installed"
- }
請注意,bash腳本中的plugins函數對于首次安裝登錄Jenkins時建議的所有插件是必需的,這是自定義此工具的一部分,并且是注冊默認用戶所必需的。循環以檢查Jenkins服務器是否正在運行,您可以在啟動和插件功能時觀看。
- function plugins()
- {
- #Installing jenkins plugins
- java -jar jenkins-cli.jar -s "$jenkins_address" -auth $jenkins_user:$jenkins_password install-plugin trilead-api
- java -jar jenkins-cli.jar -s "$jenkins_address" -auth $jenkins_user:$jenkins_password install-plugin cloudbees-folder
- ... many more plugins ...
- java -jar jenkins-cli.jar -s "$jenkins_address" -auth $jenkins_user:$jenkins_password install-plugin pam-auth
- java -jar jenkins-cli.jar -s "$jenkins_address" -auth $jenkins_user:$jenkins_password install-plugin ldap
- java -jar jenkins-cli.jar -s "$jenkins_address" -auth $jenkins_user:$jenkins_password install-plugin email-ext
- # Restart
- sudo systemctl restart jenkins &
- while (( 1 )); do
- echo "[INFO] waiting for restart Jenkins on port [8080] ..."
- java -jar jenkins-cli.jar -s "$jenkins_address" -auth $jenkins_user:$jenkins_password list-jobs
- if (( $? == 0 )); then
- break
- fi
- sleep 20
- done
- echo "[INFO] Jenkins was restarted"
您還記得啟動Jenkins服務器的公告嗎?如果您不想再看到它,則應該實現插件功能。
下面是一個簡單的任務,介紹了如何通過Jenkins CLI在Jenkins中添加作業,這是帶有字符串參數的Pipeline作業。
- <?xml version='1.1' encoding='UTF-8'?>
- <flow-definition plugin="workflow-job@2.40">
- <description></description>
- <keepDependencies>false</keepDependencies>
- <properties>
- <hudson.model.ParametersDefinitionProperty>
- <parameterDefinitions>
- <hudson.model.StringParameterDefinition>
- <name>par_name</name>
- <description></description>
- <defaultValue>HelloWorld</defaultValue>
- <trim>false</trim>
- </hudson.model.StringParameterDefinition>
- </parameterDefinitions>
- </hudson.model.ParametersDefinitionProperty>
- </properties>
- <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps@2.83">
- <script>pipeline {
- agent { label 'master' }
- stages {
- stage('build') {
- steps {
- echo "Hello World!"
- }
- }
- }
- }</script>
- <sandbox>true</sandbox>
- </definition>
- <triggers/>
- <disabled>false</disabled>
- </flow-definition>
將Jenkins部署為服務器
該文件中提供了常規變量,請注意一些屬性,這些屬性需要由您配置的AWS CLI變量替換。請參閱《AWS CLI命令參考》中的更多信息。
- variable "region" {
- default = "us-east-1"
- description = "AWS region"
- }
- variable "access_key" {
- default = "HEREYOURACCESSKEY"
- description = "AWS credentials file path"
- }
- variable "secret_key" {
- default = "HEREYOURSECRETKEY"
- description = "AWS credentials file path"
- }
- variable "jenkins_user_name" {
- description = "jenkins"
- default = "jenkins"
- }
- variable "jenkins_user_password" {
- description = "jenkins"
- default = "jenkins"
- }
- variable "jenkins_name" {
- description = "Jenkins name"
- default = "jenkins"
- }
- variable "jenkins_instance_type" {
- default = "t2.micro"
- }
- variable "jenkins_key_name" {
- default = "key-pair"
- description = "SSH key located in tyour AWS account."
- }
- variable "amis" {
- description = "ami to spawn."
- default = {
- us-east-1 = "ami-0c94855ba95c71c99"
- }
- }
有幾個屬性需要設置:
access_key和secret_key:用作訪問密鑰,用于驗證命令請求。
jenkins_key_name:密鑰對文件的名稱,將有助于通過ssh連接到我們的實例。如果您需要創建密鑰對,請通過我的安全憑證部分中的處理程序進入您的AWS賬戶。注意,在此示例中,我們使用了位于該項目的Template文件夾中的key-pair.pem,用您的憑據替換此文件及其在項目中的名稱。
amis:此屬性可以是一個列表,并具有可以在Amazon Machine Instances中輕松找到的AMI實例ID,如果您想更改此AMI實例,請注意是否已安裝AMI已安裝systemctl,因為Amazon Linux不支持systemclt或服務命令基于其基于CentOS / RHEL的版本,因此為了避免花費大量時間搜索已經配置了他的systemctl的AMI實例,請嘗試使用在此項目中配置的AMI實例。
- resource "aws_instance" "jenkins" {
- instance_type = "${var.jenkins_instance_type}"
- security_groups = ["${aws_security_group.security_group_jenkins.name}"]
- ami = "${lookup(var.amis, var.region)}"
- key_name = "${var.jenkins_key_name}"
- # Add jenkins server startup
- provisioner "file" {
- connection {
- user = "ec2-user"
- host = "${aws_instance.jenkins.public_ip}"
- timeout = "1m"
- private_key = "${file("templates/${var.jenkins_key_name}.pem")}"
- }
- source = "templates/jenkins_startup.sh"
- destination = "/home/ec2-user/jenkins_startup.sh"
- }
- # Add jenkins job
- provisioner "file" {
- connection {
- user = "ec2-user"
- host = "${aws_instance.jenkins.public_ip}"
- timeout = "1m"
- private_key = "${file("templates/${var.jenkins_key_name}.pem")}"
- }
- source = "templates/jobmaster.xml"
- destination = "/home/ec2-user/jobmaster.xml"
- }
- provisioner "remote-exec" {
- connection {
- user = "ec2-user"
- host = "${aws_instance.jenkins.public_ip}"
- timeout = "1m"
- private_key = "${file("templates/${var.jenkins_key_name}.pem")}"
- }
- inline = [
- "chmod +x /home/ec2-user/jenkins*.sh",
- "/home/ec2-user/jenkins_startup.sh ${var.jenkins_user_name} ${var.jenkins_user_password}"
- ]
- }
- }
一旦配置了所有屬性,請執行命令行terraform init初始化工作文件夾,執行terraform計劃以監視所有部署計劃,一旦檢查完成,請執行命令行terraform申請部署基礎架構。
進入詹金斯
可以在AWS管理控制臺中找到,單擊“實例”部分,然后應如下創建一個新實例。
復制公共DNS,并在瀏覽器上鍵入此值,然后鍵入端口8080(如鏡像所示),記住所有可用端口在main.tf文件的安全組部分中。用戶和密碼被配置為variables.tf文件中的屬性,因此在這種情況下,我們的用戶和密碼為“ Jenkins”。
結論
簡單實用,如果您想瀏覽此代碼,請在此存儲庫中單擊。也許,您已經看過許多有關Jenkins的安裝,但是我在許多安裝中都使用了這種bash和安裝方式,它使這些基本活動變得很輕松:注冊用戶,注冊基本工作和安裝插件。希望這項貢獻對您有所幫助。
腳本庫地址:https://github.com/moballiachi/cicd-jenkins.git
關于我們
澤陽,DevOps領域實踐者。專注于企業級DevOps運維開發技術實踐分享,主要以新Linux運維技術、DevOps技術課程為主。豐富的一線實戰經驗,課程追求實用性獲得多數學員認可。課程內容均來源于企業應用,在這里既學習技術又能獲取熱門技能,歡迎您的到來!(微信ID: devopsvip)