docker-compose で Puppetのデモ環境を構築する

構成管理ツールPuppetのデモ環境を、docker-composeで構築します。
動作確認などは、環境が簡単につくりなおせるDockerが便利です。

MacならDocker for Mac、WindowsならDocker for Windowsをインストールしておきます(OSが未対応な場合、Docker Toolbox)。

# 構築準備

## ファイル構成
フォルダ名はなんでもよいですが、とりあえずPuppetDemoという名前のフォルダに、下記のような構成で準備します。master/hieradara, master/manifests, master/modulesはコンテナに共有するフォルダーです。

```
PuppetDemo
|-- docker-compose.yml
|-- master
|   |-- Dockerfile
|   |-- hieradata
|   |-- manifests
|   `-- modules
`-- agent
    `-- Dockerfile

```

### docker-compose用の設定
docker-compose用の設定ファイルです。

```yaml:docker-compose.yml
version: '2'
services:
  master:
    build: ./master
    hostname: master
    volumes:
      - ./master/hieradata:/etc/puppetlabs/code/environments/production/hieradata
      - ./master/manifests:/etc/puppetlabs/code/environments/production/manifests
      - ./master/modules:/etc/puppetlabs/code/environments/production/modules
    command: /opt/puppetlabs/bin/puppetserver foreground
  agent:
    build: ./agent
    hostname: agent
    links:
      - master:master
    volumes:
      - ./master/hieradata:/etc/puppetlabs/code/environments/production/hieradata
      - ./master/manifests:/etc/puppetlabs/code/environments/production/manifests
      - ./master/modules:/etc/puppetlabs/code/environments/production/modules
    stdin_open: true
    tty: true
    command: /bin/bash

```

- masterがPuppetサーバ、agentがPuppetのクライアント側です。
- master, agent間でPuppetの問い合わせができるように、hostname, links等を設定してます。
- volumesでMac(Windows PC)上のファイルをmaster,agent側で共有させています。
- agent側に入ってコマンドを入力できるように、stdin_open, ttyを設定。

## Puppetサーバ用コンテナのDockerfile
Puppetサーバ用のコンテナのビルド設定です。

```text:master/Dockerfile
FROM centos:7
RUN rpm -Uvh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm
RUN yum install -y puppet-agent
RUN groupadd puppet
RUN useradd -g puppet puppet
RUN yum install -y puppetserver
RUN sed -i -e "s/#max-active-instances: 1/max-active-instances: 1/g" /etc/puppetlabs/puppetserver/conf.d/puppetserver.conf
RUN sed -i -e "s/JAVA_ARGS=\"-Xms2g -Xmx2g -XX:MaxPermSize=256m\"/JAVA_ARGS=\"-Xms512m -Xmx512m -XX:MaxPermSize=256m\"/g" /etc/sysconfig/puppetserver
RUN echo "*" > /etc/puppetlabs/puppet/autosign.conf
CMD /opt/puppetlabs/bin/puppetserver foreground

```

- puppet-agent, puppetserverインストール
- puppetユーザ作成
- デフォルトだとメモリが足らずに起動しないため、max-active-instancesとJAVA_ARGSを変更
- どのクライアントからのリクエストでも許可するようautosign.confを変更

## PuppetクライアントコンテナのDockerfile
Puppetクライアント用のコンテナのビルド設定です。

```text:agent/Dockerfile
FROM centos:7
RUN rpm -Uvh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm
RUN yum install -y puppet-agent
RUN echo "[main]" >> /etc/puppetlabs/puppet/puppet.conf
RUN echo "server = master" >> /etc/puppetlabs/puppet/puppet.conf
CMD /opt/puppetlabs/bin/puppet agent -t

```

- puppet-agent, puppetserverインストール
- puppet agent実行時に、masterに問い合わせる用puppet.confに設定

# 使い方

ターミナル（コマンドプロンプト）を開いて、PuppetDemoフォルダに移動した状態からで。

## docker-composeのコマンド

docker-composeのコマンドの紹介です。

### ビルド

```
docker-compose build
```

### 起動

```
docker-compose up
```

バックグラウンドで起動したい場合

```
docker-compose up -d
```

### 状態確認

(dオプションなしで起動した場合、別ターミナルを開いてPuppetDemoフォルダに移動した状態で)

```
docker-compose ps
```

実行例、StateがUpであれば起動中。あと、Nameはコンテナ名で、別のコマンドで使ったりします。

```
       Name                      Command               State   Ports 
--------------------------------------------------------------------
puppetdemo_agent_1    /bin/bash                        Up            
puppetdemo_master_1   /opt/puppetlabs/bin/puppet ...   Up
```

### 停止

```
Ctrl + c
```

バックグラウンドで起動した場合

```
docker-compose stop
```

### コンテナ削除

きれいなコンテナで作り直したい場合、一度削除してから起動しなおしてください。

```
docker-compose rm
```

### コンテナの最新化

新しいcentosイメージ、puppetが出たときに、コンテナを最新化したい場合build時にオプションをつけます

```
docker-compose build --no-cache --pull
```

## puppetを試す

ここからは、構築したデモ環境を起動した状態で。

### クライアント側に入る

(dオプションなしで起動した場合、別ターミナルを開いてPuppetDemoフォルダに移動した状態で)

```
docker attach puppetdemo_agent_1
```

puppetdemo_agent_1の名前が違う場合は、docker-compose psで名前を確認。ちなみにmasterにattachすると出れなくなるので注意です(bashを動かしていないため、master側ではコマンドをたたけないです)。

### クライアント側から出る

```
Ctrl + p
の後に、
Ctrl + q
```

※間違えてexitコマンドでぬけると、クライアント側のコンテナが止まるので、その場合はdocker-compose upをすれば起動します。

### クライアント側でpuppet apply

クライアント側に入った状態で、puppetをローカル実行する場合

```
puppet apply マニフェストのパス -t 
```

例：

```
puppet apply /etc/puppetlabs/code/environments/production/manifests/site.pp -t 
```

### クライアント側でpuppet agent

クライアント側に入った状態で、puppetをmaster側に問い合わせて実行する場合

```
puppet agent -t 
```

### Puppetのマニフェスト編集

master/hieradara, master/manifests, master/modulesを、Mac(PC)とagentとmasterで共有しているので、Mac(PC)側のエディタ等で編集してください。

Mac(PC)のパス(共有元)

```
./master/hieradata
./master/manifests
./master/modules
```

agent, masterのパス(共有先)

```
/etc/puppetlabs/code/environments/production/hieradata
/etc/puppetlabs/code/environments/production/manifests
/etc/puppetlabs/code/environments/production/modules
```

### puppet forge

puppet forgeで公開されているモジュールをダウンロードする場合は、クライアント側のpuppetdemo_agent_1に入った状態で。

```
puppet module install モジュール名
```

例：

```
puppet module install puppetlabs-apache --version 1.11.0
```

共有しているので、これでmasterコンテナと、Mac(PC)にもダウンロードされます。

# クライアント側のコンテナの注意点

dockerコンテナは、VMと違う部分があるため、どこかのPuppetマニフェストをそのまま実行しても動かない場合があります。