KitchenCI + WindowsおよびLinux向けのAnsible

私の同僚は、 KitchenCIを使用してAnsibleロールをローカルでテストすることについて素晴らしいブログを書いています。 すべてのOSで使用可能なruby gemで構成される非常に高速でシンプルなツールで、さまざまなテストツール(ServerspecやPesterなど)でも動作します。 同僚が彼のプロジェクト(Windows専用のプロビジョニングと展開)のニーズに合わせてこのソリューションを開発しましたが、一見すると問題になりました。





猫の下で、誰が次に何が起こったか気にしてください。



短い議論の後、私は彼のツールを両方の環境に適応させることに同意しました。ツールのエンドユーザー(エンジニアまたは開発者)は、そのすべてのコンポーネントまたは一部のみを使用できるようになります。 しかし、最初に、現在何が機能しているかの簡単な説明。



そして今、標準のAnsibleロールがあります。別のディレクトリにキッチンがあり、WinServerの構成をテストし、実際にはキッチン自体を構成するPesterテストがあります。 .kitchenファイルには、Vagrantボックス(Ansible + Winserver)の2つの構成、展開スクリプト、およびテストパスがあります。 誰が気にしている、ソースはここにあります



キッチンディレクトリ内の4チームについては、最初から最後までテストに合格します。





初回は信じられないほど長くなります(Windowsのボックスは非常に重いため)。



私が言及し忘れた重要な点:この構成は、開発者がロールを開発およびテストする方法を理解するために学ぶことができるロールのスケルトンです。 開発者が両方のエコシステムで機能する1つの役割を開発する場合を想像することはできません。



それでも、企業のGitHubはゴムではないため、少し節約する必要があります。

まず、プレイブックの役割を両方のオペレーティングシステムに共通するように構成します。 ここではAnsibleの些細な事実が役立ちます。



--- # This play installs IIS, if you run it on windows box - name: install web-server feature win_feature: name: Web-Server state: present when: ansible_os_family == "Windows" - name: deploy iis start page template template: src: iisstart.j2 dest: C:\inetpub\wwwroot\iisstart.htm when: ansible_os_family == "Windows" # This play installs Nginx, if you run it on linux box - name: install nginx yum: name=nginx state=latest when: ansible_os_family == "RedHat" - name: start nginx service: name=nginx state=started enabled=True when: ansible_os_family == "RedHat"
      
      





ご覧のとおり、最初の場合はWindowsにIISの役割をインストールし、2番目の場合はNginxをインストールして実行します。



次にテストを行います。 キッチン/テスト/統合/デフォルト(デフォルトはテストスイートの名前)にserverspecという新しいディレクトリを作成します。 その中には、defailt_spec.rbファイルが1つしかありません



私はルビーにあまり強くないので、仕様ヘルパーなしで汚れました



 require 'rubygems' require 'bundler/setup' require 'serverspec' require 'pathname' require 'net/ssh' RSpec.configure do |config| set :host, ENV['KITCHEN_HOSTNAME'] # ssh options at http://net-ssh.github.io/net-ssh/Net/SSH.html#method-c-start # ssh via ssh key (only) set :ssh_options, :user => ENV['KITCHEN_USERNAME'], :port => ENV['KITCHEN_PORT'], :auth_methods => [ 'publickey' ], :keys => [ ENV['KITCHEN_SSH_KEY'] ], :keys_only => true, :paranoid => false, :verbose => :error set :backend, :ssh set :request_pty, true end describe package('nginx'), :if => os[:family] == 'redhat' do it { should be_installed } end describe service('nginx'), :if => os[:family] == 'redhat' do it { should be_enabled } it { should be_running } end describe port(80) do it { should be_listening } end
      
      





ここでは、3つのチェックのみがあります。パッケージがインストールされ、サービスが自動開始と、誰かがリッスンしているポート80の両方で起動されます。



私のようにRubyの方法がわからない人へのちょっとしたアドバイス- ドキュメントによれば、serverspec-initは上記の例のようにデフォルトのテストを生成します。



だから、役割は、テストがあります。 ここで、キッチン自体を構成する必要があります。 同僚は2台のマシンを持ち上げざるを得ません。これは、小さなansibleサーバーをWindowsにインストールするよりも簡単に展開できるためです。 私の場合、キッチン自体がansibleロールをインストールするため、1台のマシンで十分です。 私のキッチンスクリプトは小さくなります。



 --- driver: name: vagrant gui: true linked_clone: true platforms: - name: centos_box driver_plugin: vagrant driver_config: box: centos/7 network: - [ 'private_network', { ip: '172.28.128.13' } ] transport: max_ssh_sessions: 1 provisioner: name: ansible_playbook roles_path: ../ role_name: kitchen_test_role ansible_inventory: inventory/hosts require_windows_support: true require_chef_for_busser: false ansible_host_key_checking: false ansible_verbose: true ansible_verbosity: 4 playbook: default_linux.yml verifier: name: serverspec remote_exec: false suites: - name: default verifier: patterns: - tests/integration/default/serverspec/default_spec.rb
      
      







別のansible_playbookがあります。これは、ロールがインベントリファイル内のLinuxマシンに対してのみ実行されるためです。



一般に、開発は終了しました。 使用する構成をキッチンに説明するのは非常に簡単です。 kitchenコマンドを実行する前に、環境変数KITCHEN_YAML = "our_ configuration_name"を渡す必要があります。



例:



 KITCHEN_YAML=".kitchen_linux.yml" kitchen create/converge/verify/destroy.
      
      





ご清聴ありがとうございました。



All Articles