【问题标题】:ansible select first found from dictansible select首先从dict中找到
【发布时间】:2019-07-18 19:26:42
【问题描述】:

我有以下 ansible 剧本。 fX 适用于框架版本 1,2 或 3。当文件的版本 >= fX 时,它应该使用最后找到的类型方法选择该框架版本,因此我们不会得到多个结果。

file_version >= 1.2.0 应该给出 f2,file_version >= 2.2.0 应该给出 f3。

- name: select version
  hosts: all
  connection: local
  become: false
  vars:
    version:
      f3: '2.2.0'
      f2: '1.2.0'
      f1: '1.0.0'
  tasks:
    - name: debug loop
      debug:
        msg: "{% for F in version %}{% if file_version | version_compare(version[F],'>=') %}{{ F }} {% endif %}{% endfor %}"


ansible-playbook case.yml -i 127.0.0.1, -vv -e file_version='1.5.0'

Ansible 应该为我决定,我应该使用框架版本 1.2.0 还是 {{ f2 }}。但这当然会产生两个匹配项

f1 f2

如何取出最后找到的版本?有没有更优雅的方法来做到这一点?

【问题讨论】:

  • "first found from dict" 具有误导性。该项目不必在字典中。

标签: loops dictionary ansible


【解决方案1】:

试试下面

- name: select version
  hosts: localhost
  connection: local
  become: false
  vars:
    version:
      f3: '1.2.0'
      f2: '2.2.0'
      f1: '1.0.0'
  tasks:
    - name: Set found to 0
      set_fact:
        found: '0'
    - name: Set the last value returned from the sorted dict
      set_fact:
        found: "{{ item.1 }}"
      loop: "{{ version | dictsort(False,'value') }}"
      when: "{{ file_version | version_compare(item.1,'>=') }}"
    - name: debug
      debug:
        msg: "{{ found }}"

【讨论】:

    【解决方案2】:

    恕我直言,没有返回列表中元素位置的函数。下面的剧本分三步完成

    - hosts: localhost
      vars:
        file_version: '1.5.0'
        version:
          f3: '2.2.0'
          f2: '1.2.0'
          f1: '1.0.0'
      tasks:
        - set_fact:
            versions: "{{ version.values() + [ file_version ] }}"
        - set_fact:
            frameworks: "{{ frameworks|default({})|combine({item: index}) }}"
          loop: "{{ versions|sort }}"
          loop_control:
            index_var: index
        - set_fact:
            framework: "f{{ frameworks[file_version] }}"
        - debug:
            var: framework
        - debug:
            msg: "{{ version[framework] }}"
    

    给予

    "framework": "f2"
    "msg": "1.2.0"
    

    filter_plugins/list_methods.py简化玩法

    - hosts: localhost
      vars:
        file_version: '1.5.0'
        version:
          f3: '2.2.0'
          f2: '1.2.0'
          f1: '1.0.0'
      tasks:
        - set_fact:
            versions: "{{ version.values() + [ file_version ] }}"
        - set_fact:
           index: "{{ versions|sort|list_index(file_version) }}"
        - set_fact:
            framework: "f{{ index }}"
        - debug:
            var: framework
        - debug:
            msg: "{{ version[framework] }}"
    

    给出相同的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多