AWSエンジニアだから、今風のナウい感じでAnsibleもサーバーレスで使いたいよねっ?!

記事タイトルとURLをコピーする

全国のAnsible愛好家の皆様こんにちは、技術4課 岩本です。
さて、ラノベ風のタイトルで始まりました今回ですが、
Windowsユーザー/Macユーザーが混在してたりすると、セットアップ手順が各端末であったり、
もしくはプロビジョニング用サーバーを用意したりと、それなりに手間がかかるので、
Ansibleの実行もサーバーレスでできないかしら?と思ったのが事の始まりです。

結論

  • git push するだけで、Ansibleの実行ができるようになりました!
    • 手元の端末にAnsibleのインストールは不要で、テキストエディタとGitクライアントだけで、Ansibleの実行ができます。
    • Gitに対応したVisualStudioCodeとかAtomなら、それ以外不要。

しくみ

  1. CodeCommit上にあるGitリポジトリに、AnsiblePlaybookとCodeBuildで利用するbuildspec.ymlをPushします。

  2. CodeCommitへのPushをトリガーとしてCodePilelineが、Pushされた内容をCodeBuildへ送ります。

  3. CodeBuildでは事前に指定したDockerコンテナが起動し、buildspec.ymlを元に、処理が実行されます。

絵で描くとこんな感じ

でもお高いんでしょ?

CodeCommit

  • 最初の5人のアクティブユーザー : 無料
  • 6人以降のアクティブユーザー : 1$/月/ユーザー

CodePipeline

  • 1パイプライン : 1$/月

CodeBuild

  • 0.005$/ビルド/分
    • build.general1.small
    • Linux

まとめ

  • CodeCommit:無料
  • CodePipeline:1$/月
  • CodeBuild:1$(0.005$5分40回)
  • 総計:約2$/月

構築がめんどくさそう・・・

  • そんな事もあろうかと、Terraformをご用意しました。
    • 諸般の事情により、CodePilelineだけ手動でお願いします・・・
    • CodePipelineの構築時には、ブランチの指定が必須ですが、Terrafrom実行時にはCodeCommitのブランチは空のためです。
    • ansible-on-codebuild

解説

  • CodeBuildは1ビルド毎にDockerコンテナが起動し、buildspec.ymlに記載されたコマンドがDockerコンテナ上で実行されます。
    buildspec.ymlにAnsibleを適切に起動する記載をする事で、Codebuild上でAnsibleの実行が可能となりました。

  • buildspec.yml

---
version: 0.2

phases:
  pre_build:
    commands:
      - sudo apt-get update -y
      - sudo apt-get install software-properties-common -y
      - sudo apt-add-repository ppa:ansible/ansible -y
      - sudo apt-get update -y
      - sudo apt-get install ansible -y
      - sudo apt-get install openssh-client -y
      - cd ./playbook
      - chmod 600 ./ssh-keys/sw-iwamoto.pem
      - ansible -i hosts/inventory.yml -m ping all
  build:
    commands:
      - ansible-playbook -i hosts/inventory.yml ./setup.yml
  post_build:
    commands:
      - echo "Now Finished Privisioning by Ansible"

今後の課題

  • 対象サーバーはANYからのSSHを受ける必要がある
  • Playbookの内容確認(ドライラン)ができない
    • 構成が複雑になりますが、テスト用・実行用とそれぞれののCodebuildプロジェクトを作ることでPlaybookの検証も行えます。

まとめ

弊社の様にメンバーが自由に端末を選べ、リモートワークなどを行う形態では、実行環境を統一するのもなかなか苦労します。
CodeCommit/CodePipeline/Codebuildを組み合わせることで、GitPushするだけで、Ansibleが実行できる環境がサーバレスで構築できます。
Ansibleを別のものに置き換え利用することもできます。
非常にニッチな利用ですが、何かの際にご活用ください。