给任务中的 `item` 引用一个 Ansible dict 别名?
Alias an Ansible dict reference to `item` inside task?
我有一个如下所示的 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
)。
是否可以将此字典别名为 item
或任务中类似的更短名称,或者我是否应该停止尝试对事物进行如此多的微优化?
好吧,这看起来有点奇怪,但我可以通过将它包装在 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 到 return String 类型。
并不是您要找的答案,但您自己已经解决了,所以:您还可以通过在同一级别缩进 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 }}"
我有一个如下所示的 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
)。
是否可以将此字典别名为 item
或任务中类似的更短名称,或者我是否应该停止尝试对事物进行如此多的微优化?
好吧,这看起来有点奇怪,但我可以通过将它包装在 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 到 return String 类型。
并不是您要找的答案,但您自己已经解决了,所以:您还可以通过在同一级别缩进 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 }}"