Think Simple Enjoy Life

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の変数ファイルも読み込まれている気がします。名前を変えたときに動かないといった問題を回避するために、注意しましょう。

※要調査ですが…