あれ、どうやったっけ

(たぶん)テキストサイト風blog。文が安定するまで書き直しあるからメンゴ。

Chef13 いいから動けよ設定

これ何

ゴタクはいいからchef動かす方法書けや、chef-soloはディスコンなんだよ憤死すんぞ(俺が)。

という俺の備忘録。練習で触ったもの。

後で直す可能性すっげ高いうえ、後日いちいち直した箇所を末尾に「update1: ほげほげがふがふがでアッー! だから直しましたアッー!」とか書かんけどいったんうpることにする。なんかしばらく下書きにいらっしゃったので。

俺がなんとなく思い出せればいい というひどい内容なので勘弁してくれ。

初期設定

ワークステーションからノードへはSSHで入れるようにしてね? でないと knife bootstrap というか、ノードにchef-clientをぶっこむコマンドでご愁傷。

サーバ: うぶんつ16.04.3_amd64@VirtualBox

ノード: でぶやん9.1_amd64@VirtualBox

ワークステーションゲイツOS10_amd64 Creators update@実機

実機が許されるの中学生までだよねーwww キモーイwww というあなたはAmazonなりクラウディア様なりさくらたんかConoHa殿でなんとかしれ。俺は知らん。

止めたこと

ワークステーションとノードの、サーバに対する証明書チェック。

自分のchef鯖につないでると思ったらスパーハカーの鯖だったって時に 嘘だッッ! って言って接続切るアレ。「最低限動かすためのコマンド投入」という意味ではあんまりいらんっちゃいらん。Learn chef rallyでは書いてるが。

あと、chefはどうもIPでの証明書作ってくれないうえ、理由は不明ながらホスト名とIPの変換ができるようにしてないとハマることあり。要はDNSなりhostsファイルなりをどうこうしておかないとよーわからんエラーでずっこけやすいってことですが。

なんでそうなるかはお前の宿題にするから調べといて(ごまかし)。お前って 後日の俺 じゃねえか? ですよねー。

じゃあやってみよう

chef鯖で

# chef鯖準備、バージョンは時期によって違うから注意せよ
wget https://packages.chef.io/files/current/chef-server/12.16.14/ubuntu/16.04/chef-server-core_12.16.14-1_amd64.deb
sudo dpkg -i chef-server-core_12.16.14-1_amd64.deb
sudo chef-server-ctl reconfigure

# chef鯖にファイルうpるユーザーと、orgの設定
# サーバとワークステーションが別ならpemをscpしてワークステーションに持ってこないとあきませんよ
sudo chef-server-ctl user-create username first_name last_name email_address@invalid 'input_your_pass' -f /home/username/workstation.pem
sudo chef-server-ctl org-create org-name "organization fullname" -a username -f /etc/opscode/org-name-validator.pem

ワークステーション

mkdir -p any_dir/.chef/
New-Item any_dir/.chef/knife.rb

scp user@chef_server:/home/username/workstation.pem any_dir/.chef/
scp user@chef_server:/etc/opscode/org-name-validator.pem any_dir/.chef/

emacs any_dir/.chef/knife.rb

してknife.rbにこんなの書いて

# 手抜き用変数
server_ip = "192.168.0.xxx"
current_dir = File.dirname(__FILE__)

# なくてもいいよ、シクったときにlog_level変えるといい
log_level :info
log_location STDOUT

# こっから要るよ
node_name "username"
client_key "#{current_dir}/workstation.pem"
chef_server_url "https://#{server_ip}/organizations/org-name"
cookbook_path ["#{current_dir}/../cookbooks", "#{current_dir}/../site-cookbooks"]
ssl_verify_mode :verify_none

# chef鯖証明書の検査、hostsなりdnsなりでホスト名が解決できないと動かない
#ssl_verify_mode :verify_peer
#validation_client_name "org-name-validator"
#validation_key "#{current_dir}/org-name-validator.pem"

ssl_verify_mode :verify_peer にしてるなら追加コマンド投入

knife ssl fetch
knife ssl check

やったら

# cookbooksフォルダはsupermarketからダウンロードしたのが入るお作法、自作はsite-cookbooksへ
chef generate cookbook site-cookbooks/abe_mario

でクックブックのテンプレ吐かせて、recipeだのどうこうして、metadata.rb(のバージョン)上げたりして

# .chef/knife.rbのcookbook_path にパス通してるならフォルダ名だけでOK
knife cookbook upload abe_mario

# 男らしくすべてをうpる場合はこっちだ
knife cookbook upload --all

でクックブックをうpり

knife role create dummy

# でロールのひな型作ってああこう直したのち

knife role from file roles/dummy.json

でロールもうpる。そののちにノードに対して初回設定をやる。コマンドはどっちでもいいよ

# ssh鍵認証、ノードの /etc/ssh/sshd_config では PasswordAuthentication yes にしてないよね?
knife bootstrap FQDNorIP --node-ssl-verify-mode none --ssh-user USER --sudo --identity-file IDENTITY_FILE --node-name node-xxx

# sshパスだけ認証こっち
knife bootstrap FQDNorIP --node-ssl-verify-mode none --ssh-user USER --ssh-password 'PASSWORD' --sudo --use-sudo-password --node-name node-xxx

おわったら

# ノードにロール割り付け
knife node run_list set node_name "role[dummy]"

# お前本当に登録できてんの?
knife node show machine --run-list

以降はsshでノードにお邪魔してchef-client 蹴るとか chef-client -d をノードで実行するとかで更新かかる……はず。あるいはknife ssh host_name chef-clientでも行けるっちゃいける。なお、-dオプションは「デーモン化する」の意味で、ansibleに対するchefの利点だが誤爆も多いので注意。

「chefの学習コストが高い」ってのはオペ数が多いのと、設定ファイルがあっちゃこっちゃにありすぎるのと、何がどいつに適応されてるのかがいまいちわかりづらいあたり。なんというかオーバースペック感パない。

で、逆にAnsibleだとJinja2でのコーディングが待ち受けると。PNIN対応程度でも余裕でイラっと来る程度に融通が利かんアレ。たぶんAnsibleがPythonのコード流せるようになってたら問題なかったんじゃないだろうか。ノードになんやかや送り込んで向こうのPython蹴ってるんだからできたんじゃね? とは思う。文字列回りとか2/3系のカラミでPythonには数度刺されたことがあるのであんまり好きじゃないが、使えるならなんだって使うわなってところ。

なんというか「SSHでコマンド流してノードの状況に応じた変数当て込んだテンプレートぶっこめるくらいでええんや、でもJinja2先生の黒魔術を覚える気がしない」ってなるとNet::SSHかParamikoを悪用する方向性で考えたほうがいいのかもしんない。あるいはまだ試してないitamaeあたり?