lae.travis-lxc

lae.travis-lxc

ビルドステータス Ansible Galaxy ロール

このツールは、Travis CI環境でのAnsibleロールのテストを簡単にするために、N個のLXCコンテナを設定して起動します。

使い方

AnsibleロールをTravis CIでテストしたいけど、Dockerを使うのは完全なOSを模していないから避けたい?それならLXCを使うのが最適です。このロールは、通常は必要な設定の多くを抽象化してくれます。

始めるためには、あなたのロールが有効であり、冪等性があり、機能することを徹底的にテストするための最小限の.travis.ymlは以下のようになります:

---
language: python
sudo: required
dist: bionic
install:
- pip install ansible
- ansible-galaxy install lae.travis-lxc,v0.9.0
- ansible-playbook tests/install.yml -i tests/inventory
before_script: cd tests/
script:
- ansible-playbook -i inventory deploy.yml --syntax-check
- ansible-playbook -i inventory deploy.yml
- 'ANSIBLE_STDOUT_CALLBACK=debug ANSIBLE_DISPLAY_SKIPPED_HOSTS=no ANSIBLE_DISPLAY_OK_HOSTS=no
  unbuffer ansible-playbook -vvi inventory deploy.yml &>play.log; printf "冪等性: ";
  grep -A1 "PLAY RECAP" play.log | grep -qP "changed=0 .*failed=0 .*"
  && (echo "合格"; exit 0) || (echo "不合格"; cat play.log; exit 1)'
- ANSIBLE_STDOUT_CALLBACK=debug ansible-playbook -i inventory -v test.yml

この設定では4つのファイルが参照されています。ビルドプロセスの定義方法は自由ですが、以下の内容が一般的に利用されます:

  • tests/install.yml: lae.travis-lxcとその他の事前インストール手順を実行
  • tests/deploy.yml: テスト中のロールを実行
  • tests/test.yml: デプロイに対する検証テストを実行
  • tests/inventory: LXCコンテナのホスト名のリストを含む

install.ymlは以下のようになります:

---
- hosts: localhost
  connection: local
  roles:
    - lae.travis-lxc
  vars:
    test_profiles:
      - profile: debian-buster
      - profile: ubuntu-focal
      - profile: centos-7
      - profile: alpine-v3.11

- hosts: all
  tasks: []

最初のプレイは3つの異なるディストリビューションの3つのコンテナを立ち上げます。2つ目のプレイは、他のロールや、あなたのロールが行わないべきであろう事前インストールタスクを実行するために使われることがあります(例えば、epel-releaseのインストールやFUSE用のデバイスノードの作成など)。

deploy.ymlは以下のようになります:

---
- hosts: all
  become: true
  any_errors_fatal: true
  roles:
    - ansible-role-strawberry-milk
  vars:
    number_of_cartons: 15

これは基本的に、ansible-galaxy initが生成する内容の一部を表現しています。これには、あなたのロールを正しく実行するために必要なものが含まれています。より複雑なロールの場合、変数をtests/group_varsフォルダに分けて、適切にインベントリを設定するのが理にかなっています。

test.ymlには、テストを実行したい場合のテスト内容を含めます:

---
- hosts: all
  tasks:
    - name: ストロベリーミルクHTTPサービスが動作しているか確認する
      uri:
        url: "http://{{ inventory_hostname }}:1515"
    - block:
      - name: ストロベリーミルクの設定を表示する
        shell: cat /etc/strawberry_milk.conf
        changed_when: false
      - name: システムログを表示する
        shell: "cat /var/log/messages || cat /var/log/syslog || journalctl -xb"
      ignore_errors: yes

これは、サービスが動作しているか、クラスタが健康な状態か、特定のファイルが作成されているかを確認するのに役立ちます。ここでのblockは、問題をデバッグするのに役立つ診断的なタスクを実行するエリアです。これはignore_errorsで囲まれているため、ここでのタスクがビルドに影響を与えることはありません(特に複数のディストリビューションをテストする際に、エラーを引き起こす主要なタスクはログの表示タスクです)。

最後にインベントリファイルは次のようになります:

debian-buster-01
ubuntu-focal-01
centos-7-01
alpine-v3-11-01

ホスト名は2つの部分、プレフィックスとサフィックスから生成されます。デフォルトでは、これらはtest_profilesprofileキーから、{{ profile }}-{{ suffix }}という形式で生成されます。サフィックスのデフォルトは01です。

これらのファイルを作成すれば、Travis CIであなたのロールをテストする準備が整います。ただし、さらに多くのことを望むかもしれませんので、他のトピックについても見ていきましょう。

複数のAnsibleバージョンをテストする

あなたのロールを開発ブランチや現在のサポートされているすべてのAnsibleリリースでテストしたいでしょう。これは.travis.ymlに設定する必要があり、いくつかの方法があります:

env:
- ANSIBLE_GIT_VERSION='devel'
- ANSIBLE_VERSION='~=2.9.0'
- ANSIBLE_VERSION='~=2.9.0'
- ANSIBLE_VERSION='~=2.7.0'
install:
- if [ "$ANSIBLE_GIT_VERSION" ]; then pip install "https://github.com/ansible/ansible/archive/${ANSIBLE_GIT_VERSION}.tar.gz";
  else pip install "ansible${ANSIBLE_VERSION}"; fi
- ansible --version

ここでは、ANSIBLE_GIT_VERSIONをAnsibleのgitリポジトリの有効な参照として、またはANSIBLE_VERSIONをpipによるインストール時に渡すことができる有効なバージョン文字列として使用するインストールタスクを追加しました。

Ansibleのパフォーマンスとプロファイリング

tests/ansible.cfgにはほぼ何でも追加できます。

[defaults]
callback_whitelist=profile_tasks
forks=20
internal_poll_interval = 0.001

これは、あなたのプレイブックでprofile_tasksコールバックを実行し、完了までに最も時間がかかるタスクを特定するのに役立ちます。これを使用してパフォーマンスの後退を特定できる場合があります。複数のコンテナに対してプレイブックを起動して実行する場合は、forksを指定します。internal_poll_intervalは、複数のタスクやループがある場合には良い一般的な設定です。

キャッシュ

LXCイメージは、特に複数のプロファイルに対してテストする際に、ブートストラップ時間を節約するためにキャッシュできます。以下を.travis.ymlに追加すれば、他のすべてをこのロールが処理します。

cache:
  directories:
  - "$HOME/lxc"
  pip: true

(pip: trueはこのロールにとって意味を持ちませんが、ここに含まれているのは、あなたがAnsibleインストールをキャッシュしたいかもしれないからです。)

ロール変数

テストするディストリビューションを指定するには、test_profilesを使用します。サポートされるプロファイルには以下が含まれます(新しいプロファイルのリクエストや貢献は自由です):

test_profiles:
  - profile: alpine-v3.11
  - profile: alpine-v3.10
  - profile: alpine-v3.9
  - profile: centos-7
  - profile: debian-buster
  - profile: debian-stretch
  - profile: ubuntu-focal
  - profile: ubuntu-bionic
  - profile: ubuntu-xenial

以下のプロファイルには定義が存在しますが、このロールのターゲットとしては必ずしもアクティブにサポートされているわけではありません(つまり、これに対するテストはもはや実行されていません)。いずれも公式にEOLになっているか、比較的古いためです。それらがまだ機能する保証はありません(おそらく機能していますが)。

test_profiles:
  - profile: alpine-v3.8
  - profile: alpine-v3.7
  - profile: alpine-v3.6
  - profile: centos-6
  - profile: debian-jessie
  - profile: debian-wheezy
  - profile: fedora-28
  - profile: fedora-27
  - profile: fedora-26
  - profile: fedora-25
  - profile: ubuntu-trusty

各プロファイルについての詳細はvars/main.ymlで確認できます。

テストコンテナはプレフィックスが指定されない場合、ホスト名が{{ profile }}-{{ suffix }}となります。ここでprofileはDNS名として使用できるようにサニタイズされています。デフォルトのプレフィックスはvars/main.ymlに定義されていますので、特定のプロファイルのプレフィックスがわからない場合は参照してください。test_host_suffixesが定義されていない場合、suffixは1から始まるゼロ埋めの2桁の整数になります(ここで指定したホスト数に応じて)。

例えば、以下の設定ではdebian01debian02debian03が作成されます:

test_profiles:
  - profile: debian-buster
    prefix: debian
test_hosts_per_profile: 3

以下の設定ではubuntu-app-python2ubuntu-app-python3が作成されます:

test_profiles:
  - profile: ubuntu-focal
    prefix: ubuntu-
test_host_suffixes:
  - app-python2
  - app-python3

必要に応じて、共有フォルダをマウントするなどのコンテナ設定をオーバーライドすることもできます:

container_config:
  - "lxc.aa_profile=unconfined"
  - "lxc.mount.auto=proc:rw sys:rw cgroup-full:rw"
  - "lxc.cgroup.devices.allow=a *:* rmw"

万が一必要な場合は(デフォルトでこのロールが"missing"パッケージをインストールするはずなので、問題を報告してください)、テストコンテナ内に追加のパッケージをインストールすることもできます:

additional_packages:
  - make

もし.travis.ymlにキャッシュが有効にされている場合、lxc_cache_profilesを指定してテストプロファイルのサブセットだけを選んでキャッシュすることができます。これらは有効なプロファイルで、test_profilesに存在している必要があります。

$HOME/lxc以外のディレクトリにキャッシュしたい場合は、lxc_cache_directoryを変更します。

LXCコンテナ内でOverlayFSの使用を無効にする必要がある場合(例:LXCコンテナ内でOverlayFSを使用しようとする場合)、lxc_use_overlayfsno(または任意のFalseバリアント)に設定します。

貢献者

Musee Ullah (@lae, lae@lae.is)
Wilmar den Ouden (@wilmardo)

安定性

このロールは現在1.0前の状態であり、安定性は保証されていません。このロールを使用中に問題が発生した場合は、簡単な説明と適切なログを添えて問題を報告してください。これにより修正され、安定リリースに一歩近づくことができます。

このロールを使用する際には、特定のバージョンに固定することをお勧めします(マイナーには固定する程度で問題ありません)。そうしないと、1.0リリース前のマイナーリリースでの破壊的変更によってテストが失敗し始める可能性があります。

プロジェクトについて

Builds and configures LXC container hosts to use for integration testing Ansible roles on Travis CI

インストール
ansible-galaxy install lae.travis-lxc
ライセンス
mit
ダウンロード
19.1k
所有者