首页 > 解决方案 > ansible-playbook with_flattened 迁移到循环

问题描述

我正在尝试将我以前使用的旧剧本迁移with_flattenedloop.

我试图遵循ansible 用户指南,但没有这样做。

这是我的 host_var:

- hosts: example.com
  vars:
    - configureddisks:
        - xvdb
        - xvdc
    - btrfsdisks:
        - xvdf
        - xvdg

我的原始任务及其输出如下:

# Task
- debug:
    msg: "{{ item }}"
    with_flattened:
      - "{{ configureddisks | select('defined') | list }}"
      - "{{ btrfsdisks | select('defined') | list }}"


# ansible-playbook output
TASK [devices : debug] **********************************************************************************************************************************************************************************************************************
ok: [example.com] => (item=xvdb) => {
    "msg": "xvdb"
}
ok: [example.com] => (item=xvdc) => {
    "msg": "xvdc"
}
ok: [example.com] => (item=xvdf) => {
    "msg": "xvdf"
}
ok: [example.com] => (item=xvdg) => {
    "msg": "xvdg"
}

我的新任务及其输出如下:

# Task
- debug:
    msg: "{{ item }}"
    loop:
      - "{{ configureddisks | select('defined') | list | flatten }}"
      - "{{ btrfsdisks | select('defined') | list | flatten }}"


# ansible-playbook output
ok: [example.com] => (item=[u'xvdb', u'xvdc']) => {
    "msg": [
        "xvdb",
        "xvdc"
    ]
}
ok: [example.com] => (item=[u'xvdf', u'xvdg']) => {
    "msg": [
        "xvdf",
        "xvdg"
    ]
}

我应该如何使用循环编写新任务,使其具有与旧任务相同的输出?

标签: ansible

解决方案


你误用了flatten过滤器。当你写这个:

loop:
  - "{{ configureddisks | select('defined') | list | flatten }}"
  - "{{ btrfsdisks | select('defined') | list | flatten }}"

过滤器flatten没有效果:您提供的输入(两次)已经展平的列表。您需要将过滤器应用于生成的列表,但不是这样做,您可以重写您的表达式,以便不需要展平:

- debug:
    msg: "{{ item }}"
  loop: "{{ (configureddisks + btrfsdisks) | select('defined') | list }}"

如果你真的想走“建立一个列表并将其展平”的路线,那可能看起来像:

- debug:
    msg: "{{ item }}"
  loop: >-
    {{
    (
    (configureddisks | select('defined') | list)  +
    (btrfsdisks | select('defined') | list)
    )|flatten
    }}

请注意,为了便于阅读,我已将其分布在多行中,但您也可以轻松地将其全部写在一行上:

  loop: "{{ ((configureddisks | select('defined') | list)  + (btrfsdisks | select('defined') | list))|flatten }}"

推荐阅读