Ansible role_path未定义错误

时间:2016-03-18 01:58:13

标签: ansible ansible-playbook

我有一个如下所示的任务文件:

- 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及更高版本,它应该填充相关角色的目录,但我明显错误地了解某些内容。

1 个答案:

答案 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的任务中,因为标记的用途是:触发一组有限的角色或剧本任务。