Chefのrecipeを書いてみる その4 -インストール済みの場合は実行しないようにしてみる編-

前回書いた,Chefのrecipeを書いてみる その3 -recipeを分割してみる編-に引き続きchefのrecipeを順を追って書いていきます.今日は,すでにソフトウェアがインストールされていたら,実行しないようにガードをつけてみようと思います.

実行する前にインストールチェックをする

すでにインストールされていた場合は実行しないようにガードを付けます. 基本的には,only_ifnot_ifを使う事によって達成します. 今回の判定条件は,#{install_dir}/versions/flyway-#{version}が存在した場合インストール済みとみなすことにします.

not_if文を追加する(default.rb)

not_ifなので,評価結果がの時に実行されるように記述します. 次のようなコードを書くと,Fileやディレクトリの存在の有無を判定できます. not_if { File.exists?("#{install_dir}/versions/flyway-#{version}") } この場合は,存在しなかった場合trueになります.

execute "flyway-cli" do
  command <<-EOH
     wget http://repo1.maven.org/maven2/com/googlecode/flyway/flyway-commandline/#{version}/flyway-commandline-#{version}.tar.gz -P /tmp
     tar xzfC /tmp/flyway-commandline-#{version}.tar.gz #{install_dir}/versions
     ln -nfs #{install_dir}/versions/flyway-#{version} #{install_dir}/flyway
  EOH
  not_if { File.exists?("#{install_dir}/versions/flyway-#{version}") }
end

mysql-connector.rb

こちらにも同様に追記します.

execute "mysql-connector" do
  command <<-EOH
     wget http://cdn.mysql.com/Downloads/Connector-J/mysql-connector-java-5.1.26.tar.gz -P /tmp
     tar xzfC /tmp/mysql-connector-java-5.1.26.tar.gz /opt/flyway/flyway/jars
     ln -nfs /opt/flyway/flyway/jars/mysql-connector-java-5.1.26/mysql-connector-java-5.1.26-bin.jar /opt/flyway/flyway/jars//mysql-connector-java-5.1.26-bin.jar
  EOH
  not_if { File.exists?("/opt/flyway/flyway/jars/mysql-connector-java-5.1.26") }
end

実行してみる

ちゃんとスキップされてます.

# sudo chef-solo -c solo.rb -j localhost.json
Starting Chef Client, version 11.6.2
Compiling Cookbooks...
Converging 3 resources
Recipe: flyway-cli::default
  * directory[/opt/flyway/versions] action create (up to date)
  * execute[flyway-cli] action run (skipped due to not_if)
Recipe: flyway-cli::mysql-connector
  * execute[mysql-connector] action run (skipped due to not_if)
Chef Client finished, 0 resources updated

まとめ

今回は,すでにインストール済みの場合はrecipeを実行しないようにするガードをつけました.これで無駄なインストールやファイルのダウンロードがおこなわれないようになります.

Chefのrecipeを書いてみる一覧

参考文献