自宅プライベートクラウドにおけるCDのご紹介
自宅プライベートクラウドをお休みの時間に粛々と構築しています。現在は構築用のコードリポジトリ(ansibleだったり、k8sのマニフェストだったり、docker-composeだったり。。。)に対するデプロイが全て手動で煩雑だったため、CDをGitLab CIにて実現しようと奮闘しています。本日はその模様をお伝えしたく。。。
まず、私はアーキテクチャ図を書くのが好きなので、全体構成の説明です。

結構シンプルでして、インフラコードがGitLab.comにプッシュされましたら (もちろん、プライベートリポジトリ)、自宅インフラ内で動いているGitLab Runnerがそのイベントをキャッチします。GitLab Runnerはその後、AWXに対してPlaybookの実行を依頼します。AWXはHashicorp Vaultに対して、CA秘密鍵で署名されたSSH公開鍵の生成を依頼し、その鍵をもって構成管理対象サーバに接続・Playbook実行を行います。
私はAWXに登録するJob Templateを管理したくなかったので、GitLabのCD過程でその時必要なJob Templateを作っては消すようにしています。AWXを管理するためのplaybookとか、二度手間過ぎて作りたくないし、実行履歴はGitLab上から確認できるので、これで良しとしています。
参考までに、CDで使っている .gitlab-ci.yml をぺたり。lower系のジョブはKVMホストなどのインフラでも基礎となる部分の実行ジョブ、それ以外をupper系のジョブとしてまとめています。。。
stages:
- test
- execute
- cleanup_execute
.common_template: &common_template
image: $DYNAMIS_CI_IMAGE
test:
<<: *common_template
stage: test
script:
- ansible-lint src/*.yaml
tags:
- stg
except:
- master
- tags
.execute_template: &execute_template
stage: execute
script:
- >
awx job_templates create
--name ${AWX_JOB_TEMPLATE_NAME}
--project ubuntu-os-common
--playbook src/site.yaml
--inventory dynamis
--scm_branch ${CI_COMMIT_REF_SLUG}
--become_enabled true
--job_type run
--limit "${AWX_EXEC_LIMIT}"
- >
awx job_templates associate ${AWX_JOB_TEMPLATE_NAME}
--credential ${AWX_SSH_CREDENTIAL}
- >
awx job_templates launch ${AWX_JOB_TEMPLATE_NAME}
--monitor
when: manual
allow_failure: false
execute_stg_lower:
<<: *common_template
<<: *execute_template
variables:
TOWER_HOST: $AWX_HOST_STG
TOWER_USERNAME: $AWX_USERNAME_STG
TOWER_PASSWORD: $AWX_PASSWORD_STG
AWX_SSH_CREDENTIAL: $AWX_SSH_CREDENTIAL_STG
AWX_EXEC_LIMIT: lower
AWX_JOB_TEMPLATE_NAME: &job_templates_stg_lower ubuntu-os-common-execute-stg-lower
tags:
- stg
only:
- master
execute_stg_upper:
<<: *common_template
<<: *execute_template
variables:
TOWER_HOST: $AWX_HOST_STG
TOWER_USERNAME: $AWX_USERNAME_STG
TOWER_PASSWORD: $AWX_PASSWORD_STG
AWX_SSH_CREDENTIAL: $AWX_SSH_CREDENTIAL_STG
AWX_EXEC_LIMIT: all:!lower:!kernel
AWX_JOB_TEMPLATE_NAME: &job_templates_stg_upper ubuntu-os-common-execute-stg-upper
tags:
- stg
only:
- master
execute_prod_lower:
<<: *common_template
<<: *execute_template
variables:
TOWER_HOST: $AWX_HOST_PROD
TOWER_USERNAME: $AWX_USERNAME_PROD
TOWER_PASSWORD: $AWX_PASSWORD_PROD
AWX_SSH_CREDENTIAL: $AWX_SSH_CREDENTIAL_PROD
AWX_EXEC_LIMIT: lower
AWX_JOB_TEMPLATE_NAME: &job_templates_prod_lower ubuntu-os-common-execute-prod-lower
tags:
- prod
only:
- tags
execute_prod_upper:
<<: *common_template
<<: *execute_template
variables:
TOWER_HOST: $AWX_HOST_PROD
TOWER_USERNAME: $AWX_USERNAME_PROD
TOWER_PASSWORD: $AWX_PASSWORD_PROD
AWX_SSH_CREDENTIAL: $AWX_SSH_CREDENTIAL_PROD
AWX_EXEC_LIMIT: all:!lower:!kernel
AWX_JOB_TEMPLATE_NAME: &job_templates_prod_upper ubuntu-os-common-execute-prod-upper
tags:
- prod
only:
- tags
.cleanup_execute_template: &cleanup_execute_template
stage: cleanup_execute
script:
- awx job_templates delete ${AWX_JOB_TEMPLATE_NAME}
when: always
cleanup_execute_stg_lower:
<<: *common_template
<<: *cleanup_execute_template
variables:
TOWER_HOST: $AWX_HOST_STG
TOWER_USERNAME: $AWX_USERNAME_STG
TOWER_PASSWORD: $AWX_PASSWORD_STG
AWX_JOB_TEMPLATE_NAME: *job_templates_stg_lower
tags:
- stg
needs:
- execute_stg_lower
only:
- master
cleanup_execute_stg_upper:
<<: *common_template
<<: *cleanup_execute_template
variables:
TOWER_HOST: $AWX_HOST_STG
TOWER_USERNAME: $AWX_USERNAME_STG
TOWER_PASSWORD: $AWX_PASSWORD_STG
AWX_JOB_TEMPLATE_NAME: *job_templates_stg_upper
tags:
- stg
needs:
- execute_stg_upper
only:
- master
cleanup_execute_prod_lower:
<<: *common_template
<<: *cleanup_execute_template
variables:
TOWER_HOST: $AWX_HOST_PROD
TOWER_USERNAME: $AWX_USERNAME_PROD
TOWER_PASSWORD: $AWX_PASSWORD_PROD
AWX_JOB_TEMPLATE_NAME: *job_templates_prod_lower
tags:
- prod
needs:
- execute_prod_lower
only:
- tags
cleanup_execute_prod_upper:
<<: *common_template
<<: *cleanup_execute_template
variables:
TOWER_HOST: $AWX_HOST_PROD
TOWER_USERNAME: $AWX_USERNAME_PROD
TOWER_PASSWORD: $AWX_PASSWORD_PROD
AWX_JOB_TEMPLATE_NAME: *job_templates_prod_upper
tags:
- prod
needs:
- execute_prod_upper
only:
- tags