将参数传递给Ansible角色时,变量是未定义的错误

时间:2017-04-19 08:39:01

标签: ansible ansible-role

我是ansible角色的新手,这就是我正在做的事情。

更多site.yml

---

- hosts: user1_checkserverlist
  user: user1
  roles:
    - { role: speed_manager, DNAME: "/u" }

- hosts: oracle_checkserverlist
  user: oracle
  roles:
    - { role: speed_manager, DNAME: "/tmp" }

more speed_manager / defaults / main.yml

DNAME: ""

more speed_manager / tasks / main.yml

---

- include: check.yml diskname={{DNAME}}

more speed_manager / tasks / check.yml

---

   - name: ==== Reading Variable ====
     ping:
     vars:
         dn: "{{ diskname }}"

   - name: ====Sync  to remote hosts ====

     synchronize: src="/web/roles/speed_manager/files/" dest="/tmp/mohtt/"

   - name: ====Execute shell=============

     shell: /tmp/mohtt/fixwebserver.sh {{ dn }} chdir=/tmp/mohtt

这就是我执行角色的方式

ansible-playbook -vvv site.yml -i /web/hostfiles/myhost.txt

错误:

TASK [check_bk_speed_manager : ====Execute shell=============] *****************
task path: /web/roles/speed_manager/tasks/check.yml:25
fatal: [myserver.com]: FAILED! => {"failed": true, "msg": "'dn' is undefined"}
fatal: [myserver.com]: FAILED! => {"failed": true, "msg": "'dn' is undefined"}
        to retry, use: --limit @check_bk_speed.retry

我期待dn的值为" / u"

你能指出我哪里出错了,这是不是一个错误?

3 个答案:

答案 0 :(得分:1)

在您的示例中,您只为任务"阅读变量" 定义dn
其他任务对dn一无所知。

如果您希望dn可用于后续任务,您可以使用:

- set_fact:
    dn: "{{ diskname }}"

答案 1 :(得分:0)

speed_manager/tasks/check.yml而不是dn中使用diskname作为变量 或者在文件的开头添加

- set_fact:
  dn: "{{ diskname }}"

答案 2 :(得分:0)

您实际上不需要为已定义的变量使用其他名称。

您可以将任务更改为使用diskname任务中传递的include

- name: ====Execute shell=============
  shell: /tmp/mohtt/fixwebserver.sh {{ diskname }} chdir=/tmp/mohtt

实际上,如果这是整个代码,您可以使用DNAME

- name: ====Execute shell=============
  shell: /tmp/mohtt/fixwebserver.sh {{ DNAME }} chdir=/tmp/mohtt

仅包括:

- include: check.yml