如何在Ansible剧本中循环浏览类似的vars文件

时间:2019-05-30 19:28:40

标签: ansible

我需要创建一个单一的剧本,它将在单个目录中循环访问多个vars文件,并在其余的API POST中单独使用每个配置。

理想情况下,具有以下vars文件...

/my/vars/dir
  - my_pen.yml
      pen:
        color: "blue"

  - her_pen.yml
      pen:
        color: "red"

  - his_pen.yml
      pen:
        color: "green"

...我的剧本将为每支笔执行POST。不幸的是,所有文件都包含相同对象类型的配置,因此include_vars任务将仅保留“ his_pen”的配置。

我已经可以使用find获取目录中所有文件的列表:

- name: "find config files"
  find:
    paths: /path/to/config/files
    patterns: '*.yml'
  register: config_files

我有一个可以执行POST的任务:

- name: Do post
  uri:
    url: "{{ rest_api_endpoint }}"
    method: POST
    user: "{{ username }}"
    password: "{{ password }}"
    body: "{{ pen }}"
    body_format: json
    return_content: yes
    status_code: 200
  register: post_result

现在我只需要融合两者。这可能吗?我无法更改文件结构,因此必须使用适当的文件。

有想法吗?

1 个答案:

答案 0 :(得分:0)

首先创建的列表,然后循环该列表。下面的游戏

- set_fact:
    pens: "{{ pens|default([]) + [ lookup('file', item)|from_yaml ] }}"
  loop: "{{ lookup('fileglob', 'vars/*.yml', wantlist=True) }}"
- debug:
    msg: "{{ item }}"
  loop: "{{ pens }}"

给予(节略):

ok: [localhost] => (item={'pen': {'color': u'blue'}}) => {
    "msg": {
        "pen": {
            "color": "blue"
        }
    }
}
ok: [localhost] => (item={'pen': {'color': u'green'}}) => {
    "msg": {
        "pen": {
            "color": "green"
        }
    }
}
ok: [localhost] => (item={'pen': {'color': u'red'}}) => {
    "msg": {
        "pen": {
            "color": "red"
        }
    }
}