LoginSignup
2
2

More than 5 years have passed since last update.

Itamae | resource plugin で 板前によるトイレ操作機能を追加する #devops #itamae

Posted at

Itamae | resource plugin で 板前によるトイレ操作機能を追加する #devops #itamae

概要

プロビジョニングツール Itamae

resource plugin で 板前へのトイレ操作をプラグイン化します。

※toilet コマンドについては下記リンク参照
http://www.tecmint.com/20-funny-commands-of-linux-or-linux-is-fun-in-terminal/

resource plugin

公式 Wiki による Resource Plugins の説明
https://github.com/ryotarai/itamae/wiki/Resource-Plugins

Itamae の resource は gem で管理

Itamae では resource の管理は gem で行います。
Ruby の一般的なライブラリの管理と同じ方法で行うことができるため手軽です。

命名規則

Itamae の resource plugin を作成する場合、 gem 名は

itamae-plugin-resource-somename

のフォーマットにします。

recipe plugin とは異なり、この名前がルールであるか、Wikiには記載されていませんが、
現状作成されているリソースをみると同じ命名規則にしているようです。

例えば、 tree を扱うするリソースなら。

itamae-plugin-resource-tree

のようにします。

クラス名は ::Itamae::Plugin::Resource::FooBar にする必要がある。
利用時は foo_bar で利用することになる。
大抵は、::Itamae::Resource::Base を継承する。

実装内容は既存のリソースを見て確認。
https://github.com/ryotarai/itamae/tree/master/lib/itamae/resource

課題とその解決策

基本的には recipe plugin と同じ話。
課題
解決策

試行

仕様

  • toilet を操作する resource plugin を作成

itamae-plugin-resource-toilet

# bundle gem で gem のひな型を生成
$ bundle gem itamae-plugin-resource-toilet
  • itamae-plugin-resource-upgrade/lib/itamae/plugin/resource/toilet.rb を編集
require 'itamae'

module Itamae
  module Plugin
    module Resource
      module Toilet < Itamae::Resource::Base
        COMMAND = 'toilet'
        define_attribute :action, default: :run
        define_attribute :text, type: String, default_name: true
        # Filters
        # "crop": crop unused blanks
        # "gay": add a rainbow colour effect
        # "metal": add a metallic colour effect
        # "flip": flip horizontally
        # "flop": flip vertically
        # "180": rotate 180 degrees
        # "left": rotate 90 degrees counterclockwise
        # "right": rotate 90 degrees clockwise
        # "border": surround text with a border
        define_attribute :filters, type: Array, default: []

        def set_current_attributes
          super
          ensure_toilet_available

          filters_exist = filters.empty?
        end

        def action_run(options)
          if filters.empty?
            run_command([COMMAND, attributes.text])
          else
            filter_options = filters.each_with_object([]) do |e, memo|
              memo += ['--filter', e]
            end
            run_command([COMMAND] + filter_options + [attributes.text])
          end
        end

        private

        def ensure_toilet_available
          return if run_command('which toilet', error: false).exit_status == 0
          fail '`toilet` command is not available. Please install toilet.'
        end
      end
    end
  end
end
  • その他のファイルの編集内容は省略(通常の gem 作成時と同じ)

resource plugin を install

今回は Private な Gemサーバーに公開し、そちらからインストールします。
gem server は geminabox を利用します。

詳しくはこちらの記事を参照。
Ruby | RubyKaigi2014の知見。geminabox gem で Private な Gem Server を構築 #rubykaigi

$ tree -L 2
.
┗ itamae-plugin-resource-toilet
    ┣ Gemfile
    ┣ itamae-plugin-resource-toilet.gemspec
    ┣ lib
    ┣ LICENSE.txt
    ┣ Rakefile
    ┗ README.md

# 各 recipe を実装

$ cd itamae-plugin-resource-toilet
$ rake build
# geminabox で作成したサーバーに gem を公開
$ gem inabox ./pkg/itamae-plugin-resource-toilet-0.0.1.gem

itamae-plugin-resource-toilet.png

レシピを作成

require 'itamae/plugin/resource/toilet'

toilet 'hoge' do
end

toilet 'hige' do
  filters ['gay']
end

toilet 'hage' do
  filters ['gay', 'flip']
end

toilet 'トイレ' do
  filters ['gay', 'border']
end

Gemfile を作成

source 'http://your_gem_server:your_port/'

gem 'itamae'
gem 'itamae-plugin-resource-toilet'
# geminabox(private gem server) から install
$ bundle install
$ gem list | grep itamae
itamae (1.0.1)
itamae-plugin-resource-toilet (0.0.1)

実行

※実行前に toilet はインストール済みとする

$ tree -L 1
.
┣ Gemfile
┣ Gemfile.lock
┣ recipe.rb
┗ Vagrantfile

$ sudo bundle exec itamae local recipe.rb

toilet_resource.png

参照

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2