2018-01-01 :-)
_ [川崎大師][初詣]初詣
いつもどおりに川崎大師へ行きました。自宅近所のジャンクションが工事中でカーナビが空中を走り出し混乱し始めたので若干遠回りしてしまいました。
川崎大師の周辺道路が混んでました。川崎大師の祈祷殿駐車場は西側(川崎大師駅のほう)から来て左折して入るのがセオリーなんですが、自宅から素直に川崎大師へ行くと東側から行くことになってしまい、そして駐車場には右折して入ることになります。超絶混みます。このままだと祈祷時間に間に合わないので東側から行ってしまったので途中で抜け出してUターンして西側から入るようにして路線変更して無事に祈祷に間に合いました。なお西側の道路も超絶混んでましたが、こちらは祈祷が目的ではなくただ駐車場のための行列のようでした。
本殿には17時過ぎに向かったんですが入場待機列はけっこう短く、30分ほどで本殿に入れました。
_ 月が綺麗ですね
_ 読書メーター
12月の読書メーター
読んだ本の数:4
読んだページ数:1464
ナイス数:25
[改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)の感想
Jenkins 2.0対応。Pipelineというのが入ったらしい
読了日:12月23日 著者:佐藤 聖規,和田 貴久,新井 雄介,米沢 弘樹,山岸 啓,岩成 祐樹
初めての自動テスト ―Webシステムのための自動テスト基礎の感想
初めて自動テストやるひとには良いです。登場するキャラクターはテスターですが、テストしたことが無い製品実装者が呼んでも有益です。テストのピラミッドなど頭を整理するにも良いですね。モックの密結合や、状態遷移による複雑化で血と汗と涙を流した経験がある人なら読まなくてよいかと。事例のテストコードが唐突にrspecで書かれていて面くらいますががrails前提なのでウェッブ方面のひとはすんなり入れるんでしょうか
読了日:12月23日 著者:Jonathan Rasmusson
テストから見えてくる グーグルのソフトウェア開発の感想
「品質は設計から作り込む」うむ。SWE(ソフトウェアエンジニア。製品コードに責務を持つひと。開発者側)、SET(ソフトウェアエンジニアインテスト。テストコードに責務を持つひと。開発者側)、TE(テストエンジニア。品質に責務を持つひと。ユーザー側)の職種を中心に紹介し、グーグルがどのようにして品質を確保しているかを解説している / 直訳ぽい箇所が多々あるがご愛嬌
読了日:12月21日 著者:ジェームズ・ウィテカー,ジェーソン・アーボン,ジェフ・キャローロ
幼馴染の山吹さん (電撃文庫)の感想
かにビーム絵に釣られて購入。読んだあとに爽やかな気分になれる。短い期間ほんの一瞬を全力で青春を燃やす眩しい作品でした。若いっていいなあ。山吹さんが姫で青葉は騎士という役割のように見えて、相手のことを考えすぎて斜め方向い行ってしまい、お互いがお互いを誤解して距離を置いているけど、自分自身と向き合い少しずつ自分の気持ちに気づいていく。ハートフルです
読了日:12月06日 著者:道草よもぎ
読書メーター
2018-01-04 :-)
_ 父を病院へ送りました
治療のため今日から入院です。
_ [宇宙よりも遠い場所]宇宙よりも遠い場所 1話を見ました
女子高生が南極へ行くお話のようです。南極地域観測船「しらせ」がOPから登場します。キャラクターの輪郭に白い線が描かれていて、映画「きみの声をとどけたい」と同じ手法なので、この作品は名作となるに違いありません。
「しらせ」は私も見学したことがあります[ 20170805#p01 ]
_ そういえば年末NHK BSの声優番組を見たんですが
若手声優の顔がのっぺりしていてかえって 気味が悪い 好みではないなあと思いました。顎の力あるのかなと。一緒に出演していた朴璐美のほうが余程きれいな顔立ちでした。以上です。
2018-01-05 :-)
_ [封印されたカード][カードキャプターさくら]劇場版カードキャプターさくら「封印されたカード」リバイバル上映 舞台挨拶を見ました
@新宿ピカデリー
テレビシリーズ「クリアカード編」が放送開始されるのでその前の盛り上げ。だと思います。
舞台挨拶は丹下桜(木之本桜役)、くまいもとこ(李小狼)です。くまいもとこはたぶん初めて見た。丹下桜は 15 年ぶりくらいに見た。声が変わっていないのがこれまたすげえです。司会進行のひともどうやらテレビシリーズも劇場版(2作品)も見てるようでところどころ的確な話題を振っていました。
「封印されたカード」が上映されたのが 2000 年なので 18 年ぶりです。18 年前の作品ですが、いま見てもストーリー、作画、カメラワーク、セリフ、キャラクターの表情、息遣い、間合い、役者の演技などまったく色あせてないです。これが 2000 年に作られたものなのだから、当時から凄まじい作品なのだなあとあらためて思いました。
ストーリーのなかでは、決戦前に大道寺知世が木之本桜と李小狼の 2 人に衣装を渡す場面がありますが、あそこは、中盤に李小狼が「問題を解決するためには誰かが犠牲になるのも仕方ない(そしてその犠牲は李小狼が担う)」とフラグを立てるんですが、神がかり的な洞察力を持った大道寺知世が「この衣装を着て、必ず帰ってきてください」とフラグを折りに行きます。あの場面は何度見ても涙腺崩壊しますね。今日も周囲では鼻をすする音がそこかしらから聞こえてきました。分かる、分かるぞ。
あとはクライマックスでの「無のカード」を封印するときの一連の場面も、丹下桜と坂本真綾(無のカード役)の演技も圧巻です。クロウカードからさくらカードへ変換するときにテレビシリーズから一貫して「クロウの作りしカードよ 古き姿を捨て生まれ変われ 新たな主 さくらの名のもとに」というセリフがあるんですが、このセリフの最後「さくらの名のもとに」の声が凄まじい。テレビシリーズでは淡々と言っているんですが、本作品では、自分の大事な気持ちを犠牲にして、その覚悟を決めたうえで、大事な気持ちを無くすのは辛いし悲しいけど、ここでさくらカードに変換しないと決着が付かないことが分かっていて、そしてそれが出来るのは自分以外に居ないし自分がやるほかない。という苦しみ、悲しさ、覚悟が全て混ざった気持ちがこのたった一言に表れています。
坂本真綾(当時高校生だったらしい)の無のカードの演技も心臓にキマすね。本作品のラスボスではあるけど、あのセリフからは「無のカード」としての宿命による悲壮さが伝わってきます。
2018-01-06 :-)
_ [中二病でも恋がしたい!]映画 中二病でも恋がしたい! -Take On Me- 舞台挨拶を見ました
@新宿ピカデリー
友人にポッピンQを普及するために、友人が参加するイベント且つ私の都合がつくイベントを探したらちょうどチケットぴあに本作品の舞台挨拶のチケットが「リセール」されていたのでせっかくだからチケットを買ったのが昨晩のこと。見てきました。なおテレビシリーズ2期は見てません。
上映が始まる前に観客向けのフォトセッションがあるので撮影し放題の時間。
いちおうネタバレ回避
テレビシリーズとその後の総集編劇場版も見ておいて、今更だけど、「中二病」は彼/彼女たちが作り出した「自分が見ている世界」(だから「爆ぜろリアル」と言っている)なのだし、そうなってしまったのは彼/彼女たちが現実にうまく向き合うスキルが無いためで、ただそのスキルというやつは「社交性」というふんわりしたものだし、結局「空気を読む」「周囲に馴染む」「現実と折り合いをつける」というだけのことなんだけど、彼/彼女たちはそのスキルを持っていない。六花は現役で中二病だから、つまり社会に馴染めていない。社会というのは、学校、家庭、友人、恋人などなどのこと。そんな六花をどうやって社会になじませるか、というのがテレビシリーズから一貫している話題です。たぶん。2期見てないから分からん。
本作品では勇太と六花が駆け落ちするわけだけど、ただその行動も大人の十花には読まれているし(つまり大人に抗う子供として描かれている)。
また、札幌空港かな、そこで勇太が六花に渡すものは、一般的には「給料三ヶ月分」というどこかの企業が宣伝した文句に世間が踊らされ結果出来上がった文化であるけど(バレンタインデーと同じです)、勇太も六花も高校生なので、その場面で登場するのは「給料三ヶ月分」なんかではなく玩具のような物だけど、高校生の彼/彼女がいま出来る誠心誠意の行動なのである。「ごっこ遊び」と言えばそれまでだけど、背伸びした彼/彼女たちはたしかにあの場面では 自分の心に 誠実であろうとした。
彼/彼女がお互いに対して誠実になったのはクライマックスをお楽しみに。
2018-01-07 :-)
_ アニメを消化するなどしました
今期のアニメが放送開始されているので録画したやつを見ていました。
ゆるキャン がよいですね(よい)。アウトドア作品としては、観測範囲内ではヤマノススメも人気なんですがあっちはみんなガチ勢になってしまい、私のような膝に矢を受けてしまった人間に登山はなかなかツラいものがあります(ようするに膝が痛い。4つほど病院で検査したが半月板損傷だと言われたり、腱が炎症していると言われたり、結局原因も対策も分からず)。ゆるキャンも雰囲気はゆるいですが道具はガチですね。
あと ポプテピピック を見ました。原作知らないんですが、ひたすら過去のアニメやゲーム等をパロっているので本作品を楽しむには幅広い知識が必要なようです。
大事なことなんですが、結城友奈は勇者である -勇者の章- の最終回を録画し忘れたようです。ブルーレイを予約したのでそれまで大人しく待ちます。
2018-01-09 :-)
_ 「やりたいことを100個挙げてみよう」と言っているひとが居た
のでやってみたんですが、50個くらいしか挙げられませんでした。夢がありません。
_ ゆめといえば
新年早々プリパラを録画し忘れました。
2018-01-10 :-)
_ 見舞いへ行くなどしました
帝京大学医学部附属溝口病院 ですが、医師からの説明があったので質疑応答タイムで「質問が 3 つあるんだが」と言ったところ、医師はちゃんと 3 つ質問があることを覚えていたので、この医師は信頼できます(仕事の進め方として)。
_ github が落ちてました
寝ます。
2018-01-11 :-)
_ [Travis CI]はじめての Travis CI
「いまどきwwww Travis CI www 草www」という感じで 5 周遅れくらいですが使ってみました。はじめてなので /// みんな大好き世界よこんにちは。
レガシーおじさんなので C 言語で。travis のテストは 0 で pass、非0 で fail らしいのでひとまず 0 決め打ち。
#include <stdio.h> int main(int ac, char** av) { printf("hello travis!!\n"); return 0; }
.travis.yml も超絶簡単に。
language: c compiler: - gcc script: gcc main.c -o main && ./main
ソースファイルに限らず何らかのファイルをリポジトリに push すると travis がトリガーされて、ビルドとテストが実行されます。(ログを眺めてると毎回 仮想環境を構築しているようでそのぶんの時間がかかります)
travis のリポジトリページでバッジへのリンクが取得できるので、github の README.md 等にリンクを書いておくとテスト結果が表示されます。わーい たーのしー
_ [curl]curl で github の release ファイルを取得する方法
-L も付けていけませんかね
— デコ (@Decors1215) January 11, 2018
curl -O -L https://github.com/mackerelio/mackerel-agent-plugins/releases/download/v0.42.0/mackerel-agent-plugins_0.42.0-1_all.deb
マニュアル嫁っていう数年前に投げたブーメランが戻ってきた。
-L, --location (HTTP) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response code), this option will make curl redo the request on the new place. If used together with -i, --include or -I, --head, headers from all requested pages will be shown. When authentication is used, curl only sends its credentials to the initial host. If a redirect takes curl to a different host, it won't be able to intercept the user+password. See also --location-trusted on how to change this. You can limit the amount of redirects to follow by using the --max-redirs option.
2018-01-12 :-)
_ [cygwin][ruby][gem][bundle][bundler]cygwin で gem install bundler した bundle が行方不明だった
% gem environment RubyGems Environment: - RUBYGEMS VERSION: 2.6.11 - RUBY VERSION: 2.3.3 (2016-11-21 patchlevel 222) [x86_64-cygwin] - INSTALLATION DIRECTORY: /home/rin/.gem/ruby/2.3.0 - USER INSTALLATION DIRECTORY: /home/rin/.gem/ruby/2.3.0 - RUBY EXECUTABLE: /usr/bin/ruby.exe - EXECUTABLE DIRECTORY: /home/rin/bin - SPEC CACHE DIRECTORY: /home/rin/.gem/specs - SYSTEM CONFIGURATION DIRECTORY: /etc :
ここにインストールされた。ふむー
% ls ~/bin bundle* bundler*
_ [Debian][golang]Debian stretch (Debian 9)の golang を 1.7 から 1.8 にした
% cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 9 (stretch)" NAME="Debian GNU/Linux" VERSION_ID="9" VERSION="9 (stretch)"
golang の sort.Slice は 1.8 から導入されたので 1.8 にします。
Debian のパッケージ golang のバージョンは 1.7 なので 1.8 をインストールするためには golang-1.8 をインストールします。パッケージ名にバージョン番号が書かれているというだけ。
% aptitude install golang-1.8
go はこんな感じでリンクされているので
% ls -l /usr/bin/go* lrwxrwxrwx 1 root root 20 12月 28 2016 /usr/bin/go -> ../lib/go-1.7/bin/go lrwxrwxrwx 1 root root 23 12月 28 2016 /usr/bin/gofmt -> ../lib/go-1.7/bin/gofmt lrwxrwxrwx 1 root root 7 5月 10 2017 /usr/bin/gold -> ld.gold -rwxr-xr-x 1 root root 3497864 11月 13 2016 /usr/bin/golint
リンクしなおします。
% rm /usr/bin/go % rm /usr/bin/gofmt % ln -s /usr/lib/go-1.8/bin/go /usr/bin/go % ln -s /usr/lib/go-1.8/bin/gofmt /usr/bin/gofmt
% go version go version go1.8.1 linux/amd64
2018-01-13 :-)
_ [マジンガーZ]劇場版 マジンガーZ INFINITY を見ました
@イオンシネマ 港北ニュータウン
今日から公開です。マジンガーZは見たことがないんですがプロデューサーが金丸P(ポッピンQのひと)だったので見てきました。じゅうぶん楽しめました。
いちおうネタバレの改行
神にも悪魔にもなれる
「神にも悪魔にもなれる」というセリフは、元祖マジンガーZから続くメッセージのようです。本作品でも使われます。つまり人類が宇宙最強のロボット(マジンガーZやインフィニティ)を手に入れたときにどう振る舞うのか、という話題です。これについて、本作品ではロボットだけでなく、科学技術についてのメッセージだと受け止めることができます。戦力として宇宙最強のマジンガーZ、地球のインフラとなった光子力、人智を超えた神の力とも言えるインフィニティ。それらを人類がどう扱うのかが試されています。正解するカド です。
リサの覚悟
ありきたりですが、ラストシーンは「涙なしには語れない」です。
リサは感情を持ったアンドロイドで、且つインフィニティを操作する鍵ともいえる存在です。
劇中で語られますが、インフィニティが発動する「ゴラーゴン」により、もしかしたらあり得たかもしれない可能性の数々である宇宙が示されます。「世界線」(シュタインズゲート)です。そのうちの 1 つの宇宙として、「愛」の世界が示されます。その世界は兜甲児、弓さやか、リサが家族となり平和に暮らすという世界です。そして兜甲児は、インフィニティの力を司るリサから「(現在の)この世界は生かすに値する世界か?」と問われます。その返答は「肯定」でした。返答の選択肢としては、現在の世界のほかに、先程見せられたリサが家族となる平和な世界も含まれたでしょう。しかし兜甲児は、リサが家族となるその世界を否定し、現在の世界を肯定します。そしてリサも「同じ答えを考えていた」と言います。つまりリサ自身も兜甲児の家族となる世界を、その愛で溢れる世界を否定するわけです。もうこの時点で目から汗がダバアでした。
この場面では、アンドロイドとはいえ人類と同じ考えが出来るリサという存在が描かれます。感情を持ったアンドロイドとはいえ劇中ではまだ自分の感情と行動を処理しきれていないような描写もあるんですが、ラストのこのシーンでは完全に人類と同じ考えを持つわけです。科学技術はいずれアンドロイドに感情を持たせることができる、という希望が示されました。そして希望が示されたと同時に、感情を持つアンドロイドは人類と同じ選択をする悲しさも描かれています。
次はもっとうまくやる
Dr.ヘルを倒したあと再び平和になったときに弓さやかが記者会見で記者たちから「光子力は危険なのではないか?」「人類に光子力は扱えないのではないか?」等と問い詰められたときに弓さやか返答したのが「次はもっとうまくやる」です。科学のプロセスとして
- 仮説
- 実施
- 検証
というループがあります。その科学の仮説検証ループを踏まえてのセリフです。今回の事件により学習したので次はもっとうまくやる、ということです。ウェルナー・ロックスミス(プラネテス)と同じことを言ってます。笑ってしまった。
2018-01-14 :-)
_ 買い物などをしました
乗用車に乗って(乗らない乗用車とは とは)移動してたんですが帰路は西日が目に入りモーレツに眩しくて眩しくて夏。
_ ビックカメラへ行きました
PS4 を触ろうとしたんですがゲーム以外なにもできませんでした。
2018-01-16 :-)
_ [twitter][ruby]筋トレしたら褒めてくれるだけの twitter ボット
https://github.com/miwarin/himawari
お疲れさまです
— 向日葵 (@_himawari_h) 2018年1月16日
2018-01-18 :-)
_ ららぽーと横浜の Japan PIE Week!! でパイを食べました
スイーツだけじゃなくて肉などのパイもありました。お昼にどうぞ。けっこうおなかいっぱいになりました。
_ [OpenBSD][golang]golang の Stat_t
Go 言語仕様よく知らないんだけど、C.hugahoge と書いておくとそのビルドシステムにおける型 hogehoge を参照するらしい。
https://github.com/golang/go/blob/master/src/syscall/types_openbsd.go#L119
type Stat_t C.struct_stat
なので、たとえば以下のように書いておくと
https://github.com/moby/moby/blob/master/pkg/system/stat_openbsd.go
func fromStatT(s *syscall.Stat_t) (*StatT, error) { return &StatT{size: s.Size, mode: uint32(s.Mode), uid: s.Uid, gid: s.Gid, rdev: uint64(s.Rdev), mtim: s.Mtim}, nil }
struct stat のメンバー変数 mtime は time_t であることを前提とした書き方だと思うんだけど、OpenBSD の stat(2) の man には timespec の型が書かれてるのであるが、
https://man.openbsd.org/stat.2
struct timespec st_atim; /* time of last access */ struct timespec st_mtim; /* time of last data modification */ struct timespec st_ctim; /* time of last file status change */
実装では ifdef してるのでコンパイル時に time_t が選択されてるということかな。
https://github.com/openbsd/src/blob/master/sys/sys/stat.h
#if __POSIX_VISIBLE >= 200809 || __BSD_VISIBLE struct timespec st_atim; /* time of last access */ struct timespec st_mtim; /* time of last data modification */ struct timespec st_ctim; /* time of last file status change */ #else time_t st_atime; /* time of last access */ long st_atimensec; /* nsec of last access */ time_t st_mtime; /* time of last data modification */ long st_mtimensec; /* nsec of last data modification */ time_t st_ctime; /* time of last file status change */ long st_ctimensec; /* nsec of last file status change */ #endif /* __POSIX_VISIBLE >= 200809 || __BSD_VISIBLE */
2018-01-19 :-)
2018-01-21 :-)
_ [プリキュア][プリキュアアラモード]プリキュアアラモード 48話を見ました
ラストバトルでした。多様性を認めるという話題でした。「好き」は一人一人異なるし、異なることを肯定するし、その一人一人の「好き」を否定しない。劇中で語っていたか忘れましたがたぶん「嫌い」についてもキュアホイップは否定しないと思います。
ところで、劇場版マジンガーZで Dr.ヘルは「人類は多様性があるし、正義は一人一人異なる。ゆえに争いが起きる。だから人類を滅ぼす」と言っていました。それに対し兜甲児は「だが肯定する」と、多様性があることを肯定しました(リサも同じ考えであることを言っていた)。Dr.ヘルは多様性を否定し、しかし主人公 兜甲児は多様性を肯定しました。
奇しくも同じ時期に同じ東映作品で「多様性」というテーマが描かれました。
次期プリキュア HUGっと!プリキュア のサイトを見ると「なんでもできる!なんでもなれる!」と書いてあります。プリキュアアラモードで一人一人異なることを肯定しました。次のプリキュアでは一人一人がどのような生き方をしてもよいし、どのような人間になってもよいし、それを肯定する。というテーマなのでしょうか。
2018-01-22 :-)
_ [NetBSD][golang][システムコール]golang システムコール IoctlGetWinsize とか
ローカル
$(GOPATH)/src/github.com/docker/docker/vendor/golang.org/x/sys/unix
リポジトリ
https://github.com/moby/moby/tree/master/vendor/golang.org/x/sys/unix
syscall_netbsd.go や syscall_openbsd.go はあるがメソッド定義は無い。
% cd ~/work/go/src/github.com/docker/docker/vendor/golang.org/x/sys/unix % grep IoctlGetWinsize * syscall_darwin.go:func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { syscall_freebsd.go:func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { syscall_linux.go:func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { syscall_solaris.go:func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
https://github.com/moby/moby/blob/master/vendor/golang.org/x/sys/unix/README.md
これによると
- ビルドシステムを作り直している最中だよ。現在ビルドシステムは 2 つあるよ。古いビルドシステムと新しいビルドシステムがあるよ。
- 古いビルドシステム (GOOS != "Linux" || GOARCH == "sparc64")
- システムにあるヘッダファイル(.h)から go ファイルを生成するよ。でもそれはシステム依存のファイルが生成されるのであまりよろしくないよ
- 生成するには mkall.sh( $(GOPATH)/go/src/golang.org/x/sys/unix/mkall.sh )を使うよ
- 新しいビルドシステム (GOOS == "Linux" && GOARCH != "sparc64")
- docker の仕組みを使うよ(よく分からん)
- mkall.go を使うよ( $(GOPATH)/src/golang.org/x/sys/unix/linux/mkall.go )。これは Linux のヘッダファイルやライブラリを用いてシステムコール番号やシステムコールの go ファイルを生成するよ
- syscall_${GOOS}.go は手で書いてるよ
2018-01-23 :-(
_ 似非労について
虚無を得た
_ 雪かきをした
ひとまず玄関周辺の雪を排除しました。晴れていたのでけっこう解けましたね。
_ import mackerel-agent-plugins v0.43.0
wip に追加しました。
2018-01-28 :-)
_ 一日じゅうぐったりしていました
今日も頭の頭痛が痛いので寝ていました。
_ [NetBSD][pkgsrc]wip
「ひとまず pkglint 的には OK なんだけど、どうすかね?と投げたら「悪くないがもっと草生やせ」とツッコミを貰ってからというもの Roland がすごい勢いで wip の細かいところをコミットし始めました。
Re: wip/mackerel-agent wip/mackerel-agent-plugins wip/ioping
2018-01-30 :-)
_ [ansible]ansible に入門した
2周遅れくらいですが。
ansible とは
- 構成管理ツールである
- サーバーを構築したり
- OSセットアップしたりユーザー追加したり
- といった各種操作ができる
- 冪等性(べきとうせい。読めなかった)がある
- 行った操作は必ず同じ結果となることが保証されている んだそうだ
- 例えば既にユーザーを追加してあるのに再度ユーザーを追加しようとしてもエラーとはならず ansible がよきに計らってくれる
- (useradd は成功すると 0 を返す。失敗すると非0 を返す)
- 主な構成
- インベントリ: 接続先ホストの情報を書く
- モジュール: 被管理ホストでおこなう各種操作(ユーザー追加とか)
- プレイブック: 被管理ホストでおこなう操作を手順として書いたファイル
ファイルとしては、インベントリとプレイブックを作成する。モジュールはプレイブック内に記述する。
とはいえ、最低限インベントリがあればいいらしい。
よちよち.ansible
「ansible 入門」でググると初っ端から Vagrant を使う前提だったりする記事がヒットして混乱したんだけど ansible についても仮想環境についても右も左も分からないような拙者にとっては Ansible ABC が最高のコンテンツでした。
ようするに「管理ホストが被管理ホストへ ssh 接続してイイ感じに操作する」というものらしい。基本的には以下のように操る。別に Vagrant 必須じゃなかった。物理ホストでもよかった。ただイイ感じ(とは?)にホストを使い捨てるなど仮想環境の利点を活かすときになったらまたそのときに考える。
「Ansible ABC」で腑に落ちたのは、最初に以下のように localhost 内で完結させる説明を書いていたこと。この説明で理解できた。
インストール
Installing the Control Machine に各種 OS やらパッケージでのインストール手順が書いてある。パッケージが無い OS (NetBSDのことだ) はがんばろう。オレはがんばらない。手元にたまたま Debian の Virtualbox があったので試してみました。インストール手順は上記ページ参照。
localhost で通信してみる
インストールしたら localhost どうしで通信してみる。いいですねー
% ansible localhost -m shell -a "uname -rsm" localhost | SUCCESS | rc=0 >> Linux 4.9.0-4-amd64 x86_64
この構成です。
被管理ホストに通信してみる
localhost 以外(後述)の被管理ホストについては FQDN をインベントリに書いておく必要がある。インベントリのファイルはデフォルトでは /etc/ansible/hosts のファイルである。任意のファイルを使いたい場合は -i オプションを指定し、ansible -i ファイル名 として実行すればよい。
[]
で括っておくとグループとして扱われる。グループを何に使うのかまだ分かってない。
たとえばこう。
[localnet] 192.168.1.30 ansible_user=USER ansible_ssh_pass=PASSWORD ansible_python_interpreter=/usr/pkg/bin/python2.7 192.168.1.35 ansible_user=USER ansible_ssh_pass=PASSWORD ansible_python_interpreter=/usr/local/bin/python2.7
こんな構成。
ssh の鍵を作成し、公開鍵を被管理ホストへコピーしておけば ansible_user や ansible_ssh_pass は不要(だと思う)けど、いまはなるべく単純な構成にしておきたいのでまだやらない。
ansible は、被管理ホストへ ssh 接続して、被管理ホスト上で python を実行する。python の PATH は /usr/bin/python にあることが前提となっている( How do I handle python pathing not having a Python 2.X in /usr/bin/python on a remote machine? )ので、それ以外の PATH に python がある場合は ansible_python_interpreter で指定する。
192.168.1.30 に接続してみる。いいですねー
% ansible 192.168.1.30 -m shell -a "uname -rsm" 192.168.1.30 | SUCCESS | rc=0 >> NetBSD 8.99.9 amd64
192.168.1.35 に接続してみる。いいですねー
% ansible 192.168.1.35 -m shell -a "uname -rsm" 192.168.1.35 | SUCCESS | rc=0 >> FreeBSD 11.1-RELEASE amd64
(おまけ)ssh 認証エラー
ssh 鍵も管理せず、インベントリに ansible_user も書いておかない場合、以下のようにエラーとなる。たんにログインできないだけなんだが、メッセージには「Permission denied」等と書いてあって何のヒントにもならない。
% ansible 192.168.1.30 -m shell -a "uname -rsm" The authenticity of host '192.168.1.30 (192.168.1.30)' can't be established. ECDSA key fingerprint is SHA256:Iz2lkIpdFNCtClHPBMzp8VKJWmCANlf3M7vqxmPqA9s. Are you sure you want to continue connecting (yes/no)? yes 192.168.1.30 | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: Warning: Permanently added '192.168.1.30' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,password,keyboard-interactive).\r\n", "unreachable": true }
(おまけ)デバッグ出力に改行コードが印字されるんですが
ansible コマンドのデバッグ出力するときは -vvvv をつければいいんだけど \r\n も印字されてしまい人間には読めない。なんだこれ。
% ansible 192.168.1.30 -m ping -vvvv ansible 2.4.2.0 config file = /etc/ansible/ansible.cfg configured module search path = [u'/home/rin/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/dist-packages/ansible executable location = /usr/bin/ansible python version = 2.7.13 (default, Nov 24 2017, 17:33:09) [GCC 6.3.0 20170516] Using /etc/ansible/ansible.cfg as config file setting up inventory plugins Parsed /etc/ansible/hosts inventory source with ini plugin Loading callback plugin minimal of type stdout, v2.0 from /usr/lib/python2.7/dist-packages/ansible/plugins/callback/__init__.pyc META: ran handlers Using module file /usr/lib/python2.7/dist-packages/ansible/modules/system/ping.py <192.168.1.30> ESTABLISH SSH CONNECTION FOR USER: rin <192.168.1.30> SSH: EXEC sshpass -d12 ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o User=rin -o ConnectTimeout=10 -o ControlPath=/home/rin/.ansible/cp/4095337cf6 192.168.1.30 '/bin/sh -c '"'"'echo ~ && sleep 0'"'"'' <192.168.1.30> (0, '/home/rin\n', 'OpenSSH_7.4p1 Debian-10+deb9u2, OpenSSL 1.0.2l 25 May 2017\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug1: /etc/ssh/ssh_config line 19: Applying options for *\r\ndebug1: auto-mux: Trying existing master\r\ndebug1: Control socket "/home/rin/.ansible/cp/4095337cf6" does not exist\r\ndebug2: resolving "192.168.1.30" port 22\r\ndebug2: ssh_connect_direct: needpriv 0\r\ndebug1: Connecting to 192.168.1.30 [192.168.1.30] port 22.\r\ndebug2: fd 3 setting O_NONBLOCK\r\ndebug1: fd 3 clearing O_NONBLOCK\r\ndebug1: Connection established.\r\ndebug3: timeout: 10000 ms remain after connect\r\ndebug1: key_load_public: No such file or directory\r\ndebug1: identity file /home/rin/.ssh/id_rsa type -1\r\ndebug1: key_load_public: No such file or directory\r\ndebug1: identity file /home/rin/.ssh/id_rsa-cert type -1\r\ndebug1: key_load_public: No such fi : :
(おまけ)localhost というホスト名
被管理ホストはインベントリに書く必要があるんだけど「localhost」だけは特別である。インベントリに書かなくてよい。ハードコーディングされてるため。
https://github.com/ansible/ansible/blob/devel/lib/ansible/inventory/data.py#L156
: # if host is not in hosts dict if matching_host is None and hostname in C.LOCALHOST: # might need to create implicit localhost matching_host = self._create_implicit_localhost(hostname) :
なお LOCALHOST は constants.py に定義されてる。ぽい
https://github.com/ansible/ansible/blob/devel/lib/ansible/constants.py#L96
LOCALHOST = ('127.0.0.1', 'localhost', '::1')