Ansible role_path 未定义错误

Ansible role_path undefined error

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

- 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 是未定义的。根据 ansible docs,对于 1.8 及更高版本,它似乎应该填充有问题的角色的目录,但我显然弄错了某些东西。

我没有看到你使用任何角色。如果不查看 Ansible 代码,很明显 role_path 是在角色中定义的。但是,包含角色的文件不会使其成为角色上下文中的 运行。

如果您的包含是有意的,role_path 将不会被定义。您可以尝试自己将其与 include 一起设置,如下所示:

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