Chef >

目次

プラットフォームのセキュリティアップデート

  • 数百台から数千台のサーバのセキュリティアップデート作業を考えてみます。
  • 以下の例は、プラットフォームのパッケージをすべて更新するものですが、特定のソフトウェアを最新版に更新するケース等も、レシピの改修やロールによる属性の変更(バージョン指定など)により、容易に対応可能だと思われます。
  • 最後の knife solo の利用はあまりすすめられませんが、最初の3つの方法についてはそれぞれの運用の場面で適切に利用するとよいでしょう。

通常の ChefServer を使う(Pull)

  • Chef本来のPullアーキテクチャによる反映ですので、最も簡便でスケールアウトする方法です。通常運用に最適でしょう。
  • ChefServer と各ノードの ChefClient (常駐また定期実行)はあらかじめ構築されている前提です。
  1. commons::platform_update レシピを作成し、ChefServerにアップロードします。
    1. case node[:platform_family]
    2. when 'debian' then
    3.   execute 'apt-get_upgrade' do
    4.     user 'root'
    5.     command 'apt-get update;apt-get upgrade -y'
    6.     action :run
    7.   end
    8. when 'rhel' then
    9.   execute 'yum_update' do
    10.     user 'root'
    11.     command 'yum update -y'
    12.     action :run
    13.   end
    14. end
    $ knife cookbook upload commons
  2. 以下のような security_update ロールを作成し、ノードの反映に適当なロールの run_list に含めます。dev環境での動作確認が済み次第、staging、prod環境に順にロールアウトしていきます。
    1. name 'security_update'
    2. description 'Security Update role.'
    3.  
    4. #run_list()
    5.  
    6. env_run_lists(
    7.   'prod' => [],
    8.   'staging' => [],
    9.   'dev' => ['recipe[commons::platform_update]'],
    10.   '_default' => [],
    11. )
    12.  
    13. #default_attributes()
    14.  
    15. #override_attributes()
    $ knife role from file roles/security_update.rb
  3. ロール反映後は、各ノードに常駐または定期実行されているChefClientによる収束を待つだけです。反映状況は、WebUIやコマンドラインツール(knife runs)により確認できます。

ChefPushJobs を利用する(Push)

  • ChefPushJobs によるジョブをワークステーションからトリガする方法です。ある程度反映タイミングを図ることが可能で、並列実行の仕組のためスケールアウトも容易です。実行可能なコマンド文字列をホワイトリストに明示するため、作業ミスの心配がありません。
  • ChefServerChefClient に加えて、opscode-push-jobs-server とノード上の push-jobs-client も構築済みの前提です。
  1. (ノードに反映するのに)適切なロールを利用して、ホワイトリストに許可コマンド(platform_update)を追加します。ホワイトリスト設定は、各ノードのChefClientによって自動で反映(収束)されます。
    1. roles/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.        'platform_update' => 'apt-get update;apt-get upgrade -y',
      18.     },
      19.   },
      20. )
      21.  
      22. #override_attributes()
      $ knife role from file roles/push-jobs-ubuntu.rb
    2. roles/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.       'platform_update' => 'yum update -y',
      18.     },
      19.   },
      20. )
      21.  
      22. #override_attributes()
      $ knife role from file roles/push-jobs-rhel.rb
  2. ホワイトリストの反映を見計らってから、対象ノードを指定してジョブをスタートさせます。knifeはChef全般の運用管理コマンドですが、ChefPushJobsのための knife-push プラグインが提供するサブコマンドを使用します。
    $ knife job start platform_update chef-node{00,01}.grid.example.com
    Started.  Job ID: 01eb8e5789f496681ccd5366084a927a
    Running (1/2 in progress) ...
    Complete.
    command:     platform_update
    created_at:  Thu, 08 Nov 2015 18:16:52 GMT
    id:          01eb8e5789f496681ccd5366084a927a
    nodes:
      succeeded:
        chef-node00.grid.example.com
        chef-node01.grid.example.com
    run_timeout: 3600
    status:      complete
    updated_at:  Thu, 08 Nov 2015 18:16:57 GMT
    • lightbulb.pngなお、対象ノードの指定には、-s, --search QUERY オプションが便利です。利用の際は、あらかじめ knife search node コマンドで対象ノードを確認しておきます。
      $ knife job start platform_update --search 'name:chef-node*'
      $ knife job start platform_update --search 'roles:security_update'
      $ knife job start platform_update --search 'tags:demo'

knife ssh を使う(Push)

  • 直接、コマンド文字列を渡してSSH接続経由で実行させる方法です。並列実行されるため、スケールアウトします。
  • ノード指定のため、あらかじめ ChefServer と各ノードの ChefClient の構築が必要です。
  • 通常運用に使用するというよりは、緊急時の作業手段(これはこれで必要なものです)として考えておくとよいでしょう。コマンド文字列を直接指定するため十分な注意が必要です。
  1. 以下の要領で実行します。並列度は、-C, --concurrency NUM オプションで設定できます。
    $ knife ssh 'name:chef-node00.grid.example.com' 'sudo apt-get update;sudo apt-get upgrade -y'
    $ knife ssh 'name:chef-node01.grid.example.com' 'sudo yum update -y'
    
    $ knife ssh 'platform_family:debian' 'sudo apt-get update;sudo apt-get upgrade -y'
    $ knife ssh 'platform_family:rhel' 'sudo yum update -y'

info.pngAnsible を使う(Push)

  • 参考までにAnsibleでも同等のことができます。
  1. 並列度は、-f NUM, --forks=NUM オプション(デフォルト5)で指定できます。ただし、複数のコマンドを一行で渡すことはできませんので、複雑な作業にはモジュール化やPlaybookの作成を検討しましょう。
    $ ansible chef-node00.grid.example.com -s -K -a 'apt-get update'
    $ ansible chef-node00.grid.example.com -s -K -a 'apt-get upgrade -y'
    
    $ ansible chef-node01.grid.example.com -s -K -a 'yum update -y'

info.pngFabric を使う(Push)

  • またFabricでも同等のことが可能です。
  1. 並列度は、-P, --parallel および -z INT, --pool-size=INT で指定します。複雑な作業にはモジュール化を検討しましょう。
    $ fab -H chef-node00.grid.example.com -- 'sudo apt-get update; sudo apt-get upgrade -y'
    
    $ fab -H chef-node01.grid.example.com -- 'sudo yum update -y'
  2. ただし、並列実行する場合にはsudoオペレーションを利用する必要がありますので、あらかじめsudoタスクを定義しておき以下の要領で実行します。sudoタスクの定義についてはこちらをご参照ください。
    $ fab -I -P -z 20 -H `echo dn000{00..99}.grid.example.com | tr ' ' ','` sudo_task:'chef-client'
    Initial value for env.password:
    ...
    • lightbulb.pngYUM関連の操作でエラーする場合には、-s '/bin/bash -c' オプションを追加してシェル実行の設定を上書きし、デフォルト設定で付加されている bash の -l オプションを落としてやると回避できます。

knife solo を使う(Push、非推奨)

  • サーバ環境などの事前構築が不要な方法です。
  • しかし、そのままでは並列実行されず、ノード毎にローカルのクックブック等が同期されますのであまりスケールアウトしません。
  • クックブック一式の用意、および各ノードへの knife solo prepare は済んでいる前提です。
  1. knife-zero以前の環境では、ノード情報が管理されていませんので、ノードを明示指定して実行します。ノード数が多い場合には、ノードリストの受け渡しに xargs を利用するとよいでしょう。そのままではノード毎に順次実行となり、かなりの時間を要してしまう方法です。
    $ knife solo cook chef-node00.grid.example.com -c knife-solo.rb -o 'role[security_update]'
    $ knife solo cook chef-node01.grid.example.com -c knife-solo.rb -o 'role[security_update]'

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-09-30 (金) 22:30:59 (1886d)