YAMLはJSONの(ほぼ)スーパーセットになっている
というのを最近知りました。
Rubyist Magazine - プログラマーのための YAML 入門 (初級編)
そもそも、YAMLにブロックスタイルとフロースタイルがあり、フロースタイルの方がJSONと(ほぼ)互換するので、JSON is YAMLなのだそうです。(リンク先のRubyist Magazineでは、YAML is JSONというページにデッドリンクが残っていますが、多分逆でJSON is YAML。)
JSON is YAML, but YAML is not JSON - Eli Bendersky's website
ほぼ、というのは、YAMLの規格が何度かアップデートされてるのも一つの目的としてはJSONとの互換性を高めることだったりしたみたいで、微妙な差異がバージョンによってはあるみたい。(同じキーの複数回の出現を許すか許さないか、とか)
YAML Ain’t Markup Language (YAML™) Version 1.2
The primary objective of this revision is to bring YAML into compliance with JSON as an official subset.
ansibleのPlaybookでこんな感じで、{{}}でくくった変数を直接なにかの値にしてしまうと怒られるのもこのせいで、フロースタイルのディクショナリと解釈されてしまうからのようです。
- name: {{name}}
…というのを、書き残しておこうと思ったら、 YAML Syntax — Ansible Documentationに書いてありました。(でも残す。)
大体なんでもansibleでやる
ansibleのモジュールが便利で、一回こっきりの作業もスクリプトを書くよりもansibleのモジュールにぴったりとしたのがあれば、それでどうにかしたくなります。なんでもansibleでやっちゃうおじさん。
コマンドラインから「ホスト指定」と「変数の値」を渡して、Playbookを実行できると色々と定型処理が楽になるのでまとめ。
ホストの渡し方
localhost固定であれば、こんな感じでPlayのhostsにlocalhostあるいは127.0.0.1とでも書けば良い。
--- - hosts: 127.0.0.1 tasks: - ...
そうでない場合は原則としてインベントリファイルに書かれているホストしかansibleは操作できない。
が、ansible-playbookコマンドの-i
オプションにコンマ区切りでホストを書くと、インベントリファイルをつくらなくても、インベントリにそのホストが登録されているのと同じ扱いになる。
(Dynamic Inventoryというのもありますが今のところ使ってない。)
変数の渡し方。
変数については--extra-vars
オプションの引数に、KEY=VALUE
か、ちゃんとquoteしたJSONを書いて渡せば値が渡る。
http://docs.ansible.com/ansible/playbooks_variables.html#passing-variables-on-the-command-line
ssh周り
まだ鍵を入れて無くて、鍵認証が出来ないサーバーでも(root)パスワードがわかれば、ansible-playbookコマンドに--ask-pass -c paramiko
を足して、パスワードでログインできる。
(自分の環境ではparamikoでなければ上手く動かなかった。)
鍵の配布自体はauthorized_keyモジュールで出来る。
hostname - Manage hostname — Ansible Documentation
例
例えばこんな感じのPlaybookを書いて、
--- # playbook.yml - hosts: "{{ip}}" tasks: - hostname: "{{hostname}}" - authorized_key: user=charlie key="{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"
こんな感じのスクリプトで包めば、
#! /usr/bin/env ruby # init_host.rb ip = ARGV[0] hostname = ARGV[1] vars = %Q({"ip":"#{ip}","hostname":"#{hostname}"}) cmd = %W(ansible-playbook ./playbook.yml -i ,#{ip} --ask-pass -c paramiko --extra-vars) cmd.push(vars) system *cmd
こんな感じでスクリプトを叩いて、指定サーバーのホスト名の付け替えと、鍵の導入が出来たりする。便利。
$ ./init_host.rb 192.168.0.100 test-server
curl/ansible/firefoxだけhttpsが通らない
iptables設定を色々いじって、ヘアピンNAT問題を解決したのでこれでDMZ内のhttpsサーバーからget_urlできるかなと思ったら、「ルート証明書がない」みたいな感じで怒られて、curlを叩いても同じようなエラー。
RapidSSLで取った証明書なのが怪しいなと思いつつ、証明書バンドルを更新したらいいのかなと思ってyum update ca-certificates
をしてみても最新。MacのSafari/ChromeではOKだったので、なんだろなと思ったらMacのFirefoxでもだめ。
"RapidSSL Firefox"でぐぐってみたところ、中間証明書の登録が必要みたいで、あーこれかなと思いつつ、(別の人が設定した)同じ(ワイルドカード)証明書を使っている別サイトはOKなので、そのapacheの設定を見てみたらSSLCertificateChainFile
でRapidSSLの中間証明書が指定されてて当たり。
ということでnginxだとどうやるのかなと言うことで、この辺りを見て設定。本当にcatするだけでいいみたい。
Basic認証が通らないので明日に持ち越し。
chef/centos-6.6が無くなってしまった
今のお仕事ではCentOS6.xを使っているのですが、八月の終わりぐらいだったと思うのですが、vagrantでそれまで使っていたchef/centos-6.6
が無くなってしまいました。人が公開してる色々を使って自動でセットアップする色々を組むのは、便利なのですがこういうので壊れるので考えどころです。
Atlasのchef/** で公開されていたBoxは、bento/**に移ったとのことで、後継はどうもbento/centos-6.7 の様子。
念のためキャッシュに残ってた6.6(にansibleとVirtualBox Guest Additionの5.03を入れたの)をBoxにして、kzwmsyk/centos-6.6として退避。
ただ、6.7だから動かなくなった、というのは今のところなさそうだし、どのみちyum update
で6.7になるようにしてたりで、結局vagrant環境はbento/centos-6.7
を使っております。
DMZ内部から外のための名前でDMZ内のサーバーにいけない
ここ五年ほどWebエンジニアをやってたのですが、当時インフラ周りはインフラエンジニアさんに任せきりだったので、今の会社に移ってからにわかネットワークエンジニアみたいな感じで四苦八苦しております。
最近はほら、自宅用のLANなんかはルータ買ってきてケーブル挿すだけでDHCPでうまいことやってくれてすぐ使えるじゃないですかというか無線なのでケーブルさえ挿さないじゃないですか。ゲートウェイとか固定IPとかネットマスクとか久しぶりに設定しました。
というのはさておき、仕事で組んでいるネットワーク環境ではゲートウェイサーバーのiptablesで、中(DMZ)から外(インターネット)に出るのにIP MASQUERADE、外から中に入ってくるのにDNATを使っております。
で、DMZ内ではhoge.localとかfuga.localとかわりと好きなように名前を振り、外に出したいサーバーはひとまずゲートウェイサーバにhoge.example.comとかfuga.example.comとかの名前を向けて、そこから中のサーバーにDNATでポート転送して、中から外への通信も、外から中への通信もああできてるなと安心していたのですが、中から中への通信に外用の名前を使うと、つまりfuga.localからhoge.example.comにアクセスしようとすると、ダメなんだそうですねこれ。pingとかDNSでの名前引きはできるのですが、http通信とかが繋がらない。隣席のネットワークエンジニアさんに聞くとネットワークあるあるだそうで、普通にやると遮断され、設定を中途半端にいじるとパケットがぐるぐる回るみたい。
中にアクセスするときと外にアクセスするときとで、名前を使い分けたらいいのですが、外にあることを想定していたサーバーを中に置いたりなんかするとハマりそうなので、一回外に出るのが無駄だよね、というのは許容しつつどうにかしたいところ。
休みが明けたらもう一台ゲートウェイサーバーを置いて、外から中への口と中から外への口を分けようかなと。
(追記) 「ヘアピンNAT」「NATループバック」と言うそうです。
(追記2) 結局iptablesの設定が良くないだけでした。下記ページを参考に設定を変更して解決。FORWARDの許可設定の追加も必要でした。
OVFからクローンするとネットワークに繋がらなくなる
CentOS 6.7のサーバーの、ovfテンプレートを作って、そこからクローンして作った仮想マシンがなぜかネットワークに繋がってない。
ifconfigでeth0は見えるし、vCenterでもNICが見えるのに、なぜか疎通しない。
まるで仮想マシンなのにケーブルが抜けてるかのような現象。
DHCPでIPを振りつつ、DHCP_HOSTNAMEを元にDNSにレコードを作っているので、その辺りが悪さをしてるのかなとも疑ってみたのですが、
まさにこれでした。VMwareあるあるだったみたい。 www.checksite.jp
起動中のマシンからテンプレートを作ったせいで、eth0が見えていた様子。
対処は色々あるようですが、/etc/udev/rules.d/70-persistent-net.rulesは起動時に存在しなかったら自動生成されるファイルのようなので、テンプレート機用のansible Playbookに以下を追加して、ovf作る前にこれを削除。
- file: path=/etc/udev/rules.d/70-persistent-net.rules state=absent
あと、ovfは横着しないでシャットダウンしてから作ることにしました。