ラベル chef の投稿を表示しています。 すべての投稿を表示
ラベル chef の投稿を表示しています。 すべての投稿を表示

2025年5月20日火曜日

Chef cookbooks のテストを kitchen-docker を使って書く

Chef cookbooks のテストを kitchen-docker を使って書く

概要

更に kitchen-docker を使うので毎回クリーンな環境に対して実際にレシピを実行してテストすることができます

環境

  • macOS 15.4
  • docker 28.1.1
  • Ruby 3.4.3
    • kitchen 3.0.0
    • chef 18.7.6

必要な gem のインストール

  • vim Gemfile
# frozen_string_literal: true

source 'https://rubygems.org'

group :development do
  gem 'csv'
  gem 'inspec'
  gem 'kitchen-docker'
  gem 'kitchen-inspec'
  gem 'test-kitchen'
end

テストの作成

  • vim test/integration/default/default_test.rb
# frozen_string_literal: true

emacs_binary = '/usr/local/bin/emacs'

control 'emacs-install' do
  impact 1.0
  title 'Check Emacs installation'

  describe file(emacs_binary) do
    it { should exist }
    it { should be_executable }
  end

  describe command("#{emacs_binary} --version") do
    its('exit_status') { should eq 0 }
    expect = /GNU Emacs/
    its('stdout') { should match expect }
  end
end

kitchen 用の設定ファイルの作成

  • vim .kitchen.yml
driver:
  name: docker

provisioner:
  name: chef_zero

platforms:
  - name: ubuntu-22.04

suites:
  - name: default
    run_list:
      - recipe[cookbooks-emacs::default]
    attributes:
      owner: root
      group: root
    verifier:
      name: inspec

動作確認

  • bundle exec kitchen test

最初に kitchen でテストするようのイメージをビルドします
そしてそのイメージを元に chef を実行するコンテナが起動します

% docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                      PORTS     NAMES
fe474147bd7b   3d1e259aa0fe   "/usr/sbin/sshd -D -…"   36 minutes ago   Exited (0) 27 minutes ago             defaultubuntu2204-username-machinename-6n9j5hv9
% docker images
REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
<none>       <none>    3d1e259aa0fe   About an hour ago   241MB

おまけ: Github Action で実行する

  • vim .github/workflows/kitchen.yml
name: Kitchen test

on:
  push:
    branches:
      - "master"

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true

      - name: Install dependencies
        run: bundle install

      - name: Set up Docker
        uses: docker/setup-docker-action@v3

      - name: Run Test Kitchen
        run: |
          bundle exec kitchen test
        env:
          CHEF_LICENSE: accept

CHEF_LICENSE: accept を忘れずに設定しましょう

トラブルシューティング

[2025-05-18T10:28:25+09:00] ERROR: Chef InSpec cannot execute without valid licenses.

基本は InSpec を使うのにライセンスが必要なのでライセンス登録をしましょう (有償)

もしくは verifier の name を shell にすることでも対応できます

最後に

kitchen-docker を使えば簡単に cookbooks をクリーンな環境で毎回テストできます
Github Action でも使えるので

参考サイト

2020年6月1日月曜日

Chef で Homebrew のパッケージをインストールする方法

概要

apt や yum は package リソースを使います
Homebrew にも専用のリソースがあり homebrew_package を使うと簡単に Mac 上にパッケージのインストールが行えます

環境

  • macOS 10.15.5
  • chef 16.1.16

使い方

homebrew_package というリソースがあるのでそれを使います
例えば以下のように定義します

homebrew_package "install redis" do
  package_name "redis"
  action :install
end

古い記事だと homebrew cookbook を使ってインストール方法が紹介されていますが最新版であればリソースとして提供されているのでそちらを使いましょう
バージョンは 12.0 以上が必要です

参考サイト

2020年5月31日日曜日

Mac で chef-solo を実行してみた

概要

Mac で chef-solo を実行し mac 自体をプロビジョニングする方法を紹介します

環境

  • macOS 10.15.5
  • Ruby 2.7.1p83
    • chef 16.1.16
    • knife-solo 0.7.0

chef のインストール

chef-workstation をインストールします
これに chef-solo も含まれています
これは chef を使うのに必要なツールなどが一式揃っているツール群になります

  • brew cask install chef-workstation

or

  • sudo curl -L http://www.opscode.com/chef/install.sh | sudo zsh

のどちらからでインストールします
どちらも dmg からインストールする方式なのでインストールされるものは同じです
gem install chef だと chef コマンドが使えませんでした

テスト用の cookbook の作成

  • mkdir ~/try_chef
  • cd ~/try_chef
  • mkdir -p cookbooks/test/recipes

レシピ作成

  • vim cookbooks/test/recipes/default.rb
file "#{ENV['HOME']}/hoge.txt" do
  action :touch
end

とりあえずホームディレクトリに空のファイルを作成するだけのレシピです

node ファイルの作成

  • vim localhost.json
{
  "run_list": [
    "recipe[test]"
  ]
}

作成した test cookbook を実行するようにします

solo.rb の作成

cookbook のパスや nodes, roles を管理するディレクトリを指定します
今回はカレント配下に作成しているので相対パスですが絶対パスで書いても OK です

  • vim solo.rb
cookbook_path    ["cookbooks", "site-cookbooks"]
node_path        "nodes"
role_path        "roles"
environment_path "environments"
data_bag_path    "data_bags"

node_pathrole_path は今回作成していませんがとりあえず指定しています

実行してみる

あとは実行するだけです

  • chef-solo -j ./test.json -c ./solo.rb

これで ~/hoge.txt が作成されているのが確認できると思います

おまけ: knife solo 経由で実行するには

knife solo というツールを使うと chef-solo を ssh 経由で実行できます
一応試したのですが knife solo prepare が macOS 10.15 に対応してないので諦めました

knife-solo のインストール

chef-workstation が使っている gem を使って knife-solo をインストールします

  • brew install coreutils
  • /opt/chef-workstation/embedded/bin/gem install knife-solo

or

  • sudo /opt/chef/embedded/bin/gem install knife-solo

Homebrew の場合は上で Omnibus Install の場合は下を使います

knife プロジェクトの初期化

knife solo init で初期化します
カレントディレクトリを指定しているので注意してください

  • mkdir ~/try_chef2
  • cd ~/try_chef2
  • knife solo init .

cookbook の作成

chef コマンドを使うと雛形を作成してくれます
これ自体は knife solo とは関係ないので chef-solo のみの場合でも使えます

  • chef generate cookbook cookbooks/test

knife solo prepare して chef-solo を実行できる準備をする

ここで失敗しました

  • knife solo prepare localhost

ERROR: RuntimeError: OS X version 10.15.5 not supported」となりました
もしこれができればあとはレシピと node ファイルを作成して

  • knife solo cook localhost ./test.json

すれば OK です

mac 上で localhost に ssh ログインできるようにするには

環境設定から「共有」を選択します
そして「リモートログイン」にチェックを入れれば OK です
knife solo を実行するユーザが ssh できるようにユーザを追加するのを忘れないようにしましょう

最後に

Mac 上に chef-solo をインストールし Mac 自体をプロビジョニングするレシピを作成して動かしてみました
Mac から vagrant などをプロビジョニングする方法は紹介されているのですが Mac 自体をプロビジョニングする記事があまりなかったので紹介してみました

chef-solo をインストールするのが一番大変でした