Ansibleここがわからないよ
Ansibleを使っていてこまったこと、わかりにくかったこと
個人的な備忘です。Ansibleという決まったフレームワークにのることで、いろいろと自動でやってくれるのですが、その分何が自動で、何が自動じゃないのかわからないと混乱します。自分がハマったことをまとめておきたいと思います。
※ 随時更新
/group_varsにallファイルをおくと、すべてのグループを対象に変数を設定される
ここの変数どこで定義されているねん、っと思った。
なんでもかんでもdry-runすりゃよいってもんじゃない
なんでもかんでもdry-runすりゃいいってもんじゃない(モジュールによっては、dry-runのときに処理がskipされるからうごかないよ)。
例:プロンプトに出した値を、変数にぶっこんで処理する場合。これはdry-runで動かすと動かない。
\- hosts: all
gather\_facts: no
become: no
connection: local
vars\_files:
- 'group\_vars/secret\_key'
vars\_prompt:
- name: "instance\_suffix\_number"
prompt: "Please suffix number. e.x( instance tag name: 192abc.com\_nginxX or 192abc.com\_nginxXX )"
private: no
default: ""
tasks:
- name: $HOME register
command: echo $HOME
register: home
- name: debug
debug: var=home
- name: Set fact ansible ansible\_python\_interpreter
set\_fact: ansible\_python\_interpreter="{{ home.stdout }}/.pyenv/shims/python"
結果
> PLAY \[all\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
>
> TASK \[$HOME register\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* skipping: \[localhost\] => {"changed": false, "msg": "remote module (command) does not support check mode", "skipped": true}
>
> TASK \[debug\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* ok: \[localhost\] => { "home": { "changed": false, "msg": "remote module (command) does not support check mode", "skipped": true } }
>
> TASK \[Set fact ansible ansible\_python\_interpreter\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* fatal: \[localhost\]: FAILED! => {"failed": true, "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'dict object' has no attribute 'stdout'\\n\\nThe error appears to have been in '/Users/TomoakiTANAKA/Projects/eversense-develop/synced/ansible-eversense.co.jp/launch\_ec2.yml': line 25, column 7, but may\\nbe elsewhere in the file depending on the exact syntax problem.\\n\\nThe offending line appears to be:\\n\\n # see http://dev.classmethod.jp/server-side/use-ansible-create-ec2-instance/\\n - name: Set fact ansible ansible\_python\_interpreter\\n ^ here\\n"} to retry, use: --limit @/Users/TomoakiTANAKA/Projects/eversense-develop/synced/ansible-eversense.co.jp/launch\_ec2.retry
>
> PLAY RECAP \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* localhost : ok=1 changed=0 unreachable=0 failed=1
まぁ、registerした値がこうならこけちゃいますね…。dry-run時にスキップされないようにしないとだめみたいです。
参考:http://blog.kenjiskywalker.org/blog/2015/01/08/ansible-check-mode/
\- hosts: all
gather\_facts: no
become: no
connection: local
vars\_files:
- 'group\_vars/secret\_key'
vars\_prompt:
- name: "instance\_suffix\_number"
prompt: "Please suffix number. e.x( instance tag name: 192abc.com\_nginxX or 192abc.com\_nginxXX )"
private: no
default: ""
tasks:
- name: $HOME register
command: echo $HOME
register: home
always\_run : yes
- name: debug
debug: var=home
- name: Set fact ansible ansible\_python\_interpreter
set\_fact: ansible\_python\_interpreter="{{ home.stdout }}/.pyenv/shims/python"
limitする時の諸注意
--limitでhostを絞ることができますね。絞ると、自動的に(?)group_varsの変数ファイルも読み込まれている気がします。名前を変えたときに動かないといった問題を回避するために、注意しましょう。
※要調査ですが…