2015-02-07 49 views
2

我有一个Ansible任务,看起来像这样:Alias一个Ansible字典引用任务中的`item`?

- 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" 

不过,我在想,如果我可以做的任务更具可读性和在复制代码片段时,通过在任务中将字典参考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如果我尝试)。

是否有可能将此词典的别名缩写为item或类似于任务内部的短语,还是应该停止尝试微观优化这么多内容?

回答

1

不是真的你要找的,但答案你自己解决它已经无论如何,所以:

- 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 }}" 
:您可以通过缩进在同一水平上的 cron参数所有,这样也提高可读性
1

好吧,这看起来有点怪异,但是我能够得到它通过在神社模板包裹它,并把它的单元素列表内的工作:

- 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类型。