别名一个Ansible dict引用任务中的`item`?

时间:2015-02-07 04:49:25

标签: ansible

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

- name: Create cron job to backup foo (default is every day at 2AM )
  cron: name="foo-database-backup"
    cron_file="foo-database-backup"
    minute="{{ foo.backup_policy.minute|default('0') }}"
    hour="{{ foo.backup_policy.hour|default('2') }}"
    day="{{ foo.backup_policy.day|default('*') }}"
    weekday="{{ foo.backup_policy.weekday|default('*') }}"
    month="{{ foo.backup_policy.month|default('*') }}"
    job="/bin/true"

使用相应的group_vars文件,如下所示:

---
foo:
  backup_policy:
    minute: 30
    hour: 3
    day: "*/3"

但是,我想知道在复制代码片段时是否可以使任务更具可读性且更不容易出错,方法是在任务中对foo.backup_policy dict引用item进行别名处理。我尝试使用with_items这样做:

- name: Create cron job to backup foo (default is every day at 2AM )
  cron: name="foo-database-backup"
    cron_file="foo-database-backup"
    minute="{{ item.minute|default('0') }}"
    hour="{{ item.hour|default('2') }}"
    day="{{ item.day|default('*') }}"
    weekday="{{ item.weekday|default('*') }}"
    month="{{ item.month|default('*') }}"
    job="/bin/true"
  with_items: foo.backup_policy

但由于with_items确实需要一个列表或集合(如果我尝试,我会收到错误with_items expects a list or a set),但这并不起作用(因为我非常期待)。

是否可以将此dict别名为item或更短的任务,或者我应该停止尝试对事物进行微观优化?

2 个答案:

答案 0 :(得分:1)

好的,这看起来很奇怪,但我能够通过将它包装在Jinja模板中并将其放在单个元素列表中来实现它:

- name: Create cron job to backup foo (default is every day at 2AM )
  cron: name="foo-database-backup"
    cron_file="foo-database-backup"
    minute="{{ item.minute|default('0') }}"
    hour="{{ item.hour|default('2') }}"
    day="{{ item.day|default('*') }}"
    weekday="{{ item.weekday|default('*') }}"
    month="{{ item.month|default('*') }}"
    job="/bin/true"
  with_items:
    - "{{ foo.backup_policy }}"

with_items: [ "{{ foo.backup_policy }}" ]也有效)

也许这是我对Ruby的熟悉,但我想我一直希望Jinja-interpolation-in-a-string能够返回一个String类型。

答案 1 :(得分:1)

不是你想要的答案,但是你已经自己解决了,所以:你可以通过在同一级别上缩进cron参数来提高可读性,如下所示:

- name: Create cron job to backup foo (default is every day at 2AM )
  cron: name="foo-database-backup"
        cron_file="foo-database-backup"
        minute="{{ item.minute|default('0') }}"
        hour="{{ item.hour|default('2') }}"
        day="{{ item.day|default('*') }}"
        weekday="{{ item.weekday|default('*') }}"
        month="{{ item.month|default('*') }}"
        job="/bin/true"
  with_items:
    - "{{ foo.backup_policy }}"