包含具有指定变量的任务 (Ansible)

Including a task with specified variables (Ansible)

我刚开始学习ansible。我已经设置了一个测试存储库 here.

我正在尝试包含一个任务,并将消息作为变量传递给任务,该消息应该 'printed'。我的剧本 (site.yml) 的结构如下:

- name:  default playbook
  tasks:
    - { include: tasks/timestamp.yml, themsg='starting tasks' }

tasks/timestamp.yml是:

---
- debug: msg="{{ themsg }} ' @ ' {{ ansible_date_time['time'] }}."

当我 运行 使用 ansible-playbook site.yml 时,我得到错误:

TASK: [debug msg="{{ themsg }} 'current time:' {{     ansible_date_time['time'] }}."] *** fatal: [localhost] => One or more undefined variables: 'themsg' is undefined

我一直在使用 official documentation 作为参考,看起来这应该可行。有什么建议吗?

您正在做一些稍微不寻常的事情(包括任务,而不是使用剧本中的角色)并且遇到了一些常见的语法错误。

您找到了正确的文档;它给出了包含任务文件的以下内容:

- include: wordpress.yml wp_user=timmy
- { include: wordpress.yml, wp_user: timmy, ssh_keys: [ 'keys/one.txt', 'keys/two.txt' ] }

很遗憾,您将这些组合在一起:

- { include: tasks/timestamp.yml, themsg='starting tasks' }

这是摆脱困境的方法。这些都可以工作:

- { include: tasks/timestamp.yml, themsg: 'starting tasks' }
- include: tasks/timestamp.yml themsg='starting tasks'

在第一个示例中,我将 = 更改为冒号。在第二个示例中,我删除了大括号并删除了逗号。

将 "task include" 升级为 "role include" 真的很容易。将 tasks/timestamp.yml 移动到 roles/timestamp/tasks/main.yml,然后将其作为角色而不是任务包括在内:

roles:
  - { role: timestamp, themsg: "starting tasks" }

你会因此获得一些理智 - 一些可移植性、先决条件和处理程序的挂钩等。