Ansible role_路径未定义错误

Ansible role_路径未定义错误,ansible,ansible-playbook,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 myS

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

- 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
- name: Drop mySQL data
  gather_facts: no
  hosts: imdb
  connection: local
  tags:
    - mysql-data-drop
  roles:
    - role: ../roles/mysql
我从一本剧本中引用它,看起来像这样:

- 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
- name: Drop mySQL data
  gather_facts: no
  hosts: imdb
  connection: local
  tags:
    - mysql-data-drop
  roles:
    - role: ../roles/mysql
我使用的是Ansible 1.9.4版,所以我认为
role\u path
应该是一个有效的变量

但当我运行playbook时,我得到以下输出:

TASK: [Drop schemas] **************************************************
fatal: [imdb] => One or more undefined variables: 'role_path' is undefined

我不明白为什么
role\u path
没有定义。根据,对于版本1.8和更高版本,它似乎应该填充有问题角色的目录,但我显然在某些方面弄错了。

我没有看到您使用任何角色。在不研究Ansible代码的情况下,
role\u path
显然是在角色中定义的。但是,包含角色的文件并不能使其在角色的上下文中运行

如果您的包含是有意的,则不会定义
角色路径
。您可以尝试将其与include一起设置,如下所示:

tasks:
  - include: ../roles/mysql/tasks/drop-perf.yml
    role_path: ../roles/mysql
这可能有效,也可能无效,因为
role\u path
仍然是一个神奇的变量,因此可能无法手动更改

如果你真的想包括这个角色,那么你需要像这样定义你的剧本:

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

感谢您的回复。这很有道理。我将尝试重新编写它,使其更符合ansible最佳实践。我主要只是复制粘贴了一些其他的东西,这些东西做了同样的事情,但是用正确的方式重写应该不会太糟糕。