【问题标题】:Ansible looping over with_items $n timesAnsible 循环 with_items $n 次
【发布时间】:2019-12-27 01:07:12
【问题描述】:

我正在尝试编写一个 ansible 脚本,该脚本在同一个 mongo 服务器上的多个 db 上的多个集合上配置相同的 id。如何运行 with_items $n 次?

集合是已知的,并且 MongoDbs 配置了相同的名称

我最初尝试了一些使用 with_items 的方法。我想我应该能够使用 with_nested 但它似乎不喜欢我如何将我的 $n 格式化为一个列表。

- set_fact:
    mongo_list: "{{range(1, {{ number_devsims }} + 1) | list}}"

- name: Updating simid
  command: "mongo \"{{ mongo_db_name }}-{{ item[1] }}\" --eval 'db.{{ item[0] }}.update({}, {$set : {simid : \"{{ devsim_eng_simid }}\"}})'"
  with_nested:
    - ['engines', 'servers', 'simulations']
    - "{{ mongo_list}}"

理想情况下,我希望能够更新每个 mongo 的所有集合。比如

- set_fact:
    mongo_list: [1, 2]
TASK [devsim_data : Updating simid] *********************************************************************************
Wednesday 21 August 2019  10:42:51 -0700 (0:00:07.602)       0:00:37.450 ****** 
 [WARNING]: The loop variable 'item' is already in use. You should set the `loop_var` value in the `loop_control`
option for the task to something else to avoid variable collisions and unexpected behavior.

changed: [eco] => (item=['engines', 1])
changed: [eco] => (item=['engines', 2])
changed: [eco] => (item=['servers', 1])
changed: [eco] => (item=['servers', 2])
changed: [eco] => (item=['simulations', 1])
changed: [eco] => (item=['simulations', 2])

我的 set_fact 似乎遇到的错误是

TASK [devsim_data : set_fact] ***************************************************************************************
Wednesday 21 August 2019  10:50:40 -0700 (0:00:00.066)       0:00:17.668 ****** 
fatal: [eco]: FAILED! => {"msg": "template error while templating string: expected token ':', got '}'. String: {{range(1, {{ number_devsims }} + 1) | list}}"}

【问题讨论】:

    标签: ansible


    【解决方案1】:

    问题是您试图将 {{ 标记嵌套在另一个 Jinja 表达式中:

        mongo_list: "{{range(1, {{ number_devsims }} + 1) | list}}"
    

    由于您已经在 J​​inja 上下文中,嵌套的 {{...}} 是不必要的;这应该是:

        mongo_list: "{{range(1, number_devsims + 1) | list}}"
    

    有了这个修复,我认为其他一切都应该可以正常工作了。我将您的 command 任务包装在 debug 任务中以对其进行测试,如下所示:

    ---
    - hosts: localhost
      gather_facts: false
      vars:
        number_devsims: 2
        mongo_db_name: example
        devsim_eng_simid: example-eng-simid
      tasks:
        - set_fact:
            mongo_list: "{{range(1, number_devsims + 1) | list}}"
    
        - name: Updating simid
          debug:
            msg:
              command: "mongo \"{{ mongo_db_name }}-{{ item[1] }}\" --eval 'db.{{ item[0] }}.update({}, {$set : {simid : \"{{ devsim_eng_simid }}\"}})'"
          with_nested:
            - ['engines', 'servers', 'simulations']
            - "{{ mongo_list}}"
    

    这会导致:

    PLAY [localhost] *****************************************************************************************************************************************************************************************************************************************************************************
    
    TASK [set_fact] ******************************************************************************************************************************************************************************************************************************************************************************
    ok: [localhost]
    
    TASK [Updating simid] ************************************************************************************************************************************************************************************************************************************************************************
    ok: [localhost] => (item=['engines', 1]) => {
        "msg": {
            "command": "mongo \"example-1\" --eval 'db.engines.update({}, {$set : {simid : \"example-eng-simid\"}})'"
        }
    }
    ok: [localhost] => (item=['engines', 2]) => {
        "msg": {
            "command": "mongo \"example-2\" --eval 'db.engines.update({}, {$set : {simid : \"example-eng-simid\"}})'"
        }
    }
    ok: [localhost] => (item=['servers', 1]) => {
        "msg": {
            "command": "mongo \"example-1\" --eval 'db.servers.update({}, {$set : {simid : \"example-eng-simid\"}})'"
        }
    }
    ok: [localhost] => (item=['servers', 2]) => {
        "msg": {
            "command": "mongo \"example-2\" --eval 'db.servers.update({}, {$set : {simid : \"example-eng-simid\"}})'"
        }
    }
    ok: [localhost] => (item=['simulations', 1]) => {
        "msg": {
            "command": "mongo \"example-1\" --eval 'db.simulations.update({}, {$set : {simid : \"example-eng-simid\"}})'"
        }
    }
    ok: [localhost] => (item=['simulations', 2]) => {
        "msg": {
            "command": "mongo \"example-2\" --eval 'db.simulations.update({}, {$set : {simid : \"example-eng-simid\"}})'"
        }
    }
    
    PLAY RECAP ***********************************************************************************************************************************************************************************************************************************************************************************
    localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    

    【讨论】:

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