notebook

都内でWEB系エンジニアやってます。

GitHubActionsでdotfilesのAnsibleが実行できるかチェックする

この記事は GitHub Actions Advent Calendar 2019 の17日目の記事です

dotfilesのAnsibleスクリプトの実行をGitHubActionsでチェックできるようにした話です

経緯

前提

  • 開発はWin機でCentOSのVMを立ち上げている
  • ubuntu(WSL)でも開発する(予定)
  • プライベートではmacを使っている
  • 開発環境を立ち上げるためにdotfilesのansibleスクリプトを実行している

課題感

  • スクリプトの量が多く実行する機会もそんなに多くないため実際に使う時点で壊れているパターンが多かった
    • その都度調べて手動で対応
      • その分時間がかかる
  • 使いたいときにサクッと立ち上げたい
  • 失敗するにも事前に気づいて手を打ちたい

という課題感があるなか、GitHubActionsではmac, win, ubuntu環境でjobを実行できるので開発環境の構築も途中でこけないかチェックできるのでは?と思いやってみた

下記のリポジトリで行った

swfz/dotfiles: dotfiles

github.com

  • ディレクトリ構成

ansibleディレクトリにAnsibleで使うファイルなどが置いてあるのでcdしてAnsibleを実行する流れになる

[dotfiles]$ tree
.
|-- README.md
|-- ansible
|   |-- README.md
|   |-- ansible.cfg
|   |-- development.yml
|   |-- mac.yml
|   |-- ubuntu.yml
.....
.....
.....

Ansibleの実行はローカル実行させるようにしている

Ansibleの細かい中身の話については今回言及しない

内容

mac(mac.yml)

mac用のプレイブックをチェックする

  build-mac:
    runs-on: macos-latest
    name: 'ansible playbook mac'
    steps:
      - uses: actions/checkout@master
      - name: install ansible
        run: |
          brew install ansible
      - name: run ansible
        env:
          CI: true
        run: |
          ansible --version
          cd ansible
          ansible-playbook -i localhost, -c local mac.yml

プライベートのmacで使うためにbrewで入れるものだけしか書いてないが一応残しておいてある

そんなに実行機会もない気がするので手動で入れてしまって後から記述したものとかもあるがこの際チェック対象に入れる

CentOS7(development.yml)

CentOS7用のプレイブックをチェックする

メインはCentOSだが実行環境がないためdockerを使って実行するようにした

その際に下記に関しては対応が必要そうだったので今回は環境変数(CI)を見てスキップするかどうかチェックさせるようにした(Ansible側での修正を行った)

  • systemdでのサービス起動
  • SELinuxの設定
  • sysctl.confの設定変更
  build-centos:
    runs-on: ubuntu-latest
    container: centos:7
    name: 'ansible playbook centos'
    steps:
      - uses: actions/checkout@master
      - name: install ansible
        run: |
          yum install -y python2-setuptools gcc python2-devel
          easy_install pip
          pip install ansible
      - name: 'ansible playbook centos'
        env:
          CI: true
        run: |
          cd ansible
          ansible-playbook -i localhost, -c local development.yml

ubuntu(ubuntu.yml)

WSL環境用に作ったplaybookをチェックする

sourceからインストールする系のものに関してはCentOSで書いたroleを流用できたので最低限必要そうな設定を入れた

WSL2が来たらメインの開発環境をこっちに移行したいと思っているので準備も兼ねて整備中

pexpectがansibleの実行で必要なため入れている

  • job
  build-ubuntu:
    runs-on: ubuntu-latest
    name: 'ansible playbook ubuntu'
    steps:
      - uses: actions/checkout@master
      - name: install ansible
        run: |
          sudo apt update
          sudo apt install software-properties-common
          sudo apt-add-repository --yes --update ppa:ansible/ansible
          sudo apt install ansible
          curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
          sudo python get-pip.py
          pip install pexpect --user
      - name: run ansible
        env:
          CI: true
        run: |
          cd ansible
          ansible-playbook -i localhost, -c local ubuntu.yml --extra-vars user=runner

トリガー

Ansible関連のファイルに変更があった場合とスケジュール実行を行うようにした

スケジュール実行は、よくある「いつの間にかバージョンが上がっててコケるようになっていた」というケースに気づくため

on:
  push:
    paths:
      - 'ansible/**'
      - '.github/workflows/ci-ansible.yml'
  schedule:
    - cron: '0 0 * * SAT'

毎週1回実行させるようにしている

実行されるとこんな感じ

lint

蛇足だがlintも入れた

  lint:
    runs-on: ubuntu-latest
    name: 'lint'
    steps:
      - uses: actions/checkout@master
      - name: install ansible-lint yamllint
        run: |
          sudo apt update
          curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
          sudo python get-pip.py
          pip install ansible-lint --user
          pip install yamllint --user
      - name: run yamllint
        env:
          CI: true
        run: |
          cd ansible
          ~/.local/bin/yamllint .
      - name: run ansible-lint
        env:
          CI: true
        run: |
          cd ansible
          ~/.local/bin/ansible-lint development.yml mac.yml ubuntu.yml

まとめ

まずは「実行時エラーで落ちないか」のみをチェックできるようにした

理想はテストツールを使って本当にインストールされたかどうかまでチェックしたいのでそれは今後やるかも

moleculeというAnsible公式で出ているツールがあるようなので触ってみたいところ

筆者の環境はAnsibleだがインストール用のシェルスクリプトでも同じようにできると思う

今回GitHubActionsで開発環境構築用のAnsibleを自動で実行させるようにしたことで

  • 時間はかかるが自動で複数環境に対してAnsibleを実行できるのは便利
  • 毎週実行する事で意図せず挙動が変わって落ちてしまうなどの状況に気づける

ということがわかった

ただ、書いてから気づいたがWin機自体のセットアップ用にスクリプトは用意していなかったのでGitHubActionsでやる旨味は半減かもしれないなと思った