PuppetでApacheを管理してみる part2

前回に引き続き、Apacheの構成管理をやって見たいと思います。

前回:PuppetでApacheを管理してみる part1 - ressyのナレッジ的なブログ

Apacheモジュールのマニフェストを書く

Apacheモジュール用のマニフェストを書いていきます。
具体的には以下のファイルを作成します。

/etc/puppet/modules/http/manifests/init.pp

moduleのマニフェストを作成する際には、以下のルールを守る必要があります。
他にもルールはあるのですが、まずは、以下を抑えておけば最低限書くことはできると思います。

  • init.ppを必ず用意する
  • module名と同じclassを用意する必要がある
    • 今回でいうと、httpというclassを作成する必要があります

骨組み

出来上がり品を見せる前に、今回作成するhttpクラスの骨組みを示します。
おおよそ、このような骨組みにします。

# cat /etc/puppet/modules/http/manifests/init.pp
class http (
    変数:運用する/しない
) {
    case 変数 {
       運用する: {
            - パッケージをインストールする
            - ファイルは、httpd.confのテンプレートを使用する
            - サービスは有効にする
        }

        運用しない: {
            - パッケージをインストールする
            - サービスは無効にする
        }
    }
}
# cat /etc/puppet/manifests/site.pp
node 'WEB01' {
    class { 'http':
        変数:運用する,
   }
}

node default {
    class { 'http':
        変数:運用しない,
   }

前回の記事の通り、今回は勉強環境のWEB01というサーバのみhttpを運用し、他のサーバでは運用しない構成とします。
今回は、クラスの変数として運用する/しないを用意し、その値に応じて処理を変えるようにしました。
あとは、/etc/puppet/manifests/site.ppにてクラスを呼び出し、サーバWEB01なら運用する、他のサーバなら運用しない。というふうにします。
サーバ単位でリソースをまとめる場合は、上記のようにnode定義を使用すればOKです。

実際のところ、この骨組みがスマートかどうかはわかりませんが、今回の勉強環境で実現するには十分だと思うので、これで進めていきます。

実際に書いて見た

上記の骨組みを、実際に記述して見ます。
細かい説明は省略しますが、おおよそ内容はつかめるのではないかと思います。

# cat /etc/puppet/modules/http/manifests/init.pp
class http(
    $enabled = 'false',    # 変数:運用する/しない
    $port = '80'           # 変数:ポート番号(templatesで使用する予定)
) {
    case $enabled {
        # Apacheを運用する場合
        'true': {

            # パッケージをインストールする
            package { 'httpd':
                ensure => present,
            }

            # ファイルは、httpd.confのテンプレートを使用する
            file { '/etc/httpd/conf/httpd.conf':
              ensure  => present,
              content => template('/etc/puppet/modules/http/templates/httpd.conf'),
              require => Package['httpd'],
            }

            # サービスは有効にする
            service { 'httpd':
              ensure  => running,
              enable  => true,
              subscribe => File['/etc/httpd/conf/httpd.conf'],
            }
        }

        # Apacheを運用しない場合
        'false': {

            # パッケージをインストールする
            package { 'httpd':
                ensure => present,
            }

            # サービスは無効にする
            service { 'httpd':
              ensure  => stopped,
              enable  => false,
            }
        }
    }
}
# cat /etc/puppet/manifests/site.pp
node 'WEB01' {
    # WEB01ではApacheは運用する
    class { 'http':
        enabled => 'true',
        port => '80'
   }
}

node default {
    # 他のサーバではApacheは運用しない
    class { 'http':
        enabled => 'false',
   }
}

補足として2点ほど

補足1

骨組みの説明には出ていきていない変数portを用意しています。
この変数を使用して、templatesに格納したhttpd.confにてポート番号を指定できるようにしています。

補足2

上記マニフェストを書いただけでは、Agentサーバへのマニフェストの適用はできません。
理由は、templateのhttpd.confを用意していないためです。
puppet agent -t --verbose --noopを任意のAgentサーバで実行してみると、適用に失敗するかと思います。

細く2点を踏まえて、詳しいことは次回以降取り上げます。

参考

この記事は、以下を参考にしています。

私とPuppet 基本編 その1 (Resource,Ordering,Class,Define,Node) - Qiita


PuppetでApacheを管理してみる part1

久々にpuppetの話題に戻りたいと思います。
数回に分けて、Apacheの構成管理をやって見たいと思います。
今日の記事は、構成管理の方針だけを取り上げます。

どうやって管理するか

自分の勉強環境で、Apacheの構成管理をやります。
勉強環境の構成はこちらの記事を参照してください。
こんなシステム構成で色々勉強していく - ressyのナレッジ的なブログ

今回は、この方針でApacheを構成管理します。

  • WEB01でApacheを運用
  • DBS01とMGS01では運用しない
  • WEB01で使うコンフィグ(httpd.confなど)はMasterサーバ(=MGS01)で管理
  • puppetのmodule機能を使用する

module機能

Puppetでは、マニフェストファイルを分割して管理するためにmodule機能を持っています。
構成管理の対象が増えると、/etc/puppet/manifests/site.ppだけで全て記載すると、マニフェストの改修がやりにくくなります。
こういった時に、module機能を使用して例えば機能単位(Apache用のmodule、mysql用のmoduleなど)でファイルを分割すれば、マニフェストの管理・改修がやりやすくなるわけです。

続いて、module機能を具体的にどうやって使用するかです。
moduleを格納するディレクトリは以下のコマンドで確認できます。

# puppet config print | grep basemodulepath
basemodulepath = /etc/puppet/modules:/usr/share/puppet/modules

上記の場合、/etc/puppet/modules/usr/share/puppet/modulesが該当します。
今回は、/etc/puppet/modulesに、Apacheのモジュールを作成します。
ディレクトリ名はhttpとします。

# mkdir /etc/puppet/modules/http

さらに以下のディレクトリを作成します。

# mkdir /etc/puppet/modules/http/manifests
# mkdir /etc/puppet/modules/http/templates
# mkdir /etc/puppet/modules/http/files
# mkdir /etc/puppet/modules/http/lib
# mkdir /etc/puppet/modules/http/tests
# mkdir /etc/puppet/modules/http/spec

ディレクトリは以下を格納します。

  • manifests:モジュールのマニフェストを格納
  • templates:moduleで必要なconfigファイルなどを格納
    • Apacheの場合、httpd.confなどがそう
    • filesとは違い、動的ファイル(変数などでconfigの内容も管理したい場合)に使用する
  • files:moduleで必要なconfigファイルなどを格納
    • Apacheの場合、httpd.confなどがそう
    • templatesとは違い、静的ファイル(不変な場合)に使用する
  • lib:カスタムfactsやカスタムリソース型などのプラグインを格納
    • 例えば、filepackageなどのリソースタイプを拡張した独自のリソース型を定義できる
  • tests:moduleのマニフェストの使い方を書いたドキュメントなどを格納
  • spec:rspec-puppetで書かれたテストファイルを格納

moduleのディレクトリ構成は基本的に決まってます。
こちらを参考にすると良いでしょう。

Modules and Classes ~ モジュールとクラス — Documentation — Puppet

とりあえず使うかもって思ったディレクトリだけを作成しました(結局使わないかもディレクトリがあるかも)。

今回はここまで。
説明だけだと、moduleについてあまりイメージがわかないと思います。
次回以降、実際の設定を取り上げるのでそれを見ながら理解するのが良いかと思います。

参考

この記事は、以下を参考にしています。

Modules and Classes ~ モジュールとクラス — Documentation — Puppet

私とPuppet 基本編 その2 (Module,File,Templates,Variable) - Qiita


Vagrant upした時にAuthentication failureになった

最近Vagrantを立ち上げることが増えてきたので、その時にハマったメモを。
今までの記事のような解説スタイルではないのであしからず。

起きたこと

Vagrantfileにこんな感じで記載して

 ❯ cat Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos-6.4"
  config.vm.box_url = "http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box"
  config.vm.hostname = "ressy-host"

vagrant init(Vagrantfileを作成する)を実行する

 ❯ vagrant init
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

そんで仮想マシンを立ち上げようとしたら。。。

 ❯ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'centos-6.4' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
...
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...

default: Warning: Authentication failure. Retrying...が何度も表示されてvagrant upが完了しない。
という状態になりました。
※ 'vagrant ssh'で仮想マシンに入ることはできました。

sshまわりの設定を疑う

vagrant upが終了しないので、ctrl + Cで中断。

    default: Key inserted! Disconnecting and reconnecting using new SSH key...
    default: Warning: Authentication failure. Retrying...

この辺のメッセージでググると、仮想マシンssh周りの設定が影響していることが多いらしい。

例えばこの記事によると、「秘密鍵仮想マシン内の公開鍵がマッチしていない」ということが起きて、起動に失敗することがあるらしい。
詳細はリンク先の記事を参照。
vagrant up でAuthentication failure. Retrying... · NetCommons3/NetCommons3 Wiki · GitHub

なので、公開鍵の中身を確認してみる。

 ❯ vagrant ssh-config

Host default
...
  IdentityFile <秘密鍵へのパス>/private_key
...

秘密鍵の場所がわかったので、公開鍵を生成(表示だけ)してみる。

 ❯ ssh-keygen -yf <秘密鍵へのパス>/private_key
ssh-rsa AAAAB3Nz......

続いて、仮想マシン内の公開鍵を見ている。
vagrant upは正常終了していませんが、vagrant ssh仮想マシンに入ることはできるみたい。

 ❯ vagrant ssh
vagrant@127.0.0.1's password:
Welcome to your Vagrant-built virtual machine.
[vagrant@localhost ~]$

っで、authorized_keysを見てみる。

[vagrant@localhost ~]$ cat .ssh/authorized_keys
ssh-rsa AAAAB3Nz......

一緒だった。
秘密鍵と公開鍵は一致しているけど認証ができてないってことか。
.ssh/authorized_keysパーミッションが怪しいと踏んだので見てみる。

[vagrant@localhost ~]$ ls -l .ssh/authorized_keys
-rw-rw-r-- 1 vagrant vagrant 389 1112 04:30 2016 .ssh/authorized_keys

664になってた。
これが原因っぽいのでパーミッション600になおす。

[vagrant@localhost ~]$ chmod 600 .ssh/authorized_keys

Vagrantをあげ直してみる。

 ❯ vagrant halt
 ❯ vagrant up

今度はうまくいった。
色々気になるところはあったけど、とりあえず起動したのでよし。

最後に

今日は自分がVagrant周りをいじった時にうまくいかなかった部分の殴り書きメモを書かせていただきました。
そういえば、Vagrantについては解説の記事とかは書いていませんね(勉強中ですが)。
近々、Vagrantって何?みたいな記事を書こうと思います。


マラソンの話:15kmランニングしてきた

今日は息抜きで、技術関連の話からは脱線します。
というわけでマラソン関連の話を。

マラソンがらみの近況

マラソンのシーズン(個人的に9月 〜 4月がシーズンだと思ってる)に入り、マラソンの大会もたくさん開催される時期に差し掛かりました。
私もすでに4つ大会エントリーしています。

  • 11月:ハーフ1つ
  • 12月:フル1つ
  • 3月:フル1つ、ハーフ1つ

1月、2月、4月も何かしらエントリーしようかな?と思ってるところです。
ちょっと入れすぎかなぁ、と思いつつも今年は月に1回は大会 or 練習会に出たいなぁとか思ってます。

今日は15km走ってきました

大会へ向けて、本格的に練習に取り組んでいるこの頃。
今月に入ってからだいぶ涼しくなり、ようやく走りやすい気候になったなぁと思ってます。
おかげで練習量も増やしやすくなってきました。
今年の9月は暑くて、10km走るのもだいぶしんどかったですし。。。

今日は、15kmを1時間25分で走ってきました。
自分にとっては早いペースってわけではないですが、楽すぎず苦しすぎずのちょうどいい感じで走れました。

先ほど話した通り気候のおかげもありますが、先月30kmの練習会に出たこともあって、体が慣れてたこともあると思います。
この記事で話題にした内容です。
マラソンの話:30kmランニングしてきました - ressyのナレッジ的なブログ

練習会に参加してよかったなぁ。って思ってます。
この調子で練習量を増やしたいところ。


preztoにプラグインを追加する

今回は、こちらの続きでpreztoの周りをもう少しいじってみます。
具体的には、プラグインの追加をやっていきます。
preztoのプロンプトのテーマを変える part2 - ressyのナレッジ的なブログ

Gitプラグインを追加する

preztoにGitプラグインを追加すると、リポジトリのフォルダで作業している時に、リポジトリの状態を常に確認できるようになります。
以下は、knowledgeというリポジトリmy_branchというブランチを切っている場合の例です。

プラグイン追加前: f:id:ressy-tech:20161110224157p:plain

プラグイン追加後: f:id:ressy-tech:20161110222947p:plain

git branchなどと打たなくても、リポジトリの状態がわかるようになってます。

今回は、上記をやってみます。
と言っても、やることはすごく単純です。
.zpreztorcを開き、zstyle ':prezto:load' pmoduleという部分を編集すればOKです。

$ vi .zpreztorc
 26 zstyle ':prezto:load' pmodule \
 27   'environment' \
 28   'terminal' \
 29   'editor' \
 30   'history' \
 31   'directory' \
 32   'spectrum' \
 33   'utility' \
 34   'completion' \
 35   'git' \          # この行を追加する
 36   'prompt'

これだけです。
後は、zshを起動しなおして、適当なリポジトリへ移動しましょう。
上記"プラグイン追加後:"のように表示されるはずです。

git以外にも様々なプラグインがあるので、試してみると良いでしょう。
使用できるプラグインは、.prezto/modules/配下にあるので、上記と同じ要領で好みで追加しましょう。

$ ls  .zprezto/modules                                                                [22:54:40]
README.md                gpg                      rails
archive                  haskell                  rsync
autosuggestions          helper                   ruby
command-not-found        history                  screen
completion               history-substring-search spectrum
directory                homebrew                 ssh
dnf                      macports                 syntax-highlighting
dpkg                     node                     terminal
editor                   ocaml                    tmux
emacs                    osx                      utility
environment              pacman                   wakeonlan
fasd                     perl                     yum
git                      prompt
gnu-utility              python

preztoのリポジトリのREADME.mdも参考にすると良いでしょう。
https://github.com/sorin-ionescu/prezto/blob/master/modules/README.md

今回はここまで。

参考

本記事は、以下を参考にしています。

https://github.com/sorin-ionescu/prezto

AntigenでPreztoを導入 - Qiita


preztoのプロンプトのテーマを変える part2

今回は、こちらの続きでpreztoのテーマを変えてみます。

preztoのプロンプトのテーマを変える part1 - ressyのナレッジ的なブログ

テーマを変える

今回はparadoxというテーマに変更します。
paradoxがどんなテーマかはこちらを見ると良いでしょう。

Customizing Your Prezto Prompt

ホームディレクトリにある.zpreztorcというファイルを編集します。
95行目あたりのzstyle ':prezto:module:prompt' theme 'sorin'という行が編集する箇所になります。
デフォルトではsorinとうテーマになっているので、paradoxに変更します。

$ vi ~/.zpreztorc
    88 #
    89 # Prompt
    90 #
    91
    92 # Set the prompt theme to load.
    93 # Setting it to 'random' loads a random theme.
    94 # Auto set to 'off' on dumb terminals.
    95 #zstyle ':prezto:module:prompt' theme 'sorin'
    96 zstyle ':prezto:module:prompt' theme 'paradox'
    97

他のテーマを使いたい場合も、同じように編集すればOKです。
あとは、zshを再度開き直すと、テーマが変わることが確認できると思います。

Ricty for Powerlineを入れる

テーマをpowerlineまたはparadoxに変更する場合、iTerm2(自分が使ってるターミナルなのでそれ前提で話します。)にRicty for Powerlineというフォントのパッチを入れる必要があります。
これを入れないと、一部文字化けが発生します。
以下のようにしてインストールします。

$ brew tap sanemat/font
$ brew reinstall --powerline --vim-powerline ricty

上記コマンドは5分〜10分くらい時間がかかります。
続けて以下を実行します。

$ ls -l /usr/local/Cellar/ricty/
  →バージョンを確認する
$ cp -f /usr/local/Cellar/ricty/<バージョン>/share/fonts/Ricty*.ttf ~/Library/Fonts/

ちなみに私の環境はバージョン4.0.1です。

最後に、iTerm2のフォントを変更します。
メニューバーから[iTerm2]->[preferences]を開き、[profiles]->[text]->[Font]にて、Ricty for Powerlineを選択します。
これで、Ricty for Powerlineの追加は完了です。
Ricty for Powerlineはフォントが小さめ?なので、フォントサイズも好みで大きくした方がいいと思います。

テーマparadoxを使う分には、最低限これでOKかと思います。
っが、せっかくなのでもう少しだけ快適にしたいと思います。
例えば、自分はGitなどを使うこともあり、それ向けにpreztoにモジュールを追加しています。
詳しくは次回話したいと思います。

参考

この記事は以下を参考にしています。  

Zsh+Preztoを設定し、powerline対応のthemeを設定する - Tbpgr Blog

Customizing Your Prezto Prompt


preztoのプロンプトのテーマを変える part1

前回インストールした、preztoをカスタマイズしていきたいと思います。
とは言っても、今回はテーマについて解説するだけですが。

perztoのインストール:preztoをインストールしてみた - ressyのナレッジ的なブログ

テーマを確認する

preztoでは標準で幾つかのテーマ(プロンプトのデザイン)が用意されており、インストール後に作成される~/.zpreztorcで設定できます。
中身を見てみましょう。

$ cat -n ~/.zpreztorc
…
    88 #
    89 # Prompt
    90 #
    91
    92 # Set the prompt theme to load.
    93 # Setting it to 'random' loads a random theme.
    94 # Auto set to 'off' on dumb terminals.
    95 zstyle ':prezto:module:prompt' theme 'sorin'

zstyle ...と言う部分でテーマを指定しています。
デフォルトではsorinというテーマになっていると思います。

このテーマは好みのテーマ名を指定すれば変更できます。
どのようなテーマが利用できるかは、以下のコマンドを実行すればわかります。

# prompt -l
Currently available prompt themes:
agnoster cloud damoekri giddie kylewest minimal nicoulaj paradox peepcode powerline pure skwp smiley sorin steeef adam1 adam2 bart bigfade clint elite2 elite fade fire off oliver pws redhat suse walters zefram

たくさんの単語が出てきましたが、これら一つ一つがテーマです。
prompt -p <テーマ名>と指定すると、テーマをプレビューできます。
例えば、テーマagnosterをプレビューしたければ、prompt -p agnosterと打てばOKです。

一個一個プレビューしてくのは面倒くさい。」という方は、以下を参照すると良いでしょう。
一通りのプレビューがまとめられています。
Customizing Your Prezto Prompt

中途半端ですが、今回はここまで。
次回はプロンプトのテーマを変更してみます。
(ちなみに、テーマはparadoxにする予定)