티스토리 뷰

Jenkins pipeline으로 OpenStack VM 및 연관 resource들을 생성하는 job을 실행해보자.
VM 기반의 서버에서의 테스트 같은 반복적인 작업이 존재할때 이를 활용하면 좋을것이라 판단되며 Infra에 대한 CICD 개념으로도 접근시에 유용할 것으로 판단된다.

 

OpenStack automation은 terraform의 openstack provider를 사용하였다.
아래 링크에 terraform script에 대해서는 나와있으니 참고 바란다.

참고로 terraform jenkins plugin은 설치하지 않았다.
개인적으로는 기능이 크게 있다고 판단되지 않았고 Jenkins Slave를 고정해놓고 사용하고 있기 때문에 불필요하다 판단하였다.

이제부터 설명할 Jenkinsfile은 다음 링크에 존재한다.
실제 OpenStack(stein)/Jenkins 2.249.1/terraform v0.13.5 에서 동작됨을 확인한 Jenkinsfile이다.

Jenkinsfile 분석

사전에 생성되어 있는 Jenkins Slave를 사용한다.
해당 Jenkins Slave에서는 해당 OpenStack의 keystone 및 각종 API 호출이 가능한 네트워크 환경을 가지고 있다.

pipeline {
    agent {
        node {
            label 'openstack-slave'
            customWorkspace "workspace/${env.JOB_NAME}/${env.BUILD_NUMBER}"
        }
    }

PARAMETER로 ssh key 및 image name, network 이름들을 입력받도록 하였다.

    parameters {
        string(name: 'PUBKEY',
            defaultValue: 'ssh-key xxxxx',
            description: 'ssh public key (ex. ~/.ssh/id_rsa.pub)')
        string(name: 'IMAGENAME',
            defaultValue: 'centos7',
            description: 'openstack image name that is already uploaded' )
        string(name: 'EXTNETNAME',
            defaultValue: 'external_network',
            description: 'the provider network' )
        string(name: 'NATNETNAME',
            defaultValue: 'internal_network',
            description: 'the network that can access internet via provider network' )
        booleanParam(name: 'CLEANUP',
            defaultValue: false,
            description: 'delete OpenStack instances after job is finished')
    }

이제 terraform 배포를 위한 variables.tf 파일을 변경하도록 하자.
(신규로 생성하는 openstack resource도 있지만 기 존재하는 resource를 가져와 사용해야 하는것들도 있기에 parameter로 입력받아 이를 처리할 수 있도록 하였다.)

    stages {
        stage('make variables file') {
            steps {
                script {
                    sh "echo ${params.PUBKEY} > pubkey"
                    sh "sed -i 's/centos\\ FIXME/${params.IMAGENAME}/' 9-variables.tf"
                    sh "sed -i 's/external-network\\ FIXME/${params.EXTNETNAME}/' 9-variables.tf"
                    sh "sed -i 's/internal-network\\ FIXME/${params.NATNETNAME}/' 9-variables.tf"
                }
            }
        }

이제 variables.tf에 대한 설정이 완료되었다.

terraform을 실행할 준비를 하자.

openstack provider는 직접 계정 및 keysonte url등을 입력할수도 있지만 아래와 같이 clouds.yaml 파일을 가져오 사용할수 잇다.
clouds.yaml은 내부에 minio를 구축하여 저장하고 있다가 아래와 같이 받아오도록 하였다.

        stage('make a ready to use terraform') {
            steps {
                script {
                    sh 'terraform version'
                    sh 'mc cp jacob-minio/openstack/clouds.yaml .'
                    sh 'terraform init'
                    echo 'done'
                }
            }
        }

terraform init을 통해 초기화 까지 완료되면 이제 적용을 하자.

        stage('apply terraform script') {
            steps {
                script {
                    sh 'terraform plan'
                    sh 'terraform apply --auto-approve'
                }
            }
        }
    }

OpenStack instance 및 각종 resource가 정상적으로 생성되었다.
생성된 resource들을 그대로 놔둬도 되지만 불필요하게 resource를 사용할수도 있기에 제거도 선택적으로 수행하도록 한다.

    post {
        always {
            script {
                if ( params.CLEANUP == true ) {
                    sh 'terraform destroy --auto-approve'
                } else {
                    echo "The environment that made by terraform remained."
                }
            }
        }
    }
}

이와같이 OpenStack VM 및 관련 자원들을 Jenkins Job으로 관리할 수 있다.

참고사이트

위에 작성된 Jenkinsfile의 전체적인 틀은 아래 tacoplay의 Jenkinsfile을 기반으로 만들었다.

'Cloud > Private Cloud' 카테고리의 다른 글

gophercloud sdk  (0) 2021.02.08
prometheus alertmanager workflow  (0) 2020.12.28
Terraform OpenStack Provider  (0) 2020.11.04
access another Openstack VM using cirros image  (0) 2020.09.23
openstack cli  (0) 2020.09.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함