将参数传递给 Ansible 角色时出现变量未定义错误
Variable is undefined error when passing argument to Ansible roles
我是 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" }
更多speed_manager/defaults/main.yml
DNAME: ""
更多speed_manager/tasks/main.yml
---
- include: check.yml diskname={{DNAME}}
更多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”
你能指出我哪里出错了吗?这是否是错误?
在您的示例中,您只为任务 "Reading Variable".
定义了 dn
其他任务对 dn
.
一无所知
如果您希望dn
可用于后续任务,您可以使用:
- set_fact:
dn: "{{ diskname }}"
在 speed_manager/tasks/check.yml
而不是 dn
中使用 diskname
作为变量
或者在文件开头添加
- set_fact:
dn: "{{ diskname }}"
您实际上不需要为已经定义的变量使用不同的名称。
您可以更改您的任务以使用 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
我是 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" }
更多speed_manager/defaults/main.yml
DNAME: ""
更多speed_manager/tasks/main.yml
---
- include: check.yml diskname={{DNAME}}
更多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”
你能指出我哪里出错了吗?这是否是错误?
在您的示例中,您只为任务 "Reading Variable".
定义了 dn
其他任务对 dn
.
如果您希望dn
可用于后续任务,您可以使用:
- set_fact:
dn: "{{ diskname }}"
在 speed_manager/tasks/check.yml
而不是 dn
中使用 diskname
作为变量
或者在文件开头添加
- set_fact:
dn: "{{ diskname }}"
您实际上不需要为已经定义的变量使用不同的名称。
您可以更改您的任务以使用 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