fbpx

CL LAB

HOME > CL LAB > Chef > Chef Development Kit 0.3.2を使ってみよう:ポリシーファイル編 #opschef_ja #getchef_ja

Chef Development Kit 0.3.2を使ってみよう:ポリシーファイル編 #opschef_ja #getchef_ja

 ★ 10

ポリシーファイルを使ってみよう

Chef DK 0.3.0に新機能「ポリシーファイル」が導入されました。詳しくは[和訳] ChefDK 0.3.0 リリース! ポリシーファイルを導入を参照してください。
本項では、実際にポリシーファイルを利用し、どのようなものなのかを検証していきます。

注意にある通り、既存の環境に影響を与えるため、まったく新規のEnterprise Chefを用いて検証します。ここでは仮想マシン上にインストールしたEnterprise Chef 12.0.0 rc 5を用いています。

なお、Chef DK 0.3.2ではポリシーファイルの利用にバグがあります: chef push got 400 "Bad Request" from Enterprise Chef 12.0.0.rc5 and 11.1.3
修正するには Don't attempt an upload when all cookbooks exist on the server/opt/chefdk/embedded/apps/chef-dk/ に適用してください。

事前準備

Enterprise Chefへのユーザ登録とchef-repoの準備は Chef Starter Kitの活用 を参照してください。

ポリシーファイルの作成

このchef-repoにおいてポリシーファイルを使ってみましょう。なお、Chef DK 0.3.2の時点ではポリシーファイルは実験的な新機能で、本番環境に適用できるものではないということに注意してください。

まずchef-repoディレクトリ直下で「chef generate policyfile」コマンドを実行し、ポリシーファイルの雛形を生成します。

ubuntu@ws:~/chef-repo$ chef generate policyfile
Compiling Cookbooks...
Recipe: code_generator::policyfile
  * template[/home/ubuntu/chef-repo/Policyfile.rb] action create
    - create new file /home/ubuntu/chef-repo/Policyfile.rb
    - update content in file /home/ubuntu/chef-repo/Policyfile.rb from none to 0cceff
    (diff output suppressed by config)
ubuntu@ws:~/chef-repo$

次のような内容となっています。

ubuntu@ws:~/chef-repo$ cat Policyfile.rb
# Policyfile.rb - Describe how you want Chef to build your system.
#
# For more information on the Policyfile feature, visit
# https://github.com/opscode/chef-dk/blob/master/POLICYFILE_README.md

# A name that describes what the system you're building with Chef does.
name "example_application"

# Where to find external cookbooks:
default_source :community

# run_list: chef-client will run these recipes in the order specified.
run_list "cookbook::recipe", "other_cookbook::recipe"

# Specify a custom source for a single cookbook:
# cookbook "development_cookbook", path: "../cookbooks/development_cookbook"
ubuntu@ws:~/chef-repo$

書き換える前に、gitコミットしておきます。

ubuntu@ws:~/chef-repo$ git add Policyfile.rb
ubuntu@ws:~/chef-repo$ git commit -m 'generated policyfile' Policyfile.rb
[master 7b730db] generated policyfile
 1 file changed, 16 insertions(+)
 create mode 100644 Policyfile.rb
ubuntu@ws:~/chef-repo$

これを書き換えます。

ubuntu@ws:~/chef-repo$ vi Policyfile.rb
ubuntu@ws:~/chef-repo$ git diff
diff --git a/Policyfile.rb b/Policyfile.rb
index 5a2f5ce..a905fe2 100644
--- a/Policyfile.rb
+++ b/Policyfile.rb
@@ -4,13 +4,13 @@
 # https://github.com/opscode/chef-dk/blob/master/POLICYFILE_README.md

 # A name that describes what the system you're building with Chef does.
-name "example_application"
+name 'starter'

 # Where to find external cookbooks:
 default_source :community

 # run_list: chef-client will run these recipes in the order specified.
-run_list "cookbook::recipe", "other_cookbook::recipe"
+run_list 'apache2', 'recipe[starter]'

 # Specify a custom source for a single cookbook:
-# cookbook "development_cookbook", path: "../cookbooks/development_cookbook"
+cookbook 'starter', path: 'cookbooks/starter'
ubuntu@ws:~/chef-repo$

gitコミットしておきます。

ubuntu@ws:~/chef-repo$ git commit -m 'modify for starter' Policyfile.rb
[master 389dda8] modify for starter
 1 file changed, 3 insertions(+), 3 deletions(-)
ubuntu@ws:~/chef-repo$

次にchef installコマンドを実行します。

ubuntu@ws:~/chef-repo$ chef install
Building policy starter
Expanded run list: recipe[apache2], recipe[starter]
Caching Cookbooks...
Installing starter >= 0.0.0 from path
Installing apache2   2.0.0
Installing iptables  0.14.0
Installing logrotate 1.7.0
Installing pacman    1.1.1

Lockfile written to /home/ubuntu/chef-repo/Policyfile.lock.json
ubuntu@ws:~/chef-repo$

依存関係を計算して必要なCookbookを「:community」すなわちSupermarketからダウンロードし、~/.chefdk/cache/以下にキャッシュします。

ubuntu@ws:~/chef-repo$ tree -L 1 -aF ~/.chefdk/cache/cookbooks/
/home/ubuntu/.chefdk/cache/cookbooks/
|-- apache2-2.0.0-supermarket.getchef.com/
|-- iptables-0.14.0-supermarket.getchef.com/
|-- logrotate-1.7.0-supermarket.getchef.com/
`-- pacman-1.1.1-supermarket.getchef.com/

4 directories, 0 files
ubuntu@ws:~/chef-repo$

ubuntu@ws:~/chef-repo$ tree -aF ~/.chefdk/cache/.cache/artifactserver/
/home/ubuntu/.chefdk/cache/.cache/artifactserver/
|-- apache2-2.0.0-supermarket.getchef.com.tgz
|-- iptables-0.14.0-supermarket.getchef.com.tgz
|-- logrotate-1.7.0-supermarket.getchef.com.tgz
`-- pacman-1.1.1-supermarket.getchef.com.tgz

0 directories, 4 files
ubuntu@ws:~/chef-repo$

「ドキュメント」と呼ばれる計算結果を記録した「Policyfile.lock.json」ファイルを生成します。

ubuntu@ws:~/chef-repo$ cat Policyfile.lock.json
{
  "name": "starter",
  "run_list": [
    "recipe[apache2::default]",
    "recipe[starter::default]"
  ],
  "cookbook_locks": {
    "starter": {
      "version": "1.0.0",
      "identifier": "8f8d53800da22e5edf9e8fa3b0945029da2064c2",
      "dotted_decimal_identifier": "40406311439802926.26704519918497940.88140683437250",
      "source": "cookbooks/starter",
      "cache_key": null,
      "scm_info": null,
      "source_options": {
        "path": "cookbooks/starter"
      }
    },
    "apache2": {
      "version": "2.0.0",
      "identifier": "69dc01b2c59e38ff3978d00afff1f95c5d916ce8",
      "dotted_decimal_identifier": "29796772406992440.71839310110457841.274175102119144",
      "cache_key": "apache2-2.0.0-supermarket.getchef.com",
      "origin": "https://supermarket.getchef.com/api/v1/cookbooks/apache2/versions/2.0.0/download",
      "source_options": {
        "artifactserver": "https://supermarket.getchef.com/api/v1/cookbooks/apache2/versions/2.0.0/download",
        "version": "2.0.0"
      }
    },
    "iptables": {
      "version": "0.14.0",
      "identifier": "647cf3bec328d81821e60a5ec30c461c4d97e748",
      "dotted_decimal_identifier": "28284883990423768.6792671341232908.77087374829384",
      "cache_key": "iptables-0.14.0-supermarket.getchef.com",
      "origin": "https://supermarket.getchef.com/api/v1/cookbooks/iptables/versions/0.14.0/download",
      "source_options": {
        "artifactserver": "https://supermarket.getchef.com/api/v1/cookbooks/iptables/versions/0.14.0/download",
        "version": "0.14.0"
      }
    },
    "logrotate": {
      "version": "1.7.0",
      "identifier": "de95227477dc83486057de755d73dff121fcc54c",
      "dotted_decimal_identifier": "62651420045204611.20372128833822067.246226750326092",
      "cache_key": "logrotate-1.7.0-supermarket.getchef.com",
      "origin": "https://supermarket.getchef.com/api/v1/cookbooks/logrotate/versions/1.7.0/download",
      "source_options": {
        "artifactserver": "https://supermarket.getchef.com/api/v1/cookbooks/logrotate/versions/1.7.0/download",
        "version": "1.7.0"
      }
    },
    "pacman": {
      "version": "1.1.1",
      "identifier": "f5a78402828a7b38ac87e0c95772b5527987282b",
      "dotted_decimal_identifier": "69145554713741947.15952298287650674.199365830846507",
      "cache_key": "pacman-1.1.1-supermarket.getchef.com",
      "origin": "https://supermarket.getchef.com/api/v1/cookbooks/pacman/versions/1.1.1/download",
      "source_options": {
        "artifactserver": "https://supermarket.getchef.com/api/v1/cookbooks/pacman/versions/1.1.1/download",
        "version": "1.1.1"
      }
    }
  },
  "solution_dependencies": {
    "Policyfile": [
      [
        "starter",
        ">= 0.0.0"
      ],
      [
        "apache2",
        "= 2.0.0"
      ],
      [
        "iptables",
        "= 0.14.0"
      ],
      [
        "logrotate",
        "= 1.7.0"
      ],
      [
        "pacman",
        "= 1.1.1"
      ]
    ],
    "dependencies": {
      "apache2 (2.0.0)": [
        [
          "iptables",
          ">= 0.0.0"
        ],
        [
          "logrotate",
          ">= 0.0.0"
        ],
        [
          "pacman",
          ">= 0.0.0"
        ]
      ],
      "iptables (0.14.0)": [

      ],
      "logrotate (1.7.0)": [

      ],
      "pacman (1.1.1)": [

      ],
      "starter (1.0.0)": [

      ]
    }
  }
}
ubuntu@ws:~/chef-repo$

これもgitにコミットしておきます。

ubuntu@ws:~/chef-repo$ git add Policyfile.lock.json
ubuntu@ws:~/chef-repo$ git commit -m 'add policyfile document' Policyfile.lock.json
[master 19b8448] add policyfile document
 1 file changed, 116 insertions(+)
 create mode 100644 Policyfile.lock.json
ubuntu@ws:~/chef-repo$

では、このポリシーを「demo」と命名してChef Serverにアップロードしてみましょう。

ubuntu@ws:~/chef-repo$ chef push demo
WARN: Uploading policy to policy group demo in compatibility mode
WARN: Uploading cookbooks using semver compat mode
[2014-11-04T11:55:17+09:00] ERROR: SSL Validation failure connecting to host: manage.opscode.local - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
Error: Failed to upload policy to policy group demo
Reason: OpenSSL::SSL::SSLError

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
ubuntu@ws:~/chef-repo$

SSL検証エラーが出てしまったので、ここでは無視のためknife.rbファイルに次を追加します。

ssl_verify_mode :verify_none

再度、実行してみます。

ubuntu@ws:~/chef-repo$ chef push demo
WARN: Uploading policy to policy group demo in compatibility mode
WARN: Uploading cookbooks using semver compat mode
Error: Failed to upload policy to policy group demo
Reason: (Net::HTTPServerException) HTTP 400 Bad Request: Field 'metadata.maintainer' invalid

ubuntu@ws:~/chef-repo$

エラーになってしまいました。どうやら、Chef Starter Kitに含まれているstarter Cookbookのmetadata.rbが不正のようです。修正しましょう。

ubuntu@ws:~/chef-repo$ vi cookbooks/starter/metadata.rb
ubuntu@ws:~/chef-repo$ git diff
diff --git a/cookbooks/starter/metadata.rb b/cookbooks/starter/metadata.rb
index b368ea2..e6f970a 100644
--- a/cookbooks/starter/metadata.rb
+++ b/cookbooks/starter/metadata.rb
@@ -1,3 +1,5 @@
 name 'starter'
 description 'A basic starter cookbook'
 version '1.0.0'
+maintainer 'CREATIONLINE,INC.'
+maintainer_email 'd-higuchi@creationline.com'
ubuntu@ws:~/chef-repo$ git commit -m "add maintainer's info" cookbooks/starter/metadata.rb
[master 54b33f1] add maintainer's info
 1 file changed, 2 insertions(+)
ubuntu@ws:~/chef-repo$

再度、chef installコマンドを実行し、ドキュメントを更新します。今回は更新されませんでした。

ubuntu@ws:~/chef-repo$ chef install
Installing cookbooks from lock
Installing starter   1.0.0
Using      apache2   2.0.0
Using      iptables  0.14.0
Using      logrotate 1.7.0
Using      pacman    1.1.1
ubuntu@ws:~/chef-repo$ git diff
ubuntu@ws:~/chef-repo$

demo」ポリシーをChef Serverにアップロードします。

ubuntu@ws:~/chef-repo$ chef push demo
WARN: Uploading policy to policy group demo in compatibility mode
WARN: Uploading cookbooks using semver compat mode
Uploaded starter   1.0.0  (eea75c11)
Uploaded apache2   2.0.0  (69dc01b2)
Uploaded iptables  0.14.0 (647cf3be)
Uploaded logrotate 1.7.0  (de952274)
Uploaded pacman    1.1.1  (f5a78402)
Policy uploaded as data bag item policyfiles/starter-demo
ubuntu@ws:~/chef-repo$

アップロードできました。knifeコマンドで確認してみましょう。

ubuntu@ws:~/chef-repo$ knife cookbook list
apache2     29796772406992440.71839310110457841.274175102119144
iptables    28284883990423768.6792671341232908.77087374829384
logrotate   62651420045204611.20372128833822067.246226750326092
pacman      69145554713741947.15952298287650674.199365830846507
starter     67175058325635343.63762901890286453.64779189770942
ubuntu@ws:~/chef-repo$
ubuntu@ws:~/chef-repo$ knife data bag list
policyfiles
ubuntu@ws:~/chef-repo$ knife data bag show policyfiles
starter-demo
ubuntu@ws:~/chef-repo$ knife data bag show policyfiles starter-demo -F json
{
  "name": "starter",
  "run_list": [
    "recipe[apache2::default]",
    "recipe[starter::default]"
  ],
  "cookbook_locks": {
    "starter": {
      "version": "1.0.0",
      "identifier": "eea75c1144010fe288057d04c3753aea94985abe",
      "dotted_decimal_identifier": "67175058325635343.63762901890286453.64779189770942",
      "source": "cookbooks/starter",
      "cache_key": null,
      "scm_info": null,
      "source_options": {
        "path": "cookbooks/starter"
      }
    },
    "apache2": {
      "version": "2.0.0",
      "identifier": "69dc01b2c59e38ff3978d00afff1f95c5d916ce8",
      "dotted_decimal_identifier": "29796772406992440.71839310110457841.274175102119144",
      "cache_key": "apache2-2.0.0-supermarket.getchef.com",
      "origin": "https://supermarket.getchef.com/api/v1/cookbooks/apache2/versions/2.0.0/download",
      "source_options": {
        "artifactserver": "https://supermarket.getchef.com/api/v1/cookbooks/apache2/versions/2.0.0/download",
        "version": "2.0.0"
      }
    },
    "iptables": {
      "version": "0.14.0",
      "identifier": "647cf3bec328d81821e60a5ec30c461c4d97e748",
      "dotted_decimal_identifier": "28284883990423768.6792671341232908.77087374829384",
      "cache_key": "iptables-0.14.0-supermarket.getchef.com",
      "origin": "https://supermarket.getchef.com/api/v1/cookbooks/iptables/versions/0.14.0/download",
      "source_options": {
        "artifactserver": "https://supermarket.getchef.com/api/v1/cookbooks/iptables/versions/0.14.0/download",
        "version": "0.14.0"
      }
    },
    "logrotate": {
      "version": "1.7.0",
      "identifier": "de95227477dc83486057de755d73dff121fcc54c",
      "dotted_decimal_identifier": "62651420045204611.20372128833822067.246226750326092",
      "cache_key": "logrotate-1.7.0-supermarket.getchef.com",
      "origin": "https://supermarket.getchef.com/api/v1/cookbooks/logrotate/versions/1.7.0/download",
      "source_options": {
        "artifactserver": "https://supermarket.getchef.com/api/v1/cookbooks/logrotate/versions/1.7.0/download",
        "version": "1.7.0"
      }
    },
    "pacman": {
      "version": "1.1.1",
      "identifier": "f5a78402828a7b38ac87e0c95772b5527987282b",
      "dotted_decimal_identifier": "69145554713741947.15952298287650674.199365830846507",
      "cache_key": "pacman-1.1.1-supermarket.getchef.com",
      "origin": "https://supermarket.getchef.com/api/v1/cookbooks/pacman/versions/1.1.1/download",
      "source_options": {
        "artifactserver": "https://supermarket.getchef.com/api/v1/cookbooks/pacman/versions/1.1.1/download",
        "version": "1.1.1"
      }
    }
  },
  "solution_dependencies": {
    "Policyfile": [
      [
        "starter",
        ">= 0.0.0"
      ],
      [
        "apache2",
        "= 2.0.0"
      ],
      [
        "iptables",
        "= 0.14.0"
      ],
      [
        "logrotate",
        "= 1.7.0"
      ],
      [
        "pacman",
        "= 1.1.1"
      ]
    ],
    "dependencies": {
      "apache2 (2.0.0)": [
        [
          "iptables",
          ">= 0.0.0"
        ],
        [
          "logrotate",
          ">= 0.0.0"
        ],
        [
          "pacman",
          ">= 0.0.0"
        ]
      ],
      "iptables (0.14.0)": [

      ],
      "logrotate (1.7.0)": [

      ],
      "pacman (1.1.1)": [

      ],
      "starter (1.0.0)": [

      ]
    }
  },
  "id": "starter-demo"
}
ubuntu@ws:~/chef-repo$

これでNodeにポリシーを適用する準備ができました。

ポリシーファイルの適用

knife bootstrap済のNodeを準備します。
/etc/chef/client.rbファイルを次のように変更し、「demo」のポリシーファイルモードで動作するように設定します。

ubuntu@node:~$ sudo cp -a /etc/chef/client.rb /etc/chef/client.rb.orig
ubuntu@node:~$ sudo vi /etc/chef/client.rb
ubuntu@node:~$ diff -u /etc/chef/client.rb.orig /etc/chef/client.rb
--- /etc/chef/client.rb.orig    2014-11-04 12:39:58.897704315 +0900
+++ /etc/chef/client.rb 2014-11-04 12:50:09.313708433 +0900
@@ -3,3 +3,5 @@
 validation_client_name "creationline-validator"
 # Using default node name (fqdn)
 
+use_policyfile true
+deployment_group 'starter-demo'

では、chef-clientを実行し、ポリシーを適用してみましょう。

ubuntu@node:~$ sudo chef-client
Starting Chef Client, version 11.16.4
[2014-11-04T12:50:38+09:00] WARN: Using experimental Policyfile feature
resolving cookbooks for run list: ["apache2::default@2.0.0 (69dc01b)", "starter::default@1.0.0 (eea75c1)"]
Synchronizing Cookbooks:
  - starter
  - apache2
  - iptables
  - logrotate
  - pacman
Compiling Cookbooks...
Converging 81 resources
    :
    :
    :
Recipe: starter::default
  * log[Welcome to Chef, Sam Doe!] action write
 
Recipe: apache2::default
  * service[apache2] action reload
    - reload service service[apache2]

Running handlers:
Running handlers complete
Chef Client finished, 32/63 resources updated in 25.022137793 seconds
ubuntu@node:~$

このように、従来のrun_listなどの場合と同じように、ポリシーを適用することができました。

まとめ

前回のChef Development Kitの紹介に引き続き、実験的機能であるポリシーファイルを試用してみました。
“chef”コマンドという名称や、Nodeに適用するポリシーを一括で管理しようという試みのポリシーファイル機能など、Chefが標準的なワークフローを生み出そうとしている感があります。興味のある方は是非試してみてください。


CL LAB Mail Magazine

CL LABの情報を逃さずチェックしよう!

メールアドレスを登録すると記事が投稿されるとメールで通知します。

メールアドレス: 登録

※登録後メールに記載しているリンクをクリックして認証してください。

Related post