我有一个如下所示的任务文件:
- name: Drop schemas
mysql_db: state=import name=mysql target={{ role_path }}/files/schemas/drop-imdb-perf.sql login_user={{ MYSQL_ROOT_USER }} login_password={{ MYSQL_ROOT_PWD }} login_host={{ inventory_hostname }}
我从一个看起来像这样的剧本中调用它:
- name: Drop mySQL data
gather_facts: no
hosts: imdb
connection: local
tags:
- mysql-data-drop
tasks:
- include: ../roles/mysql/tasks/drop-perf.yml
我使用的是Ansible 1.9.4版,所以我认为role_path
应该是一个有效的变量。
但是当我运行剧本时,我得到了这个输出:
TASK: [Drop schemas] **************************************************
fatal: [imdb] => One or more undefined variables: 'role_path' is undefined
我无法弄清楚为什么role_path
未定义。根据{{3}},似乎对于版本1.8及更高版本,它应该填充相关角色的目录,但我明显错误地了解某些内容。
答案 0 :(得分:3)
我没有看到你使用任何角色。在不查看Ansible代码的情况下,role_path
在角色中定义似乎是显而易见的。但是,包含角色的文件并不会使其在角色的上下文中运行。
如果您的意图是打算,则role_path
无法定义。你可以尝试自己设置它像这样包括:
tasks:
- include: ../roles/mysql/tasks/drop-perf.yml
role_path: ../roles/mysql
这可能有效或无效,因为role_path
仍然是一个神奇的变量,因此可能无法手动更改。
如果你真的打算包含这个角色,那么你需要像这样定义你的剧本:
- name: Drop mySQL data
gather_facts: no
hosts: imdb
connection: local
tags:
- mysql-data-drop
roles:
- role: ../roles/mysql
但我的猜测是,您尝试只运行该角色的单个任务文件,而不是整个角色。但是你在那里尝试做的事情似乎是违背最佳做法的。我的建议是将标记mysql-data-drop
移动到文件drop-perf.yml
的任务中,因为标记的用途是:触发一组有限的角色或剧本任务。