いろいろ備忘録

雑記です。

AWXでkintoneを定期的にフェッチしてCloudFormationを実行する

このセミナーに影響を受けています。

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を追加した。

 

from_jsonによる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になっていた)

 

uriモジュールのURLエンコード

エラーメッセージ:

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に持っていけたら最高ですが。

他にいい方法あったら教えてください。

 

※1...10. Credentials — Ansible Tower User Guide v3.3.1

※2...例えばこんなの GitHub - adnanh/webhook: webhook is a lightweight configurable incoming webhook server which can execute shell commands