Chef >

目次

概要

  • Chefは、基本的に各ノード上のエージェントであるchef-clientがトリガとなるPullアーキテクチャですが、ChefPushJobsアドオンを追加することによりワークステーションからジョブ実行をトリガできるPushアーキテクチャを簡単に導入することができます。システム全体の変更のタイミングを図りたい場合などには、このPushアーキテクチャは重宝するのではないでしょうか。
  • 全体のアーキテクチャについては、Chef Push Jobsの説明が大変参考になります。
  • カレントバージョンは1.xですが、2.0では大幅な機能強化が行われ、より使いやすくなるようです。

セットアップ

  • Chefサーバ(opscode-push-jobs-server)、ノード上のクライアント(push-jobs-client)、ワークステーションの管理ツール(knife-push)のセットアップが必要となります。

サーバ

  1. 以下の要領でセットアップします。
    $ sudo chef-server-ctl install opscode-push-jobs-server
    $ sudo chef-server-ctl reconfigure
    $ sudo opscode-push-jobs-server-ctl reconfigure

クライアント

  • ChefPushJobsを機能させるには、各ノードにchef-clientとは別に push-jobs-client を常駐させる必要があります。
  • push-jobs-clientは、push-jobs クックブックを使ってchef-clientによってセットアップします。
  1. まず push-jobs クックブックを入手します。入手にはBerkshelfを使用するのがよいでしょう。site install しても構いませんが、Chefのベストプラクティスに則し既存のクックブックは改変しない方がベターでしょう。
    1. roles/Berksfile: Berksfileに以下の依存クックブックを追加します。
      1. cookbook 'push-jobs'
    2. ベンダインストールし、サーバに必要なクックブックをすべてアップロードします。
      $ berks vendor vendor/cookbooks/ -b roles/Berksfile
      $ knife cookbook upload `ls vendor/cookbooks`
  2. push-jobs-client をノードにインストールする設定をします。
    1. note.pngpush-jobsクックブックの ['push_jobs']['package_version'] 属性にバージョンを指定すれば、OS環境に関係なくセットアップできるはずですが、ver. 1.1.5 ではうまく行きませんでしたので、以下ではOS環境毎にインストールパッケージを指定しています。
    2. ノードのOS環境に合ったパッケージを https://downloads.chef.io/push-jobs-client/ から一度ダウンロードし、SHA256ハッシュ値を調べておきます。
      $ sha256sum opscode-push-jobs-client_1.1.5-1_amd64.deb
      d7b40ebb18c7c7dbc32322c9bcd721279e707fd1bee3609a37055838afbf67ea  opscode-push-jobs-client_1.1.5-1_amd64.deb
    3. push-jobsレシピとともにインストールするパッケージの情報とホワイトリスト(実行を許可するコマンドリスト)を属性としてロールに設定します。
      1. ubuntu.pngroles/push-jobs-ubuntu.rb
        1. name 'push-jobs-ubuntu'
        2. description 'Chef Push Jobs for Ubuntu'
        3.  
        4. run_list(
        5.   'recipe[push-jobs]'
        6. )
        7.  
        8. #env_run_lists()
        9.  
        10. default_attributes(
        11.   'push_jobs' => {
        12.     #'package_version' => '1.1.5',
        13.     'package_url' =>  'https://web-dl.packagecloud.io/chef/stable/packages/ubuntu/precise/opscode-push-jobs-client_1.1.5-1_amd64.deb',
        14.     # sha256
        15.     'package_checksum' => 'd7b40ebb18c7c7dbc32322c9bcd721279e707fd1bee3609a37055838afbf67ea',
        16.     'whitelist' => {
        17.       'chef-client' => 'chef-client',
        18.       'upgrade' => 'apt-get upgrade -y',
        19.     },
        20.   },
        21. )
        22.  
        23. #override_attributes()
      2. redhat.pngroles/push-jobs-rhel.rb
        1. name 'push-jobs-rhel'
        2. description 'Chef Push Jobs for Red Hat Enterprise Linux'
        3.  
        4. run_list(
        5.   'recipe[push-jobs]'
        6. )
        7.  
        8. #env_run_lists()
        9.  
        10. default_attributes(
        11.   'push_jobs' => {
        12.     #'package_version' => '1.1.5',
        13.     'package_url' =>  'https://web-dl.packagecloud.io/chef/stable/packages/el/6/opscode-push-jobs-client-1.1.5-1.el6.x86_64.rpm',
        14.     # sha256
        15.     'package_checksum' => 'd242de41b983428057dfaa0d6b42a8710d1e6992b0235ee22cbf75f44873d77f',
        16.     'whitelist' => {
        17.       'chef-client' => 'chef-client',
        18.       'upgrade' => 'yum update -y',
        19.     },
        20.   },
        21. )
        22.  
        23. #override_attributes()
  3. environments/test.rb: その他、配備環境に共通の設定は Environment に記述するとよいでしょう。テストの場合などサーバの証明書が自己署名の場合には、['push_jobs']['chef']['verify_api_cert']false に、['push_jobs']['chef']['ssl_verify_mode']:verify_peer にします。
    1. default_attributes(
    2.   'push_jobs' => {
    3.     'chef' => {
    4.       #'verify_api_cert' => false,         # default: true
    5.       #'ssl_verify_mode' => :verify_none,  # default: :verify_peer
    6.     },
    7.     'whitelist' => {
    8.       'chef-client' => 'chef-client',
    9.     },
    10.   },
    11. )
    $ knife environment from file environments/test.rb
  4. 対象ノードの run_list に先ほどのロールを追加します。ノードにchef-clientが常駐していれば、以上の設定で push-jobs-client (pushy-client) がセットアップされ、サービスとして起動されます。そうでない場合には、直接ノードにSSHログインして(あるいは knife ssh で)chef-clientコマンドを実行します。レシピ適用(収束)後の push-jobs-client の設定ファイルの以下のようになります。ホワイトリストも正しくマージされています。
    • /etc/chef/push-jobs-client.rb
      1. # Generated by Chef for chef-node00.grid.example.com
      2. #
      3. # Local modifications will be overwritten!
      4.  
      5. LC_ALL='en_US.UTF-8'
      6.  
      7. # Chef server connect options
      8. chef_server_url   'https://gpm00.grid.example.com/organizations/grid'
      9. node_name         'chef-node00.grid.example.com'
      10. client_key        '/etc/chef/client.pem'
      11. trusted_certs_dir '/etc/chef/trusted_certs'
      12. verify_api_cert   true
      13. ssl_verify_mode   :verify_peer
      14.  
      15. # The whitelist comes from node['push_jobs']['whitelist']
      16. whitelist({"chef-client"=>"chef-client", "upgrade"=>"apt-get upgrade -y"})
      17.  
      18. # We're under runit, so don't output timestamp
      19. Mixlib::Log::Formatter.show_time = false

ワークステーション

  1. ジョブ管理ツールである knife-push プラグインをインストールします。
    • Chef DKの場合
      $ sudo chef gem install knife-push
    • Chefクライアントの場合
      $ sudo /opt/chef/embedded/bin/gem install knife-push

使用例

  • 当然ながら、ジョブの管理はワークステーションから knife コマンドを用いて行います。

ノードの状態チェック

  1. node status コマンドを使います。
    $ knife node status
    chef-node00.grid.example.com   available
    chef-node01.grid.example.com   available
    
    $ knife node status chef-node01.grid.example.com
    chef-node01.grid.example.com   available
    
    $ knife node status ns00.grid.example.com
    ns00.grid.example.com unavailable

ジョブの発行

  1. job start コマンドを使います。コマンドにはホワイトリストで設定した名前を指定します。
    $ knife job start chef-client chef-node00.grid.example.com
    Started.  Job ID: 4d694139e584c8560f57a1fa0a9d008a
    Running (1/1 in progress) ...
    Complete.
    command:     chef-client
    created_at:  Sat, 31 Oct 2015 21:48:37 GMT
    id:          4d694139e584c8560f57a1fa0a9d008a
    nodes:
      succeeded: chef-node00.grid.example.com
    run_timeout: 3600
    status:      complete
    updated_at:  Sat, 31 Oct 2015 21:48:44 GMT
    
    $ knife job start upgrade chef-node00.grid.example.com
    Started.  Job ID: 4d694139e584daed136c96a8bfe3dcbc
    Running (1/1 in progress) ...
    Complete.
    command:     upgrade
    created_at:  Sat, 31 Oct 2015 21:48:59 GMT
    id:          4d694139e584daed136c96a8bfe3dcbc
    nodes:
      succeeded: chef-node00.grid.example.com
    run_timeout: 3600
    status:      complete
    updated_at:  Sat, 31 Oct 2015 21:48:59 GMT

-q、--quorum オプション

  • -q、--quorum オプションにより、コマンド実行のための最低ノード率(%)または数を設定することができます。デフォルト値は100%で、指定したすべてのノードが利用可能な場合のみ実行されます。大規模システムの運用では、全ノードが正常に起動していることは稀ですし、また正常なサービス継続を考慮した場合、適用率を設定できるのは重要な機能ではないでしょうか。
  1. 以下は、3ノード中、2ノードのみ(66.6%)がジョブ実行可能な場合です。
    $ knife node status
    chef-node00.grid.example.com   available
    chef-node01.grid.example.com   available
    $ knife node status ns00.grid.example.com
    ns00.grid.example.com   unavailable
  2. --quorum 67% 設定では、条件を満たさないため、実行されません(quorum_failed)。
    $ knife job start --quorum 67% chef-client chef-node{00,01}.grid.example.com ns00.grid.example.com
    Started.  Job ID: 4d694139e584241c2074a2d5de37ace5
    Quorum_failed.
    command:     chef-client
    created_at:  Sun, 01 Nov 2015 01:29:26 GMT
    id:          4d694139e584241c2074a2d5de37ace5
    nodes:
      unavailable: ns00.grid.example.com
      was_ready:
        chef-node00.grid.example.com
        chef-node01.grid.example.com
    run_timeout: 3600
    status:      quorum_failed
    updated_at:  Sun, 01 Nov 2015 01:29:26 GMT
  3. --quorum 66% 設定に変更すると、コマンドが実行されます。
    $ knife job start --quorum 66% chef-client chef-node{00,01}.grid.example.com ns00.grid.example.com
    Started.  Job ID: 4d694139e584cbddded807596e8617ed
    Running (1/3 in progress) ...
    Complete.
    command:     chef-client
    created_at:  Sun, 01 Nov 2015 01:29:49 GMT
    id:          4d694139e584cbddded807596e8617ed
    nodes:
      succeeded:
        chef-node00.grid.example.com
        chef-node01.grid.example.com
      unavailable: ns00.grid.example.com
    run_timeout: 3600
    status:      complete
    updated_at:  Sun, 01 Nov 2015 01:30:03 GMT

-s、--search オプション

  • -s、--search オプションで、ノード名のリストの代わりに対象ノードを限定するクエリを指定できます。
  1. knife search コマンドでクエリの結果をあらかじめ確認しておきます。
    $ knife search node 'role:push-jobs-ubuntu'
    1 items found
    
    Node Name:   chef-node00.grid.example.com
    Environment: test
    FQDN:        chef-node00.grid.example.com
    IP:          192.168.1.x
    Run List:    role[push-jobs-ubuntu]
    Roles:       push-jobs-ubuntu
    Recipes:     push-jobs, push-jobs::default, push-jobs::linux, push-jobs::config, push-jobs::service, push-jobs::service_runit, runit::default
    Platform:    ubuntu 14.04
    Tags:
  2. ジョブをスタートさせます。
    $ knife job start upgrade --search 'role:push-jobs-ubuntu'
    Started.  Job ID: 4d694139e584aeef4e22f2b803887ff9
    Running (1/1 in progress) ...
    Complete.
    command:     upgrade
    created_at:  Sun, 01 Nov 2015 03:58:46 GMT
    id:          4d694139e584aeef4e22f2b803887ff9
    nodes:
      succeeded: chef-node00.grid.example.com
    run_timeout: 3600
    status:      complete
    updated_at:  Sun, 01 Nov 2015 03:58:47 GMT

ジョブの確認

  1. job list コマンドで一覧表示します。
    $ knife job list
  2. ジョブの詳細は、job status コマンドを使います。
    $ knife job status 4d694139e584daed136c96a8bfe3dcbc
    command:     upgrade
    created_at:  Sat, 31 Oct 2015 21:48:59 GMT
    id:          4d694139e584daed136c96a8bfe3dcbc
    nodes:
      succeeded: chef-node00.grid.example.com
    run_timeout: 3600
    status:      complete
    updated_at:  Sat, 31 Oct 2015 21:48:59 GMT

既知の問題

時刻表示が不正

  • Push Jonbsで chef-client を実行させ(レポートされます)、時刻表示を確認しています。
  1. 念のため、Rubyの時刻表示の動作を確認しておきます。
    $ env | grep TZ
    TZ=UTC
    $ ruby -e 'puts Time.now'
    2015-11-03 02:46:19 +0000
    $ export TZ=Asia/Tokyo
    $ ruby -e 'puts Time.now'
    2015-11-03 11:46:49 +0900
  2. 開始時刻: ローカルタイムゾーンはJSTで、+09:00です。
    $ date
    Tue Nov  3 11:05:31 JST 2015
    $ date -u
    Tue Nov  3 02:05:35 UTC 2015
    1. Push Jobs: NG (-09:00 Alaska?)、GMT表示のはずですが、アラスカ時間です。タイムゾーンに関係する時刻の演算に問題があるようです。
      $ knife job start chef-client chef-node00.grid.example.com
      Started.  Job ID: 4d694139e58452ab095de1f2022faa79
      Running (1/1 in progress) ...
      Complete.
      command:     chef-client
      created_at:  Mon, 02 Nov 2015 17:05:45 GMT
      id:          4d694139e58452ab095de1f2022faa79
      nodes:
        succeeded: chef-node00.grid.example.com
      run_timeout: 3600
      status:      complete
      updated_at:  Mon, 02 Nov 2015 17:05:53 GMT
    2. Push Jobs Server: NG、サーバAPIを直接確認しても同様です。
      $ knife exec -E 'puts api.get("/pushy/jobs/4d694139e58452ab095de1f2022faa79")'
      {"nodes"=>{"succeeded"=>["chef-node00.grid.example.com"]}, "id"=>"4d694139e58452ab095de1f2022faa79",
       "command"=>"chef-client", "status"=>"complete", "run_timeout"=>3600, "created_at"=>"Mon, 02 Nov 2015 17:05:45 GMT",
       "updated_at"=>"Mon, 02 Nov 2015 17:05:53 GMT"}
    3. Reporting: OK、Chef Repotingは chef-client 実行時の正しい時刻を記録しています。
      $ knife runs list
      node_name:  chef-node00.grid.example.com
      run_id:     6b81a2c5-1b1d-4e8b-8153-24a65b39a16d
      start_time: 2015-11-03T02:05:48Z
      status:     success
  3. 試みに、シェル環境変数でタイムゾーンをUTCにしてみます。
    $ export TZ='UTC'
    $ date
    Tue Nov  3 02:33:10 UTC 2015
    1. Push Jobs: NG: 修正されませんので、環境変数は影響しないようです。
      $ knife job start chef-client chef-node00.grid.example.com
      Started.  Job ID: 4d694139e584346218277392984b44c7
      Running (1/1 in progress) ...
      Complete.
      command:     chef-client
      created_at:  Mon, 02 Nov 2015 17:33:17 GMT
      id:          4d694139e584346218277392984b44c7
      nodes:
        succeeded: chef-node00.grid.example.com
      run_timeout: 3600
      status:      complete
      updated_at:  Mon, 02 Nov 2015 17:33:21 GMT
    2. Reporting: OK
      $ knife runs list
      node_name:  chef-node00.grid.example.com
      run_id:     b38c4dfe-ffb2-4eff-9ecd-158f05883c35
      start_time: 2015-11-03T02:33:19Z
      status:     success

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-11-03 (火) 11:51:12 (2218d)