Chef-Serverの構築

Chef-Serverを構築します

よくChef-Serverはめんどくさい、最初はSoloからといいますが
きちんとしたやり方がわかるので、必要そうであればServerを入れてみるのも良いと思います。


Chef-Serverレシピの管理、attributeの管理、ノードの管理
Chef-Clientレシピの実行、ステータスの送信
WarkStationレシピの作成、ランリストの作成

今回、Cehf-ServerとWarkStationは同じ環境上に作成します。
Chef-Server、ClientともにCentOS6.5で構築しました。

Chef-Serverのインストール

OpscodeのサイトからRPMパッケージをダウンロード

Chef-Serverのインストール

Chef-Server用のユーザーを作成
デフォルトだと下記ユーザーが作成されます。
uid=495(chef_server) gid=490(chef_server) 所属グループ=490(chef_server)uid=494(opscode-pgsql) gid=489(opscode-pgsql) 所属グループ=489(opscode-pgsql)
Chef-Severはインストールされる際に必要なパッケージは自動的にセットアップされます
WEBサーバとしてNginx、DBとしてPostgreSQL等、必要なものがソースインストールされます。
また、インストールされる際、ホスト名がFQDNとして登録されます
こちらは後程変更します。

ダウンロードしたRPMをインストール
# rpm -ivh chef-server-11.0.10-1.el6.x86_64.rpm
 警告: chef-server-11.0.10-1.el6.x86_64.rpm: ヘッダ V4 DSA/SHA1 Signature, key   ID 83ef826a: NOKEY
 準備中...                ########################################### [100%]
    1:chef-server            ########################################### [100%]
 Thank you for installing Chef Server!
 
 The next step in the install process is to run:
 
 sudo chef-server-ctl reconfigure
初期設定の実行が求められるので、実行
サービスで使用するポートがブッキングしていないよう、サービスを停止する。
# chef-server-ctl reconfigure
 ~省略
 Chef Client finished, 154 resources updated
 chef-server Reconfigured!
無事インストールが完了すれば、Chef-Serverは起動しているので
ブラウザから確認できます。
http://localhost/

デフォルトパスワードは画面の右側に表示されていて
初回ログイン時にパスワードの変更を求められます。

初期状態ではURLがホスト名になっていて不便なのでサイトドメイン名、またはIPに変更します。

Chef-Serverの設定ファイルを修正
# vi /var/opt/chef-server/chef-pedant/etc/pedant_config.rb
 chef_server "https://192.168.1.10"
# vi /var/opt/chef-server/erchef/etc/app.config
                  {s3_url, "https://192.168.1.10"},
# vi /etc/chef-server/chef-server-running.json
      "vip": "192.168.1.10",
      "url": "https://192.168.1.10", 
      "api_fqdn": "192.168.1.10",
      "web_ui_fqdn": "192.168.1.10",
      "server_name": "192.168.1.10",
      "url": "https://192.168.1.10",
Nginxの設定ファイルを修正
# vi /var/opt/chef-server/nginx/etc/nginx.conf
    server_name 192.168.1.10;
    rewrite ^(.*) https://192.168.1.10:443$1 permanent;
設定の反映
# chef-server-ctl restart
 ok: run: bookshelf: (pid 6725) 0s
 ok: run: chef-expander: (pid 6742) 0s
 ok: run: chef-server-webui: (pid 6746) 0s
 ok: run: chef-solr: (pid 6755) 0s
 ok: run: erchef: (pid 6778) 0s
 ok: run: nginx: (pid 6783) 1s
 ok: run: postgresql: (pid 6824) 0s
 ok: run: rabbitmq: (pid 6839) 1s
以上でインストールは完了です。

PostgeSQLのカスタマイズ

デフォルト設定でも十分問題なく動きますが
運用を考えて少し修正します。


PostgreSQLの設定


Chef-Server用にパッケージがカスタマイズされていますが、ログ周り等少し修正
ログ周り
# vi /var/opt/chef-server/postgresql/data/postgresql.conf
wal_level = archive
fsync = on
checkpoint_segments =  10 
wal_sync_method = fsync
log_destination = 'stderr'
logging_collector = on
log_directory = '/var/log/chef-server/postgresql'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_file_mode = 0600
log_truncate_on_rotation = off
log_rotation_age = 1d
log_rotation_size = 0
client_min_messages = warning
log_min_duration_statement = 300ms
log_line_prefix = '[%t] %d %r [%p]: [%l-1] %e'
log_lock_waits = on
log_statement = 'mod'
pg_basebackupができるよう、アーカイブモードにしています
また、ログの出力先を明示的に指定。日単位でローテートさせます。
デフォルトでは下記に出力されChef-Serverで管理されていますが
/var/log/chef-server/curent
 ログファイルを指定した場合、Chef-Serverからは見れなくなります
# chef-server-ctl postgresql tail
バキューム設定
デフォルトのまま、オートバキュームですが、今後ノードやWarkStationが増える事も考え
cronでバキュームを定期実行するようにします
# vi /var/opt/chef-server/postgresql/data/postgresql.conf
autovacuum = off
Chef-ServerはOpscodeのパッケージを使用しているので
当然というか、PostgreSQLは海外用にコンパイルされています
日本環境に設定
# vi /var/opt/chef-server/postgresql/data/postgresql.conf
log_timezone = 'Japan'
timezone = 'Japan'
設定の反映
# chef-server-ctl restart postgresql
# chef-server-ctl status postgresql

接続権限の設定


バックアップや、バキューム処理を行えるよう、ユーザー権限を追加する。

データベースや、ユーザー情報の確認
# su - opscode-pgsql
$ psql -U opscode_chef
# \l
                                        List of databases
     Name     |     Owner     | Encoding  | Collate | Ctype |          Access privileges          
--------------+---------------+-----------+---------+-------+-------------------------------------
 opscode_chef | opscode-pgsql | UTF8      | C       | C     |            
              |               |           |         |       |
              |               |           |         |       |
              |               |           |         |       |
 postgres     | opscode-pgsql | SQL_ASCII | C       | C     |
 template0    | opscode-pgsql | SQL_ASCII | C       | C     |
              |               |           |         |       |
 template1    | opscode-pgsql | SQL_ASCII | C       | C     |
              |               |           |         |       |
(4 rows)
=# select * from pg_shadow;
     usename     | usesysid | usecreatedb | usesuper | usecatupd | userepl |               passwd                | valuntil | useconfig 
-----------------+----------+-------------+----------+-----------+---------+-------------------------------------+----------+-----------
 opscode-pgsql   |       10 | t           | t        | t         | t       |                                     |          | 
 opscode_chef    |    16549 | f           | t        | t         | f       |                    |          | 
 opscode_chef_ro |    16550 | f           | t        | t         | f       |                                     |          | 
(3 rows)
マスターユーザーopscode-pgsqlがいるので、そのユーザーを運用で利用する。 baseバックアップ用にrepricationスキーマにアクセス権限を追加
# pg_hba.conf
local   replication 192.168.1.0/24                           trust
他のユーザー権限もALLで許可になっているので、アクセス許可IPや、アクセス可能DBを制限する。 設定の反映
# chef-server-ctl restart postgresql
# chef-server-ctl status postgresql

Nginxのカスタマイズ

ログローテート設定


アクセスログ自体は不要かもしれませんが、ローテートするよう設定
ログローテートにはcronologを利用します。
# wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
Nginxの起動スクリプトにcronologと連携する設定を追加
# vi /opt/chef-server/service/nginx/run
### cronolog set
LOG_BIN="/usr/local/sbin/cronolog"
LOG_DIR="/var/log/chef-server/nginx"
PIP_DIR="$LOG_DIR"
ACCESS_PIPE_FILE="$LOG_DIR/access.pipe"
ERROR_PIPE_FILE="$LOG_DIR/error.pipe"
SSL_ACCESS_PIPE_FILE="$LOG_DIR/ssl_access.pipe"
SSL_ERROR_PIPE_FILE="$LOG_DIR/ssl_error.pipe"

if [ ! -p $ACCESS_PIPE_FILE ]; then
   mkfifo $ACCESS_PIPE_FILE
else
   rm -f $ACCESS_PIPE_FILE
   mkfifo $ACCESS_PIPE_FILE
fi
/bin/bash -c "cat $ACCESS_PIPE_FILE | $LOG_BIN $LOG_DIR/%Y%m/chef-server_access.%Y%m%d.log &"

if [ ! -p $SSL_ACCESS_PIPE_FILE ]; then
   mkfifo $SSL_ACCESS_PIPE_FILE
else
   rm -f $SSL_ACCESS_PIPE_FILE
   mkfifo $SSL_ACCESS_PIPE_FILE
fi
/bin/bash -c "cat $SSL_ACCESS_PIPE_FILE | $LOG_BIN $LOG_DIR/%Y%m/chef-server_ssl_access.%Y%m%d.log &"

if [ ! -p $ERROR_PIPE_FILE ]; then
   mkfifo $ERROR_PIPE_FILE
else
   rm -f $ERROR_PIPE_FILE
   mkfifo $ERROR_PIPE_FILE
fi
/bin/bash -c "cat $ERROR_PIPE_FILE  | $LOG_BIN $LOG_DIR/%Y%m/chef-server_error.%Y%m%d.log &"

if [ ! -p $SSL_ERROR_PIPE_FILE ]; then
   mkfifo $SSL_ERROR_PIPE_FILE
else
   rm -f $SSL_ERROR_PIPE_FILE
   mkfifo $SSL_ERROR_PIPE_FILE
fi
/bin/bash -c "cat $SSL_ERROR_PIPE_FILE  | $LOG_BIN $LOG_DIR/%Y%m/chef-server_ssl_error.%Y%m%d.log &"
Nginxコンフィグファイルのログ出力先をFIFOファイルに変更
リライトログは不要なのでコメントアウトします
# vi /var/opt/chef-server/nginx/etc/nginx.conf
#error_log /var/log/chef-server/nginx/error.log;
error_log /var/log/chef-server/nginx/error.pipe;
~省略
    #access_log /var/log/chef-server/nginx/rewrite-port-80.log;
# vi /var/opt/chef-server/nginx/etc/chef_http_lb.conf
  #access_log /var/log/chef-server/nginx/access.log opscode;
  access_log /var/log/chef-server/nginx/access.pipe opscode;
# vi /var/opt/chef-server/nginx/etc/chef_https_lb.conf
  #access_log /var/log/chef-server/nginx/access.log opscode;
  access_log /var/log/chef-server/nginx/ssl_access.pipe opscode;
設定の反映
# /opt/chef-server/bin/chef-server-ctl restart nginx
指定のログディレクトリにFIFOファイルが作成され
アクセスした際にログがきちんと作成されていることを確認。

Nginx自体は、Proxyしているだけのようなので、Apacheに移行すること自体は可能そうですね。

WarkStation環境のセットアップ

少し長いですが、Server環境の準備ができたので
レシピやランリストを作成する作業環境を準備します。
WarkStationはServer上に作成しました。

Chefのインストール


Chefをインストールします
Chef-Server上で作業を行う場合、必要なツールはServerと一緒に入りますが
別環境に建てる場合と同じよう、インストールしました。

Opscodeのサイトからダウンロード
インストールコマンドがあるので、それを実行
# curl -L https://www.opscode.com/chef/install.sh | bash
   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                  Dload  Upload   Total   Spent    Left  Speed
 100 14101  100 14101    0     0   9929      0  0:00:01  0:00:01 --:--:-- 12103
 Downloading Chef  for el...
 downloading https://www.opscode.com/chef/metadata?v=&prerelease=false&p=el&pv=6&m=x86_64
   to file /tmp/install.sh.5024/metadata.txt
 trying wget...
 url     https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-11.8.2-1.el6.x86_64.rpm
 md5     10f3d0da82efa973fe91cc24a6a74549
 sha256  044558f38d25bbf75dbd5790ccce892a38e5e9f2a091ed55367ab914fbd1cfed
 downloaded metadata file looks valid...
 downloading https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-11.8.2-1.el6.x86_64.rpm
   to file /tmp/install.sh.5024/chef-.x86_64.rpm
 trying wget...
 Checksum compare with sha256sum succeeded.
 Installing Chef
 installing with rpm... 
 警告: /tmp/install.sh.5024/chef-.x86_64.rpm: ヘッダ V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
 準備中...                ########################################### [100%]
    1:chef                   ########################################### [100%]
 Thank you for installing Chef!

WarkStation環境の設定


Chef-Serverと通信し、レシピを管理するユーザーを作成し
レシピを管理するディレクトリを作成します。
# useradd chef
# mkdir /data/chef
# mkdir /data/chef/.chef
WarkStationユーザー(chef)のホームディレクトリは「/data/chef」です
WarkStationユーザーのホームディレクトリ配下に、Serverとの通信用鍵を配置
# cp -a /etc/chef-server/admin.pem /data/chef/.chef/
# cp -a /etc/chef-server/chef-validator.pem /data/chef/.chef/
# chown chef: /data/chef -R
ディレクトリにクックブックリポジトリを環境を作成しましょう
githubにOpscodeのテンプレートがあるので、それを利用します。
# su - chef
 $ git clone https://github.com/opscode/chef-repo.git
 Initialized empty Git repository in /data/chef/chef-repo/.git/
 remote: Reusing existing pack: 223, done.
 remote: Total 223 (delta 0), reused 0 (delta 0)
 Receiving objects: 100% (223/223), 46.09 KiB, done.
 Resolving deltas: 100% (56/56), done.
WarkSttionの作業環境ができたら、ServerにWarkStationを登録します。
 # su - chef
 $ knife configure --initial
 WARNING: No knife configuration file found
 Where should I put the config file? [/data/chef/.chef/knife.rb]
 Please enter the chef server URL: [https://devsrv01:443] https://192.168.10.1  ←-- Chef-ServerのURLを入力
 Please enter a name for the new user: [root] chef ←-- Chef-Serverへの接続ユーザー名を入力
 Please enter the existing admin name: [admin]
 Please enter the location of the existing admin's private key: [/etc/chef-server/admin.pem] /data/chef/.chef/admin.pem  ←-- 認証鍵のパスを指定
 Please enter the validation clientname: [chef-validator]
 Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem] /data/chef/.chef/chef-validator.pem ←-- 認証鍵のパスを指定
 Please enter the path to a chef repository (or leave blank): /data/chef/chef-repo ←-- クックブックレポジトリの指定
 Creating initial API user...
 Please enter a password for the new user:  ←-- Chef-Serverへの接続ユーザーパスワードを入力
 Created user[chef]
 Configuration file written to /data/chef/.chef/knife.rb
以上でWarkStation環境のセットアップは完了です。

問題なく接続できる事を確認
$ knife client list
 chef-validator
 chef-webui
疎通確認後、admin.pemは削除したほうがよいかもしれませんね。

Chef-Clientのセットアップ

作成したレシピをサーバに適用するために、クライアントを利用することで適用させる事ができます。
クライアントはデーモンモードで定期的にレシピを実行したり
「Ohai」という機能でサーバステータスをChef-Serverに送信したりします。

Chef-Clientのインストール


WarkStation同様、Chefをインストールします。
# curl -L https://www.opscode.com/chef/install.sh | bash

Chef-Client環境の設定


Chef-Serverとの接続ファイルを作成します
# mkdir /etc/chef
# vi /etc/chef/client.rb
 logg_level      :info
 log_location    STDOUT
 chef_server_url 'https://192.168.1.10'
 node_name       'client01'
Chef-Serverとの接続用に鍵ファイルをサーバーからコピー
# scp xxxxxx@192.169.1.10:/etc/chef-server/chef-validator.pem /etc/chef 
鍵ファイルをリネーム
# mv chef-validator.pem validation.pem
あとはChef-Serverにクライアントとして登録すれば完了です。
Chef-Serverではクライアントと、ノードと別の情報で管理しているのですが
ノード=クライアントと同じような考えです。

Chef-Serverから見たとき、クライアントは接続情報を管理するもので
ノードはランリストと、クライアントを日もづけるものです。

ノードは事前に作成することも可能ですが
初期接続時に接続ファイルに書かれたノードでノードも自動的に作成されます。

では接続。
# chef-client
 Starting Chef Client, version 11.8.2
 Creating a new client identity for devsrv02 using the validator key.
 resolving cookbooks for run list: []
 Synchronizing Cookbooks:
 Compiling Cookbooks...
 [2014-01-07T19:11:59+09:00] WARN: Node devsrv02 has an empty run list.
 Converging 0 resources
 Chef Client finished, 0 resources updated
事前にノードを作成し、レシピを登録していた場合、ここで実行されます。

初回接続後、vaildation.pemは削除しましょう。


以上で初期構成は完了です。
必要により、クライアントやWarkStationを登録しましょう
また、Chef-Clientにはデーモンでの利用もあるのですが(オプションでデーモンにできます)
まだ怖いので利用したことがないです。

さて、環境が整ったので、レシピの作成からServerへの連携を次でやってみますか

Chef: The Definitive Guide
Chef: The Definitive Guide
posted with amazlet at 14.02.22
Stephen Nelson-smith
Oreilly & Associates Inc
売り上げランキング: 138,126

0 コメント:

コメントを投稿