2013年7月21日日曜日

Hyper-V上にPfSenseをインストールするときにやったこと(メモ)

自宅サーバの仮想化を進めるとともに、自宅ネットワークの仮想化も進めるべく、
宅内ファイヤーウォールであるPfSenseをHyper-V上に移行した際のメモ。

実は、Hyper-V上ではBSD系は上手く動作しない。
(このあたりVMWAREに分がある)

PfSenseもFreeBSDなので、上手く動作しない。
例えば、インストールの際、
/sbin/fdisk -v -f /tmp/format.fdisk
のところで、FAILED with a return code of 1 とか怒られたり、

Skipして強引にインストールしても、NICが認識されなかったり、レガシーでインストールしても、何故かDHCPでIP取ってこれないとか、手動でIP割り当てても通信が不能になったりする。


あれこれ試行錯誤した結果、なんと本家フォーラムにあるではないか。


それによると、
  • HDDは可変長ではなく固定長で作成。 
  • NICはレガシーネットワークで。 
  • /usr/local/etc/rc.d/にNICを再起動するスクリプトを放り込んで、起動時にNICを再起動する。

とのこと。

ちなみに、/usr/local/etc/rc.d/interfaces.shの中身はこんな感じ。
ifconfig de0 down
ifconfig de0 up
ifconfig de1 down
ifconfig de1 up
dhclient de0
勿論NICの数だけ書く。

あとは、現役で動いているFWと同じパッケージを予めHyper-V上のFWにDLしておくFWのバージョンは一致させたうえで、設定ファイルをdiagnotisタブのbackup/restoreからバックアップし、元のFWをダウンさせた後、Hyper-V上のFWを起動。設定ファイルを読み込ませる。

その際、NICが違うよと言われるので、de0とかを割り当てる。もし以前の環境でVLanを設定していたら、いったん削除し、再設定となる。
(いったん削除しないと動作がおかしくなる)

なお、インストールされたパッケージを同じにしないと、起動不能になったりしたので注意。

2013年7月20日土曜日

Chefのレシピについて、attributeの優先度を実際に試して見ながら調べてみた。

報告が遅れましたが、すごい広島#9に参加してきました。
今回は、Chefを触っていて気になっていた、attributeの優先度について、実際に試して見ながら調べました。

まず、chefのグローバル変数?ともいうべきattribute変数には、15レベルの優先度が設定されています。(参照先
初めは、上書きできる変数がしかも15レベルもあって、無意味じゃないかと思っていましたが、
それなりに理由はあるのです。(理由がないとそもそもそんな機能は実装されない)
それは、Chefのレシピは単独で使われることはまずなく、多くは組み合わせて使われるという事です。
例えば、Apacheのレシピでは、初期値としてポート番号80を設定したとします。
Apache単独で使用する場合はほとんど問題にならないでしょう。
しかし、Tomcatと組み合わせる場合、場合によっていはポート番号がぶつかるので変更する必要があります。
この場合、Apacheのレシピにスポット的にポート番号を上書きします。
又、Chefでは、複数のレシピの組み合わせを、roleという形で纏めることができます。
例えば、Apache+MySQL+PHPのレシピをLAMPというrole名で纏めるとか。
この場合、このroleではApacheのポート番号は81番にする。という形で上書きすることができます。
というように、階層構造になっています。

Chefは優先度の低い物順に

  • Default
  • Force_Default
  • Normal
  • Override
  • Force_Override
  • Automatic

という属性があり、Nodeに設定されるAutomatic属性の値が一番優先度が高い。
つまり、サーバ毎のNodeに設定されたパラメタで上書きされるという事です。

とまぁ理屈ではいまいち分かったような分からないような感じなので、実際にやって見ました。

まずはDefault属性。
このDefault属性は、優先度の低い順に

  • attribute
  • recipe
  • environment
  • role

の順になっています。
では、実際に試してみましょう。
knife cookbook create testでテスト用クックブックを作成。
recipes/default.rbには
Chef::Log.info("Value=#{node['attr_value']}")
と書いておきます。これで、実行した時にattr_valueの値が表示されます。
この値をこれから順次書き換えてゆきます。
attribute/default.rbには、
default["attr_value"]="attr_default"
としておきます。
ではこれを実行してみます。
[root@centos6 ~]# chef-client -o 'recipe[test]'
Starting Chef Client, version 11.4.4
[2013-07-17T07:06:42-04:00] INFO: *** Chef 11.4.4 ***
[2013-07-17T07:06:42-04:00] WARN: unable to detect ip6address
[2013-07-17T07:06:47-04:00] WARN: Run List override has been provided.
[2013-07-17T07:06:47-04:00] WARN: Original Run List: [recipe[service::stop]]
[2013-07-17T07:06:47-04:00] WARN: Overridden Run List: [recipe[test]]
[2013-07-17T07:06:47-04:00] INFO: Run List is [recipe[test]]
[2013-07-17T07:06:47-04:00] INFO: Run List expands to [test]
[2013-07-17T07:06:47-04:00] INFO: Starting Chef Run for centos6.localdomain
[2013-07-17T07:06:47-04:00] INFO: Running start handlers
[2013-07-17T07:06:47-04:00] INFO: Start handlers complete.
resolving cookbooks for run list: ["test"]
[2013-07-17T07:06:47-04:00] INFO: Loading cookbooks [test]
Synchronizing Cookbooks:
  - test
Compiling Cookbooks...
[2013-07-17T07:06:47-04:00] INFO: Value=attr_default
Converging 0 resources
[2013-07-17T07:06:47-04:00] INFO: Chef Run complete in 0.212122418 seconds
[2013-07-17T07:06:47-04:00] INFO: Running report handlers
[2013-07-17T07:06:47-04:00] INFO: Report handlers complete
Chef Client finished, 0 resources updated
ちゃんと出ていますね。
ではこれをrecipeで上書きしてみましょう。
/recipes/default.rbに以下を追記します。
node.default["attr_value"]="recipe"
これで実行してみます。
[root@centos6 ~]# chef-client -o 'recipe[test]'
Starting Chef Client, version 11.4.4
[2013-07-17T07:06:58-04:00] INFO: *** Chef 11.4.4 ***
[2013-07-17T07:06:58-04:00] WARN: unable to detect ip6address
[2013-07-17T07:06:58-04:00] WARN: Run List override has been provided.
[2013-07-17T07:06:58-04:00] WARN: Original Run List: [recipe[service::stop]]
[2013-07-17T07:06:58-04:00] WARN: Overridden Run List: [recipe[test]]
[2013-07-17T07:06:58-04:00] INFO: Run List is [recipe[test]]
[2013-07-17T07:06:58-04:00] INFO: Run List expands to [test]
[2013-07-17T07:06:58-04:00] INFO: Starting Chef Run for centos6.localdomain
[2013-07-17T07:06:58-04:00] INFO: Running start handlers
[2013-07-17T07:06:58-04:00] INFO: Start handlers complete.
resolving cookbooks for run list: ["test"]
[2013-07-17T07:06:58-04:00] INFO: Loading cookbooks [test]
Synchronizing Cookbooks:
  - test
Compiling Cookbooks...
[2013-07-17T07:06:58-04:00] INFO: Value=recipe
Converging 0 resources
[2013-07-17T07:06:59-04:00] INFO: Chef Run complete in 0.183293861 seconds
[2013-07-17T07:06:59-04:00] INFO: Running report handlers
[2013-07-17T07:06:59-04:00] INFO: Report handlers complete
Chef Client finished, 0 resources updated
[root@centos6 ~]#
っと書き変わっています。

この調子でどんどん書き換えて行けれます。(スミマセン。もう眠いっす)

参考:


2013年7月14日日曜日

ただいまChefを勉強中・・・

自宅サーバの再構築をもくろみ、毎度毎度セットアップするのがしんどいのと、何をどうセットアップしたのかが分からなくなるので、Chefで自動化を図りつつ、ちゃんと記録を付けることを目的に勉強しています。

前回は環境の構築と動作確認を行いました。今回はもう少し進めて、公式サイトを参考に、最少インストール実行後に行う通過儀礼不要なサービスを停止させるをやってみたいと思います。

では、どういうアプローチをしようかと考えましたが、


  • サービスを停止するといっても、サーバOSやバージョンによって停止させるサービスは異なる。
    • 停止するサービスはサーバに依存する。

この点を踏まえ、停止するサービスはサーバノードに持たせることにします。
まずは、サービス停止させるクックブックを作成します。

knife cookbook create services
すると、./cookboos/配下にservicesというディレクトリが以下のようにできます。

 .
|-- CHANGELOG.md
|-- README.md
|-- attributes
|-- definitions
|-- files
|   `-- default
|-- libraries
|-- metadata.rb
|-- providers
|-- recipes
|   `-- default.rb
|-- resources
`-- templates
    `-- default
現時点で理解している範囲内で説明すると、

  • CookBook
    • Apacheの設定とかPHPの設定とかあるまとまった機能単位で作る。
    • サーバ環境に依存するようなものは入れない。
    • RecipeやTemplate、Attributeなのを複数持たせることができる。
  • CHANGELOG.md
    • 変更点を書くこと。バージョン管理大事
  • README.md
    • このCookBookは何者?とか書く・・・のかな?
  • attributes
    • レシピは可能な限り汎用性を持たせたほうがよいようですが、たとえば、DB名とか処理上外部に依存したパラメタが必要になる場合があります。それら外部からのパラメタを受け渡す変数及び初期値を定義するもののようです。(参考
  • definitions
    • 良く分かっていません。
  • files
    • サーバに決まったファイルを配置する場合とかに利用するそうです。
  • libraries
    • 良く分かっていません。
  • metadata.rb
    • このCookBookのメンテなとかライセンスとか記載するようです。
  • providers
    • 良く分かっていません。
  • recipes
    • 設定を記述したRubyっぽいDSL。
    • お作法としては、default.rbではインクルードのみ記述し、実際の個別設定は別ファイルにするらしい。
    • このCookBookのこのrecipeという指定の仕方ができる。このCookBookという指定の場合、default.rbに仕方うようです。
  • resources
    • 良く分かっていません。
  • templates
    • 例えば、Apacheのバーチャルホスト設定とか設定のテンプレートを配置する場所のようです。
では、今回はサービスを停止させるレシピを書いてみましょう。
recipesディレクトリ内にstop.rbというファイルを作成し、こんな感じに書いてみました。


#
# Cookbook Name:: service
# Recipe:: stop
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
Chef::Log.info("Start")
node['stop_services'].each do |s|
  Chef::Log.info("Stoping Services #{s}")
    service s do
      action :stop
    end
end
Chef::infoの箇所は、実行時に画面にメッセージをデバック的に出したかったので入れています。
このCookBookのデフォルト動作には入れないので、default.rbはそのままです。
このレシピは、外部からの変数を使用していますので、それを定義しておきます。
attributesディレクトリにdefault.rbというファイルを作成し、こんな感じに書いてみました。

#Stop Services List
default["stop_services"] = ""
attributesで定義した変数は、node['hogehoge']で呼び出せる。
属性の名の通り、必須パラメタにしてみたり、色々な属性を与えられるらしい。

CookBookの作成はここで終了。(本当はReadmeとか更新したほうがいいんだけど)
作成したCookBookをChefサーバへアップロードする。

knife cookbook upload service
chefのWeb画面より、Cookbookのタブに表示されていればOK


さて、これを実際のノードに適用します。
説明はコマンドのほうがやりやすいので悩んだのですが、いきなりJSONを編集しろとかは酷な気がしたので、Webで説明します。
まずは、Nodesタブを開き、適用対象のクライアントのリンクをクリックします。
すると、なんだが沢山情報が出てくると思います。
OSの種類やVerから稼働時間から・・・
これらは、ohaiとよばれるもので収集しているようです。基本的にはここにあるパラメタがレシピから参照することができますので、OSによって実行コマンドが異なるとかの条件分岐に使用できます。
例えば、公式サイトではこんな具合に使っています。
service "crond" do
  case node['platform']
  when "redhat", "centos", "scientific", "fedora", "amazon"
    service_name "crond"
  when "debian", "ubuntu", "suse"
    service_name "cron"
  end
  action [:start, :enable]
end
さて、ここにストップするサービスのリストを定義したいと思います。
上にあるeditというリンクをクリックします。
下の方にこんな画面があると思います。


緑の+ボタンをおして、次のように入力したら、Save Attributeのボタンを押して登録します。


左側にあるJSONのツリー表示がこんな感じになればOK。
忘れずにSave Nodeボタンを押して設定を反映させます。

では、実際に動かしてみます。
knifeコマンドで、クライアントPCにSSHで接続してコマンド実行とかできるのですが、今回はクライアントの端末で動かします。
クライアント端末にログインしたら、以下のコマンドを実行してください。(当然root権限必要)

 chef-client -o 'recipe[service::stop]'
実行結果はこんな感じです。(私の環境の場合)
[root@centos6 ~]# service httpd start
Starting httpd:                                            [  OK  ]
[root@centos6 ~]# service vsftpd start
Starting vsftpd for vsftpd:                                [  OK  ]
[root@centos6 ~]# chef-client -o 'recipe[service::stop]'
Starting Chef Client, version 11.4.4
[2013-07-14T02:41:03-04:00] INFO: *** Chef 11.4.4 ***
[2013-07-14T02:41:03-04:00] WARN: unable to detect ip6address
[2013-07-14T02:41:03-04:00] WARN: Run List override has been provided.
[2013-07-14T02:41:03-04:00] WARN: Original Run List: [recipe[service::stop]]
[2013-07-14T02:41:03-04:00] WARN: Overridden Run List: [recipe[service::stop]]
[2013-07-14T02:41:03-04:00] INFO: Run List is [recipe[service::stop]]
[2013-07-14T02:41:03-04:00] INFO: Run List expands to [service::stop]
[2013-07-14T02:41:03-04:00] INFO: Starting Chef Run for centos6.localdomain
[2013-07-14T02:41:03-04:00] INFO: Running start handlers
[2013-07-14T02:41:03-04:00] INFO: Start handlers complete.
resolving cookbooks for run list: ["service::stop"]
[2013-07-14T02:41:03-04:00] INFO: Loading cookbooks [service]
Synchronizing Cookbooks:
  - service
Compiling Cookbooks...
[2013-07-14T02:41:03-04:00] INFO: Start
[2013-07-14T02:41:03-04:00] INFO: Stoping Services httpd
[2013-07-14T02:41:03-04:00] INFO: Stoping Services ftpd
Converging 2 resources
Recipe: service::stop
  * service[httpd] action stop[2013-07-14T02:41:03-04:00] INFO: Processing service[httpd] action stop (service::stop line 12)
[2013-07-14T02:41:03-04:00] INFO: service[httpd] stopped

    - stop service service[httpd]

  * service[ftpd] action stop[2013-07-14T02:41:03-04:00] INFO: Processing service[ftpd] action stop (service::stop line 12)
 (up to date)
[2013-07-14T02:41:04-04:00] INFO: Chef Run complete in 0.415815576 seconds
[2013-07-14T02:41:04-04:00] INFO: Running report handlers
[2013-07-14T02:41:04-04:00] INFO: Report handlers complete
Chef Client finished, 1 resources updated

あれ?よく見ると、ftpdが止まっていませんね。
CentOS6はvsftpdという名前なので、一致しなかったんですね。
では、レシピを書き換えてみましょう。

Chef::Log.info("Start")
node['stop_services'].each do |s|
  Chef::Log.info("Stoping Services #{s}")
    service s do
        case node['platform']
          when "centos"
            service_name "vsftpd" if s=='ftpd'
          end
      action :stop
    end
end
ちゃんとCHANGERLOG.mdを編集し、metadata.rbのバージョンを更新してアップロード。

[root@centos6 ~]# chef-client -o 'recipe[service::stop]'
Starting Chef Client, version 11.4.4
[2013-07-14T02:54:55-04:00] INFO: *** Chef 11.4.4 ***
[2013-07-14T02:54:55-04:00] WARN: unable to detect ip6address
[2013-07-14T02:55:00-04:00] WARN: Run List override has been provided.
[2013-07-14T02:55:00-04:00] WARN: Original Run List: [recipe[service::stop]]
[2013-07-14T02:55:00-04:00] WARN: Overridden Run List: [recipe[service::stop]]
[2013-07-14T02:55:00-04:00] INFO: Run List is [recipe[service::stop]]
[2013-07-14T02:55:00-04:00] INFO: Run List expands to [service::stop]
[2013-07-14T02:55:00-04:00] INFO: Starting Chef Run for centos6.localdomain
[2013-07-14T02:55:00-04:00] INFO: Running start handlers
[2013-07-14T02:55:00-04:00] INFO: Start handlers complete.
resolving cookbooks for run list: ["service::stop"]
[2013-07-14T02:55:01-04:00] INFO: Loading cookbooks [service]
Synchronizing Cookbooks:
[2013-07-14T02:55:01-04:00] INFO: Storing updated cookbooks/service/recipes/stop.rb in the cache.
[2013-07-14T02:55:01-04:00] INFO: Storing updated cookbooks/service/CHANGELOG.md in the cache.
[2013-07-14T02:55:01-04:00] INFO: Storing updated cookbooks/service/metadata.rb in the cache.
  - service
Compiling Cookbooks...
[2013-07-14T02:55:01-04:00] INFO: Start
[2013-07-14T02:55:01-04:00] INFO: Stoping Services httpd
[2013-07-14T02:55:01-04:00] INFO: Stoping Services ftpd
Converging 2 resources
Recipe: service::stop
  * service[httpd] action stop[2013-07-14T02:55:01-04:00] INFO: Processing service[httpd] action stop (service::stop line 12)
[2013-07-14T02:55:01-04:00] INFO: service[httpd] stopped
    - stop service service[httpd]
  * service[ftpd] action stop[2013-07-14T02:55:01-04:00] INFO: Processing service[ftpd] action stop (service::stop line 12)
[2013-07-14T02:55:01-04:00] INFO: service[ftpd] stopped
    - stop service service[ftpd]
[2013-07-14T02:55:01-04:00] INFO: Chef Run complete in 0.601231803 seconds
[2013-07-14T02:55:01-04:00] INFO: Running report handlers
[2013-07-14T02:55:01-04:00] INFO: Report handlers complete
Chef Client finished, 2 resources updated

上手くいきました。





2013年7月11日木曜日

すごい広島 #8に参加してきました。

報告が遅れましたが、昨日、すごい広島#8に参加してきました。
仕事帰りでクタクタな上に、所持金が数百円しかない状況で正直寝たかった頑張って見ました。
(当日招集お誘いがあったのもあって。)

やることは、広島Ruby勉強会 #033で喋らせてもらったスライドを纏めてアップする予定でしたが、


  • ノーパソのACアダプタを持ってくるのを忘れた。
    • (参加できる時間に帰れるか怪しかったので参加する予定がなかった)
  • 肝心のノーパソをどうやら充電するのを忘れていたらしく、バッテリが完全に上がっていた
という不幸が重なり、会場に着いたのはいいがどうしたものかという状況だったので、
主催者より数学文章作法という本をお借りしたので、読んで見ました。
時間の都合上4章まで。メモ用紙もなかったので記憶を頼りに。


まず、文章を書くという事は「読者のことを考える」という事を常に意識しないといけない。
文章を書くという事は、読者に何かしら伝えるに値すると思ったことを伝えるという事です。
つまり、読者がいないと成立しないのです。
しかし、読者は飽きっぽい。最後まで読んでくれることはないかもしれないし、順番通り読んでくれないかもしれない。
そうさせないためにはどうすればいいか。
迷ったら読者のことを考える。

読者の知識、意欲、目的は何なのか。
文章を読み進めるに従い、読者の知識、意欲は変化していく。その変化に沿うように文章が組み立てられているのか。
常に自分の主張を明確にできているか。余談で脇道にそれすぎていないか。
一つの文章に複数の主張を混在させていないか。

等々。
当たり前だよね?というものほど、当たり前ではなく、こうして論理的に文章で明快に説明されると改めて気付かされることがあります。
1章が14ページ程度と短く簡潔にかつ主張が明確に書かれているので、読みやすい印象を受けました。
この14ページに収めるためにどれほどの文章が凝縮されているのだろうと。


半分寝ながら読み進めているうち、これは文章を書くことだけではなく、LTなど発表する場、先生など教育をする場、そして、プログラムにも共通点が多いことに気付かされました。

一つの単語が集合して文となり、文が集合して段落ができ・・・
の下りは、まさにプログラムであり、ひとつの文章に複数の主張を混在させると読者が混乱するのは、ひとつのクラスや関数に複数の機能を実装していると置き換えられます。

ある条件が成立する場合は、成立する条件を記載しないと、読者は混乱します。
例外事項があれば、きちんと説明する。

多くの言葉を使って説明するより、簡潔に、適切に文章を区切り、一文で複数の主張をしないよう注意を払う。

全ては読者のことを考えて。

相手の立場にたって考える。これは相手がいるどの場面でも必要なことです。
過去、未来の自分自身に対してもそうです。

LTやプログラム、ブログやツイッター、そして普段の会話など、どうしたらいいのか迷ったときは、
相手の立場にたって考えることを意識付けていきたいと思います。