lae.travis-lxc
lae.travis-lxc
このツールは、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_profiles
のprofile
キーから、{{ 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桁の整数になります(ここで指定したホスト数に応じて)。
例えば、以下の設定ではdebian01
、debian02
、debian03
が作成されます:
test_profiles:
- profile: debian-buster
prefix: debian
test_hosts_per_profile: 3
以下の設定ではubuntu-app-python2
とubuntu-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_overlayfs
をno
(または任意のFalse
バリアント)に設定します。
貢献者
Musee Ullah (@lae, lae@lae.is)
Wilmar den Ouden (@wilmardo)
安定性
このロールは現在1.0前の状態であり、安定性は保証されていません。このロールを使用中に問題が発生した場合は、簡単な説明と適切なログを添えて問題を報告してください。これにより修正され、安定リリースに一歩近づくことができます。
このロールを使用する際には、特定のバージョンに固定することをお勧めします(マイナーには固定する程度で問題ありません)。そうしないと、1.0リリース前のマイナーリリースでの破壊的変更によってテストが失敗し始める可能性があります。