반응형

jenkins Version : 2.419
Ansible Tower : 17.1.0 (Docker Version)

Jenkins Plugin
Ansible Tower Plugin https://plugins.jenkins.io/ansible-tower/dependencies/

CI / CD 파이프라인을 구성하는데 필요한 jenkins 와 Ansible 을 연동하는 과정이다.
보통 jenkins 에서 빌드 및 아티팩트 전달까지 진행한 후 Ansible 을 호출하면서 정보를 넘겨주게 되는데,
이 과정에서 jenkins - Ansible Tower (이하 AWX) 가 연동되어 있어야 한다.

Ansible Tower 는 host , group value 를 가지고 있기 때문에 ansible 을 호출하면 원하는 host 에 지정한 group 값을 가지고 배포를 진행할 수 있게 된다.

연동의 목적은 pipeline code 에서 host 정보를 받아오는 것을 목적으로 진행한다.

 

1. Jenkins 설정

jenkins 설정 >  System > Ansible Tower 를 입력하는 공간이 존재한다. 타워의 정보를 입력하고 이름을 붙여서 jenkins 가 AWX 를 식별할 수 있도록 설정한다.
Credentials 은 Ansible Tower 에서 사용하는 계정을 만들어서 등록한 후 사용하면 정상적으로 Connection 이 성공할 것이다.
AWX 가 사용하는 IP, Port 와 방화벽 통신이 가능해야 한다.

 

2. Ansible Playbook
Jenkins 가 Ansible 의 IP,Port 를 식별할 수 있게 되었으면 호출하여 무엇을 실행할 것인지 AWX 에 기술되어 있어야 한다.
이것을 Playbook 이라고 하며 Resource > Template 에서 확인할 수 있다.
여기서는 project 라는 변수를 받아서 Tower 내에 project 라는 이름을 가진 group을 조회해서 host 정보를 반환한다.

---
- hosts: 'localhost'
  gather_facts: no

  vars:
    targetlist: "{{ groups[project] }}"

  tasks:
  - name: Get Inventory-info
    set_stats:
      data:
        JENKINS_EXPORT:
          - TargetList: "{{ targetlist }}"

list를 반환해서 jenkins 로 전달해주는 playbook 을 수행하게 된다.

 

3. Pipeline Code

result = ansibleTower(
                            towerServer: "${awxTower}",
                            jobTemplate: "${plb_getHostIndex}",
                            importTowerLogs: false,
                            removeColor: false,
                            verbose: true,
                            extraVars: """
                                project: ${project}
                            """,
                            async: false
                    )
                    message.infoMessage("Result: " + result)
                    serviceList = Eval.me(result.TargetList)

Pipeline 에서는 Jenkins parameter 로 넘겨준 project 를 Tower 호출 시 포함하여 전달하고, 생성한 playbook 의 index 번호와 앞서 지정한 Tower 서버의 정보를 함께 넘긴다.
해당 코드가 실행되면 원하는 Tower 서버의 playbook 에 지정한 변수를 담아서 ansible 을 실행 시킬 수 있다.
ref) https://plugins.jenkins.io/ansible-tower/

 

Ansible Tower

This plugin connects Jenkins with Ansible Tower

plugins.jenkins.io

 

4. Pipeline 실행 결과

Beginning Ansible Tower Run on awxtower
[WARNING]: Job type defined but prompt for job type on launch is not set in tower job
Requesting tower to run job template 7
Template Job URL: ***
Receiving from Jenkins job 'TargetList' with value '["skeleton.host1","skeleton.host2","skeleton.host3"]'
Tower completed the requested job

awxtower 라는 Tower 에서 7번 playbook이 실행 되었다.
그 결과 TargetList 라는 변수에 Tower 에 저장되어 있는 host 를 조회하여 결과 값으로 받을 수 있었다.

반응형