Testinfra を使ってみた

30
Testinfra 使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9 Testinfra を使っ てみた Shizuoka.py #5 2016-07-09 となか(@ftnk

Transcript of Testinfra を使ってみた

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

Testinfra を使ってみた

Shizuoka.py #52016-07-09

となか(@ftnk)

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

自己紹介

名前: となか (@ftnk)✓

インフラエンジニア

Solaris✓

write: Shell Script/Ruby✓

read: Shell Script/Ruby/Perl/Python/PHP/C

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

Testinfra を使ってみた

Testinfra とは✓

Testinfra を使ってみる✓

カスタマイズ✓

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

Testinfra とはTestinfra

Philippe Pepiot さん作たぶん BSD 好き✓

http://testinfra.readthedocs.io/en/latest/✓

https://github.com/philpep/testinfra✓

https://philpep.org/blog/infrastructure-testing-with-testinfra

2015-08-18 付け✓

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

Testinfra とは

Testinfra aims to be a Serverspec equivalent in python

http://serverspec.org/✓

Pytest の Plugin として書かれている

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

Testinfra の特徴

Puppet/Ansible/salt の機能を使ったテストが可能

対応 OSLinux (RHEL/Fedora/Debian/Ubuntu)✓

BSD (FreeBSD/OpenBSD/NetBSD)✓

Linux 対応が雑✓

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

Testinfra を使ってみる

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

インストール

$ pip install testinfra

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

テストを書く

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

Package

def test_httpd_is_installed(Package): httpd = Package("httpd") assert httpd.is_installed assert httpd.version.startswith("2.2")

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

Service

def test_httpd_running_and_enabled(Service): httpd = Service("httpd") assert httpd.is_running assert httpd.is_enabled

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

File

def test_passwd_file(File): passwd = File("/etc/passwd") assert passwd.contains("root") assert passwd.user == "root" assert passwd.group == "root" assert passwd.mode == 0o644

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

Puppet で情報を取得

def test_puppet_resource(PuppetResource): pr = PuppetResource('user', 'root') assert pr['root']['gid'] == '0'

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

facter で情報を取得

def test_facter(Facter): facter = Facter('kernel', 'architecture') assert facter['kernel'] == 'Linux' assert facter['architecture'] == 'x86_64'

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

Ansible で情報を取得

def test_ansible(Ansible): ansible = Ansible('file', '/etc/passwd') assert ansble['mode'] == '0644'

Ansible が使えるのは backend として Ansible を指定した時のみ。

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

その他

http://testinfra.readthedocs.io/en/latest/modules.html

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

テストの実行

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

local に対して実行

$ testinfra -v

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

SSH で remote host に対して実行

$ testinfra -v --hosts=host1,host2:10022

default では paramiko が使われる。

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

~/.ssh/config を喰わせる

$ testinfra -v --ssh-config=${HOME}/.ssh/config --hosts=host1,host2

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

並列実行

並列実行には pytest-xdist を使う

$ pip install pytest-xdist

'-n' で並列数を指定して実行

$ testinfra -n 2 -v --hosts=localhost

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

接続方法を変えるデフォルトの接続は local✓

リモート接続のデフォルトは paramiko

paramiko/ssh/salt/ansible を選択可能✓

Docker にも接続できるdocker exec✓

'--connection=' で指定✓

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

Nagios 監視

$ testinfra -qq --nagios

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

カスタマイズ

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

Solaris で Package のテストを利用できるようにする

OS の判別✓

class SolarisPackage の実装✓

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

OS の判別

testinfra/modules/package.py の get_module_class に以下を追加(手抜き)

elif Command.run_test("which pkg").rc == 0: return SolarisPackage

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

SolarisPackage の実装

testinfra/modules/package.py に以下を追加

class SolarisPackage(Package):

@property def is_installed(self): return self.run_test("pkg list %s", self.name).rc == 0

@property def version(self): out = self.check_output("pkg list -H %s | awk '{print $2}'", self.name) return out

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

Solaris 用テスト

def test_httpd_is_installed_on_solaris(Package): httpd = Package("apache-24") assert httpd.is_installed assert httpd.version.startswith("2.4")

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

自作モジュール

自作モジュールは Testinfra の pluign にするものらしい

https://github.com/philpep/testinfra-echo

Testinfra を使ってみた - Shizuoka.py #52016-07-09 Powered by Rabbit 2.1.9

まとめ

Testinfra は Pytest のプラグインとしてインフラのテストを書く方法を提供

Ansible/salt/Puppet/facter など使えるものは使って情報を取得

OS/distribution によるテスト方法の分岐が微妙