このセミナーに影響を受けています。
20171006_lightwell_AnsibleSeminer.pdf - Google ドライブ
簡単なPlaybookはこちら。
VPC名を必要とするCFnテンプレートと、kintoneから未作成のレコード一覧を検索して順番に作成するPlaybookです。
gist8158eb21c029f6d9d2d7ef38caa12573
以下、ハマったことなど諸々。
ダブルクォーテーションの有無
エラーメッセージ:
found unacceptable key (unhashable type: 'AnsibleMapping')
対処法:
親切にエラーメッセージに - {{ foo }}から- "{{ foo }}"にするといいよって書いてくれてました。
エラーメッセージ:
The task includes an option with an undefined variable.
対処法:
with_itemsにも、with_items: "{{candidates_in_json.json.records}}"というふうにダブルクォーテーションが必要です。Jinja2記法を使う時は必要なんだと思います。
JSONのキーにドルマーク(ドル記号)(dollar sign)
エラーメッセージ :
template error while templating string: unexpected char u'$'
対処法:
item.$key → item['$key']
他の変数を用いて新たな変数を宣言
エラーメッセージ:
recursive loop detected in template string
原因:
a { x:1, y:"{{ a.x }}" }
のような、部分的であっても再帰になる構造がダメらしい。
うまい回避策あったら教えてください。
POST/PUTのボディにJSON
エラーメッセージ:
typeError: unhashable type
対処法:
uriモジュールの引数に、body_format:jsonを追加した。
エラーメッセージ:
Unexpected templating type error occurred on ({{ candidates_in_text.stdout | from_json }}): expected string or buffer
原因:
uriモジュールの結果が文字列だと思ってたので、registerしてset_factでJSONに変換しようとしていたのですが、すでにJSONになってました。
(return_contentを設定したため、良い感じのJSONになっていた)
エラーメッセージ:
kintone REST APIのエラーメッセージですが。
"<h1>Bad Message 400</h1><pre>reason: Illegal character SPACE=' '</pre>",
原因:
スペースをそのままURLに使ってました。
対処法:
urlencodeフィルタがあったので、URLの&query=より後をurlencodeフィルタにかけました。
今回URLに直接クエリを指定してしまいましたが、クエリを設定できる属性はあるんでしょうか?
AWSの認証情報
エラーメッセージ:
botocore.exceptions.NoCredentialsError: Unable to locate credentials
原因:
テンプレートにCredentialを設定してなかったです。
AWSのアクセスキー・シークレットキーはAWXの認証情報に登録しました。設定したパスワードはおそらく実行時に環境変数に設定され※1、Playbookに何も書かなくていいので便利です。kintoneのAPIトークンもこれを使ったほうが良さそうです。
認証情報は暗号化して保存されます※1がもちろん復号は可能なので、定期実行でない場合はvaultに設定して、ジョブ実行時のsurveyでマスタパスワードを入力し、復号する方がセキュアだと思います。しかし手間です。。。
手間がかからずセキュアな方法があったらどなたか教えてください。
VMの時刻の遅れ
エラーメッセージ:
Signature expired: is now earlier than error : InvalidSignatureException
原因:
時刻が4日前になってました。
対処法:
NTPで時刻を同期します。
chronyコマンドがnot found だったのでこちらのページを参考にさせていただきました
djeeno.log: ntpdateコマンドの代わりにchronyで強制同期
ジョブ実行のトリガー
n分ごとのジョブ実行でなく
kintoneに登録→webhook→クラウドハブ→AWX にしていきたいところですが、
クラウドハブはZapierのようなサービスか自分でサーバ立てるしかない※2ので
そのコストを考えると最長n分の遅れを許容したほうが場合によっては良い選択です。
webhookを直接AWXに持っていけたら最高ですが。
他にいい方法あったら教えてください。