Chef 12対応版 Chef ClientのbootstrapインストールとCookbookの実行～CentOS 7編～

この記事は、[「クラウド時代のシステム管理」の記事](http://www.takanyan.net/chef12-client-cent7/)を転記したものです。

以前の記事でChef ServerとChef Workstationを同一サーバー上に構築しました。（<a href="http://www.takanyan.net/chef12-server-install/" target="_blank">Chef Server編</a>、<a href="http://www.takanyan.net/chef12-workstation-cent7/" target="_blank">Chef Workstation編</a>）今回は、Chefを使ってサーバーの構成管理を行う対象サーバーへのChef Clientの導入を行います。

<more>

## 1. Clientとなるサーバーのbootstrap用ユーザー作成とSSH設定

まずは管理対象となるClient側サーバーを用意します。SSHでリモートから操作できるように設定をしていきます。以後、Clientとなるサーバーのプロンプトは<code>[(ユーザー名)@chef-client ]$</code>、Workstation側のプロンプトは<code>[(ユーザー名)@chefserver ]$</code>とします。

### 1-1. bootstrap用ユーザー作成

Chef ClientのインストールはChef WorkstationからSSH経由で行うので、SSH接続用ユーザーを作成し、sudo権限を付与します。

```Shell
[root@chef-client ~]# useradd chef-client
[root@chef-client ~]# passwd chef-client
(省略)
[root@chef-client ~]# visudo
(以下の行を追記して保存)
Defaults:chef-client    !requiretty
chef-client     ALL=(ALL)        ALL
```

### 1-2. SSH接続設定

作成したchef-clientユーザーで鍵認証によるログインができるように設定します。まずはWorkstation側のchef-adminユーザーでSSH鍵を生成します。

```Shell
[chef-admin@chefserver ~]$ ssh-keygen -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/chef-admin/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
(鍵が生成される)
[chef-admin@chefserver ~]$ chmod -R go-rwx .ssh
(自分以外のアクセス権を削除)
```

生成した公開鍵(<code>~/.ssh/id_rsa.pub</code>)をClient側の<code>~/.ssh/authorized_keys</code>に追記します。

```Shell
[chef-client@chef-client ~]$ mkdir -p .ssh
[chef-client@chef-client ~]$ vi .ssh/authorized_keys
(生成した公開鍵を追記)
[chef-client@chef-client ~]$ chmod -R go-rwx .ssh
(自分以外のアクセス権を削除)
```

ここまで設定したら、WorkstationからSSHログインできることを確認します。そして、<code>sudo</code>できることも確認します。

```Shell
[chef-admin@chefserver ~]$ ssh chef-client@chef-client
The authenticity of host 'chef-client (192.168.0.112)' can't be established.
ECDSA key fingerprint is 2a:ff:04:a7:9d:de:bd:da:3d:bb:82:be:58:22:a7:f4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'chef-client,192.168.0.112' (ECDSA) to the list of known hosts.
Last login: Mon Jul 18 09:17:14 2016 from chefserver
[chef-client@chef-client ~]$
[chef-client@chef-client ~]$ sudo -i
[sudo] password for chef-client:
[root@chef-client ~]#
```

これでSSHログインするための設定が完了しました。

## 2. Chef WorkstationでのCookbookダウンロードとChef Serverへのアップロード

今回は、最初のCookbookとして「chef-client」という名前のCookbookを導入する場合を例にします。「chef-client」cookbookはChefの公式レポジトリに含まれるCookbookで、Chef Clientのインストールなどの設定を行います。

### 2-1. chef-client Cookbookのインストール

Cookbookを公式レポジトリからダウンロード・展開するためには<code>knife cookbook site install (Cookbook名)</code>を実行します。ただし、事前に<code>~/chef-repo/cookbook</code>以下をGit管理下に置く必要があります。Git管理下にない場合、以下のエラーが出ます。

```Shell
[chef-admin@chefserver chef-repo]$ knife cookbook site install chef-client
Installing chef-client to /home/chef-admin/chef-repo/cookbooks
ERROR: The default branch 'master' does not exist
If this is a new git repo, make sure you have at least one commit before installing cookbooks
```

Git管理下に置くため、Gitのユーザー名・メールアドレスの初期設定もまだの場合は、ここで設定しておきます。

```Shell
[chef-admin@chefserver ~]$ cd ~/chef-repo 
[chef-admin@chefserver chef-repo]$ git config --global user.email "test@test.com"
[chef-admin@chefserver chef-repo]$ git config --global user.name "Chef Admin"
[chef-admin@chefserver chef-repo]$ git add *
[chef-admin@chefserver chef-repo]$ git commit -m "First Commit"
[master (root-commit) ae2bce2] First Commit
(以下略)
```

Gitの設定が完了したら、Cookbookのインストールを行います。

```Shell
[chef-admin@chefserver chef-repo]$ knife cookbook site install chef-client
Installing chef-client to /home/chef-admin/chef-repo/cookbooks
Checking out the master branch.
(以下略)
```

### 2-2. Chef ServerへのCookbookのアップロード

ダウンロード・インストールしたCookbookはWorkstationにあるだけで、そのままではChef Server経由で配信されません。ClientでCookbookを実行させる前に、Chef ServerにCookbookをアップロードする必要があります。今回は編集などは行わず、先ほどインストールしたCookbookをすべてそのままChef Serverへアップロードします。

```Shell
[chef-admin@chefserver chef-repo]$ knife cookbook upload -a
Uploading chef-client  [4.6.0]
Uploading chef-repo    [0.1.0]
Uploading chef_handler [1.4.0]
Uploading cron         [1.7.6]
Uploading logrotate    [1.9.2]
Uploading starter      [1.0.0]
Uploading windows      [1.44.1]
Uploaded all cookbooks.
```

Uploadされたことは、ChefのWeb管理画面からも確認できます。Web管理画面にログイン後、「Policy」タブをクリックするとアップロード済みのCookbookの一覧を見ることができます。

<a href="http://www.takanyan.net/wp-content/uploads/2016/07/cookbook.png"><img src="http://www.takanyan.net/wp-content/uploads/2016/07/cookbook.png" alt="cookbook" width="1154" height="722" class="aligncenter size-full wp-image-169" /></a>

chef-client cookbookには依存関係があるため、それらのCookbookも一緒にアップロードされています。

## 3. knife bootstrapによるChef Clientの導入

### 3-1. CentOS用のbootstrap scriptの作成

Chefのコマンドラインツール「<code>knife bootstrap</code>」を使ってChef Clientのインストールと初期設定を行いますが、管理対象OSによってパッケージ導入の方法が異なります。そこで、Chef Clientをインストールする手順を記述したbootstrapスクリプトを作成します。ここでは<a href="https://github.com/anikundesu/knife-bootstrap-erb" target="_blank">私のGithubのknife-bootstrap-erbレポジトリ</a>に置いてあるCentOS用のスクリプトを利用します。

<a href="http://www.takanyan.net/wp-content/uploads/2016/07/bootstrap-erb-download.png"><img src="http://www.takanyan.net/wp-content/uploads/2016/07/bootstrap-erb-download.png" alt="bootstrap-erb-download" width="1062" height="733" class="aligncenter size-full wp-image-172" /></a>


まず、Githubのknife-bootstrap-erbレポジトリからレポジトリ内のファイルをダウンロードして展開します。

```Shell
[chef-admin@chefserver ~]$ wget "https://github.com/anikundesu/knife-bootstrap-erb/archive/master.zip"
(中略)
2016-07-18 13:47:42 (60.7 MB/s) - `master.zip' へ保存完了 [5756/5756]
[chef-admin@chefserver ~]$ unzip -q master.zip
[chef-admin@chefserver ~]$ ls
chef-repo  knife-bootstrap-erb-master  master.zip
```

展開して作成された「knife-bootstrap-erb-master」ディレクトリ内にある「bootstrap」ディレクトリを<code>~/chef-repo/.chef/</code>」にコピーします。

```Shell
[chef-admin@chefserver ~]$ cp -r knife-bootstrap-erb-master/bootstrap ~/chef-repo/.chef/
```

### 3-2. knife bootstrapの実行

ここまでの手順で、Chef Clientのbootstrapインストールの準備が整いました。いよいよChef Clientの導入を行います。インストールに利用するコマンドは<code>knife bootstrap</code>です。コマンドに与える主な引数は以下の通りです。

```Shell
[chef-admin@chefserver chef-repo]$ knife bootstrap (Chef ClientホストのFQDN) \
-t TEMPLATE              (TEMPLATEにOSタイプに合わせたbootstrap script名を記載）\
-r, --run-list RUN_LIST  (RUN_LISTにカンマ区切りのRecipeやRoleのリストを記載) \
-i IDENTITY_FILE         (SSH秘密鍵ファイルを指定) \
-x USERNAME              (SSH接続するユーザー名を指定) \
--sudo                   (sudoコマンドを使うか指定)
```

今回実行するレシピは「chef-client::delete_validation」にします。このレシピはChef ClientとChef Serverが接続した後にClient側に保存されたOrganization認証秘密鍵を削除します。このファイルは以後利用することがないため、セキュリティ上削除することが推奨されています。

```Shell
[chef-admin@chefserver chef-repo]$ knife bootstrap chef-client.takanyan.local -t centos -i ~/.ssh/id_rsa -x chef-client --sudo -r 'recipe[chef-client::delete_validation]'
Doing old-style registration with the validation key at /home/chef-admin/chef-repo/.chef/takanyan-validator.pem...
Delete your validation key in order to use your user credentials instead

Connecting to chef-client.takanyan.local
chef-client.takanyan.local knife sudo password:【sudoパスワードを入力】
Enter your password:
chef-client.takanyan.local
chef-client.takanyan.local   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
chef-client.takanyan.local                                  Dload  Upload   Total   Spent    Left  Speed
100 19824  100 19824    0     0   3214      0  0:00:06  0:00:06 --:--:--  5422
chef-client.takanyan.local el 7 x86_64
chef-client.takanyan.local Getting information for chef stable  for el...
chef-client.takanyan.local downloading https://omnitruck.chef.io/stable/chef/metadata?v=&p=el&pv=7&m=x86_64
chef-client.takanyan.local   to file /tmp/install.sh.2750/metadata.txt
chef-client.takanyan.local trying curl...
chef-client.takanyan.local sha1 92d14fa522ff14b1e22622312c8271db3cc0d512
chef-client.takanyan.local sha256       ce1f216242f26d7274c108a9cb9d8add7095727e039bac968de9291f56a90c25
chef-client.takanyan.local url  https://packages.chef.io/stable/el/7/chef-12.12.15-1.el7.x86_64.rpm
chef-client.takanyan.local version      12.12.15
chef-client.takanyan.local downloaded metadata file looks valid...
chef-client.takanyan.local downloading https://packages.chef.io/stable/el/7/chef-12.12.15-1.el7.x86_64.rpm
chef-client.takanyan.local   to file /tmp/install.sh.2750/chef-12.12.15-1.el7.x86_64.rpm
chef-client.takanyan.local trying curl...
chef-client.takanyan.local Comparing checksum with sha256sum...
chef-client.takanyan.local
chef-client.takanyan.local WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
chef-client.takanyan.local
chef-client.takanyan.local You are installing an omnibus package without a version pin.  If you are installing
chef-client.takanyan.local on production servers via an automated process this is DANGEROUS and you will
chef-client.takanyan.local be upgraded without warning on new releases, even to new major releases.
chef-client.takanyan.local Letting the version float is only appropriate in desktop, test, development or
chef-client.takanyan.local CI/CD environments.
chef-client.takanyan.local
chef-client.takanyan.local WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
chef-client.takanyan.local
chef-client.takanyan.local Installing chef
chef-client.takanyan.local installing with rpm...
chef-client.takanyan.local 警告: /tmp/install.sh.2750/chef-12.12.15-1.el7.x86_64.rpm: ヘッダー V4 DSA/SHA1 Signature、鍵 ID 83ef826a: NOKEY
chef-client.takanyan.local 準備しています...              ################################# [100%]
chef-client.takanyan.local 更新中 / インストール中...
chef-client.takanyan.local    1:chef-12.12.15-1.el7              ################################# [100%]
chef-client.takanyan.local Thank you for installing Chef!
chef-client.takanyan.local Starting Chef Client, version 12.12.15
chef-client.takanyan.local Creating a new client identity for chef-client using the validator key.
chef-client.takanyan.local resolving cookbooks for run list: ["chef-client::delete_validation"]
chef-client.takanyan.local Synchronizing Cookbooks:
chef-client.takanyan.local   - chef-client (4.6.0)
chef-client.takanyan.local   - cron (1.7.6)
chef-client.takanyan.local   - logrotate (1.9.2)
chef-client.takanyan.local   - windows (1.44.1)
chef-client.takanyan.local   - chef_handler (1.4.0)
chef-client.takanyan.local Installing Cookbook Gems:
chef-client.takanyan.local Compiling Cookbooks...
chef-client.takanyan.local Converging 1 resources
chef-client.takanyan.local Recipe: chef-client::delete_validation
chef-client.takanyan.local   * file[/etc/chef/validation.pem] action delete
chef-client.takanyan.local     - delete file /etc/chef/validation.pem
chef-client.takanyan.local
chef-client.takanyan.local Running handlers:
chef-client.takanyan.local Running handlers complete
chef-client.takanyan.local Chef Client finished, 1/1 resources updated in 09 seconds
[chef-admin@chefserver chef-repo]$
```

いくつかセキュリティ上良くない設定をしている旨の警告が出ていますが、以上でChef Clientがインストールされ、Chef Server管理下に置かれました。Chef Server管理下に置かれたことは、ChefのWeb管理画面からも確認できます。管理画面の「Nodes」を見ると、chef-clientというホストが追加されていることがわかります。

<a href="http://www.takanyan.net/wp-content/uploads/2016/07/Node.png"><img src="http://www.takanyan.net/wp-content/uploads/2016/07/Node.png" alt="Node" width="1125" height="936" class="aligncenter size-full wp-image-175" /></a>


以上で、Chef Clientの導入とChef Server管理下への追加が完了しました。