質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.65%

ansible環境変数参照時にエラー

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 5,391

shigel

score 9

前提・実現したいこと

Ansibleで環境変数を参照してコマンドを実行したいのですが、 group_vars/all で宣言している変数参照時にエラーが出てしまいます。
書式などに初歩的なミスがありますでしょうか?
ご協力のほど、よろしくお願いいたします。

発生している問題・エラーメッセージ

the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'unicode object' has no attribute 'gid'

The error appears to have been in '/vagrant/ansible/roles/test/tasks/main.yml': line 7, column 3, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


- name: create groups debug
  ^ here
[root@localhost ansible]# ansible-playbook test.yml --limit=vagrant --connection=local -vvvv
Using /vagrant/ansible/ansible.cfg as config file
Loading callback plugin default of type stdout, v2.0 from /usr/lib/python2.7/site-packages/ansible/plugins/callback/__init__.pyc

PLAYBOOK: test.yml *************************************************************
1 plays in test.yml

PLAY [all] *********************************************************************

TASK [setup] *******************************************************************
Using module file /usr/lib/python2.7/site-packages/ansible/modules/core/system/setup.py
<127.0.0.1> ESTABLISH LOCAL CONNECTION FOR USER: root
<127.0.0.1> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1479267155.59-84022657785728 `" && echo ansible-tmp-1479267155.59-84022657785728="` echo $HOME/.ansible/tmp/ansible-tmp-1479267155.59-84022657785728 `" ) && sleep 0'
<127.0.0.1> PUT /tmp/tmpKJgvMU TO /root/.ansible/tmp/ansible-tmp-1479267155.59-84022657785728/setup.py
<127.0.0.1> EXEC /bin/sh -c 'chmod u+x /root/.ansible/tmp/ansible-tmp-1479267155.59-84022657785728/ /root/.ansible/tmp/ansible-tmp-1479267155.59-84022657785728/setup.py && sleep 0'
<127.0.0.1> EXEC /bin/sh -c '/usr/bin/python /root/.ansible/tmp/ansible-tmp-1479267155.59-84022657785728/setup.py; rm -rf "/root/.ansible/tmp/ansible-tmp-1479267155.59-84022657785728/" > /dev/null 2>&1 && sleep 0'
ok: [127.0.0.1]

TASK [test : create groups debug] **********************************************
task path: /vagrant/ansible/roles/test/tasks/main.yml:2
ok: [127.0.0.1] => (item=user_groups) => {
    "invocation": {
        "module_args": {
            "var": "user_groups"
        },
        "module_name": "debug"
    },
    "item": "user_groups",
    "user_groups": [
        {
            "gid": 1111,
            "name": "hoge"
        },
        {
            "gid": 1112,
            "name": "foo"
        },
        {
            "gid": 1113,
            "name": "bar"
        }
    ]
}

TASK [test : create groups debug] **********************************************
task path: /vagrant/ansible/roles/test/tasks/main.yml:7
fatal: [127.0.0.1]: FAILED! => {
    "failed": true,
    "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'unicode object' has no attribute 'gid'\n\nThe error appears to have been in '/vagrant/ansible/roles/test/tasks/main.yml': line 7, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: create groups debug\n  ^ here\n"
}
           to retry, use: --limit @/vagrant/ansible/test.retry

PLAY RECAP *********************************************************************
127.0.0.1                  : ok=2    changed=0    unreachable=0    failed=1

[root@localhost ansible]#

該当のソースコード

  • 構成
$ tree
.
├── ansible.cfg
├── group_vars/
│   └── all
├── hosts/
├── host_vars/
├── roles/
│   └── test/
│       ├── defaults/
│       ├── files/
│       ├── handlers/
│       ├── meta/
│       ├── tasks/
│       │   └── main.yml
│       ├── templates/
│       └── vars/
└── test.yml
$ cat ansible.cfg
[defaults]
hostfile = ./hosts
#private_key_file = ~/.vagrant.d/insecure_private_key
host_key_checking = False
deprecation_warnings=False
$ cat group_vars/all
user_groups:
 - { name: 'hoge', gid: 1111 }
 - { name: 'foo', gid: 1112 }
 - { name: 'bar', gid: 1113 }
$ cat hosts
[vagrant]
127.0.0.1 ansible_connection=local
$ cat roles/test/tasks/main.yml
---
- name: create groups debug
  debug: var={{ item }}
  with_items: user_groups
  tags: user

- name: create groups debug
  debug: var={{ item.gid }}
  with_items: user_groups
  tags: user

$ cat test.yml
---
- hosts: all
  remote_user: root
  roles:
    - test

$

試したこと

以前、ほぼこれと同様のコードで上手く動作しておりましたが、いつの間にか動作しなくなっておりました。
Linux OS上で yum update をおこなっているので、以前と比較するとpythonやansibleのバージョンは上がっております。

変数書式を {{ item.gid }} から {{ item.['gid'] }} に変更しましたが、こちらも同じエラーが出てしまいました。

補足情報(言語/FW/ツール等のバージョンなど)

  • Mac OSX
  • Vagrant 1.8.1
  • VirtualBox 5.0.26
  • CentOS Linux release 7.2.1511 (Core)
  • Python 2.7.5
  • ansible 2.2.0.0
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • nagaetty

    2016/11/16 12:29

    デバッグのために-vvvvオプションをつけて実行してみてはいかがでしょうか?

    キャンセル

  • shigel

    2016/11/16 12:37 編集

    `-vvvv` に変更してエラーメッセージを修正しました。これと言って気になるメッセージが今のところ見当たらないです。

    キャンセル

回答 1

checkベストアンサー

+2

with_itemsに変数名をそのまま記載するのが少し前から非推奨になって、version2.2でより厳しくなったんだと思います。

以下、2.1系で似たようなPlaybookを用意したときのwarningです。
2.2になった時点で、これが削除されていると見るのがいいかと。

  [DEPRECATION WARNING]: Using bare variables is deprecated. Update your playbooks so that the environment value uses the full variable syntax ('{{user_groups}}').
This feature will be removed in a
future release. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.

解決策としては、WARNINGの指示に従い、'{{ 変数名 }}'の書式に変えるのが一番だと思います。

- name: create groups debug
  debug: var={{ item }}
  with_items: '{{ user_groups }}'
  tags: user

- name: create groups debug
  debug: var={{ item.gid }}
  with_items: '{{ user_groups }}'
  tags: user

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/16 13:45 編集

    attakkeiさん、回答ありがとうございます!
    下記コードで無事通りました。
    ansible 2.1でWarning、ansible 2.2でエラーになったんですね。
    たまたま `ignore_errors: True` にしてたのでWarningをスルーしてました。

    助かりました。

    - 修正後

    ```bash
    # cat roles/test/tasks/main.yml
    ---
    - name: create groups debug 1
    debug: var={{ item }}
    with_items:
    - '{{ user_groups }}'
    tags: user

    - name: create groups debug 2
    debug: var={{ item.gid }}
    with_items:
    - '{{ user_groups }}'
    tags: user

    - name: create groups debug 3
    debug: var={{ item['gid'] }}
    with_items:
    - '{{ user_groups }}'
    tags: user
    ```

    - 実行結果

    ```
    [root@localhost ansible.2]# ansible-playbook test.yml --limit=vagrant --connection=local -vvvv
    Using /vagrant/ansible.2/ansible.cfg as config file
    Loading callback plugin default of type stdout, v2.0 from /usr/lib/python2.7/site-packages/ansible/plugins/callback/__init__.pyc

    PLAYBOOK: test.yml *************************************************************
    1 plays in test.yml

    PLAY [all] *********************************************************************

    TASK [setup] *******************************************************************
    Using module file /usr/lib/python2.7/site-packages/ansible/modules/core/system/setup.py
    <127.0.0.1> ESTABLISH LOCAL CONNECTION FOR USER: root
    <127.0.0.1> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1479270996.91-45035124739952 `" && echo ansible-tmp-1479270996.91-45035124739952="` echo $HOME/.ansible/tmp/ansible-tmp-1479270996.91-45035124739952 `" ) && sleep 0'
    <127.0.0.1> PUT /tmp/tmp24Vhdx TO /root/.ansible/tmp/ansible-tmp-1479270996.91-45035124739952/setup.py
    <127.0.0.1> EXEC /bin/sh -c 'chmod u+x /root/.ansible/tmp/ansible-tmp-1479270996.91-45035124739952/ /root/.ansible/tmp/ansible-tmp-1479270996.91-45035124739952/setup.py && sleep 0'
    <127.0.0.1> EXEC /bin/sh -c '/usr/bin/python /root/.ansible/tmp/ansible-tmp-1479270996.91-45035124739952/setup.py; rm -rf "/root/.ansible/tmp/ansible-tmp-1479270996.91-45035124739952/" > /dev/null 2>&1 && sleep 0'
    ok: [127.0.0.1]

    TASK [test : create groups debug 1] ********************************************
    task path: /vagrant/ansible.2/roles/test/tasks/main.yml:2
    ok: [127.0.0.1] => (item={u'gid': 1111, u'name': u'hoge'}) => {
    "<type 'dict'>": "VARIABLE IS NOT DEFINED!",
    "invocation": {
    "module_args": {
    "var": {
    "gid": 1111,
    "name": "hoge"
    }
    },
    "module_name": "debug"
    },
    "item": {
    "gid": 1111,
    "name": "hoge"
    }
    }
    ok: [127.0.0.1] => (item={u'gid': 1112, u'name': u'foo'}) => {
    "<type 'dict'>": "VARIABLE IS NOT DEFINED!",
    "invocation": {
    "module_args": {
    "var": {
    "gid": 1112,
    "name": "foo"
    }
    },
    "module_name": "debug"
    },
    "item": {
    "gid": 1112,
    "name": "foo"
    }
    }
    ok: [127.0.0.1] => (item={u'gid': 1113, u'name': u'bar'}) => {
    "<type 'dict'>": "VARIABLE IS NOT DEFINED!",
    "invocation": {
    "module_args": {
    "var": {
    "gid": 1113,
    "name": "bar"
    }
    },
    "module_name": "debug"
    },
    "item": {
    "gid": 1113,
    "name": "bar"
    }
    }

    TASK [test : create groups debug 2] ********************************************
    task path: /vagrant/ansible.2/roles/test/tasks/main.yml:8
    ok: [127.0.0.1] => (item={u'gid': 1111, u'name': u'hoge'}) => {
    "1111": "1111",
    "invocation": {
    "module_args": {
    "var": "1111"
    },
    "module_name": "debug"
    },
    "item": {
    "gid": 1111,
    "name": "hoge"
    }
    }
    ok: [127.0.0.1] => (item={u'gid': 1112, u'name': u'foo'}) => {
    "1112": "1112",
    "invocation": {
    "module_args": {
    "var": "1112"
    },
    "module_name": "debug"
    },
    "item": {
    "gid": 1112,
    "name": "foo"
    }
    }
    ok: [127.0.0.1] => (item={u'gid': 1113, u'name': u'bar'}) => {
    "1113": "1113",
    "invocation": {
    "module_args": {
    "var": "1113"
    },
    "module_name": "debug"
    },
    "item": {
    "gid": 1113,
    "name": "bar"
    }
    }

    TASK [test : create groups debug 3] ********************************************
    task path: /vagrant/ansible.2/roles/test/tasks/main.yml:14
    ok: [127.0.0.1] => (item={u'gid': 1111, u'name': u'hoge'}) => {
    "1111": "1111",
    "invocation": {
    "module_args": {
    "var": "1111"
    },
    "module_name": "debug"
    },
    "item": {
    "gid": 1111,
    "name": "hoge"
    }
    }
    ok: [127.0.0.1] => (item={u'gid': 1112, u'name': u'foo'}) => {
    "1112": "1112",
    "invocation": {
    "module_args": {
    "var": "1112"
    },
    "module_name": "debug"
    },
    "item": {
    "gid": 1112,
    "name": "foo"
    }
    }
    ok: [127.0.0.1] => (item={u'gid': 1113, u'name': u'bar'}) => {
    "1113": "1113",
    "invocation": {
    "module_args": {
    "var": "1113"
    },
    "module_name": "debug"
    },
    "item": {
    "gid": 1113,
    "name": "bar"
    }
    }

    PLAY RECAP *********************************************************************
    127.0.0.1 : ok=4 changed=0 unreachable=0 failed=0
    ```

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.65%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる