【问题标题】:Calling roles in a loop using dictionaries from an array as vars使用数组中的字典作为变量在循环中调用角色
【发布时间】:2020-11-26 21:47:31
【问题描述】:

我的问题与here 发布的问题有些相似,但这并不能完全回答它。 在我的情况下,我有一个包含多个 vars: 条目的数组,我在调用某个角色时会循环这些条目。下面的例子说明了这个想法:

some_vars_file.yml:

redis_config:
  - vars:
      redis_version: 6.0.6
      redis_port: 6379
      redis_bind: 127.0.0.1
      redis_databases: 1
  - vars:
      redis_version: 6.0.6
      redis_port: 6380
      redis_bind: 127.0.0.1
      redis_databases: 1

playbook.yml:

...

- name: Install and setup redis
  include_role:
    name: davidwittman.redis
  with_dict: "{{ dictionary }}"
  loop: "{{ redis_config }}"
  loop_control:
    loop_var: dictionary

...

据我了解,这应该只是在每次迭代时设置以 vars 节点开头的字典,但不知何故它没有。有没有机会让这样的事情起作用,还是我真的必须在角色调用时重新定义所有属性,使用with_items 填充它们?

【问题讨论】:

    标签: ansible roles provisioning ansible-role


    【解决方案1】:

    给定角色

    shell> cat roles/davidwittman_redis/tasks/main.yml
    - debug:
        var: dictionary
    

    删除with_dict。剧本

    shell> cat playbook.yml
    - hosts: localhost
      vars_files:
        - some_vars_file.yml
      tasks:
        - name: Install and setup redis
          include_role:
            name: davidwittman_redis
          loop: "{{ redis_config }}"
          loop_control:
            loop_var: dictionary
    

    给予

    shell> ansible-playbook playbook.yml
    
    PLAY [localhost] **********************************************
    
    TASK [Install and setup redis] ********************************
    
    TASK [davidwittman_redis : debug] *****************************
    ok: [localhost] => 
      dictionary:
        vars:
          redis_bind: 127.0.0.1
          redis_databases: 1
          redis_port: 6379
          redis_version: 6.0.6
    
    TASK [davidwittman_redis : debug] ******************************
    ok: [localhost] => 
      dictionary:
        vars:
          redis_bind: 127.0.0.1
          redis_databases: 1
          redis_port: 6380
          redis_version: 6.0.6
    

    问:“可能存在与角色调用中的可变人口有关的问题吗?”

    答:是的。它可以。见Variable precedencevars_files 是优先级 14。任何更高的优先级都将覆盖它。决定如何构造数据并可选择使用include_vars(优先级18)。例如

    shell> cat playbook.yml
    - hosts: localhost
      tasks:
        - include_vars: some_vars_file.yml
        - name: Install and setup redis
          include_role:
            name: davidwittman_redis
          loop: "{{ redis_config }}"
          loop_control:
            loop_var: dictionary
    

    最终,命令行 --extra-vars 将覆盖所有之前的设置

    shell> ansible-playbook playbook.yml --extra-vars "@some_vars_file.yml"
    

    问:“也许无法通过外部字典直接设置 vars 部分?”

    A:当然可以。这个答案中的例子清楚地证明了这一点。

    【讨论】:

    • 虽然我可以确认,添加了变量,但它似乎仍然忽略它们。角色调用中可能存在与可变人口相关的问题吗?
    • 感谢您的解释。澄清一下,我指的不是变量优先级,而是通过循环设置 vars 部分时(可能的)不匹配。也许无法通过外部字典直接设置 vars 部分?我尝试运行的任何符号变化都会导致角色使用其默认值或 ansible 抱怨滥用语法。
    • 无法以这种方式进行。请打开一个新问题并提出mcve
    • 我可能对自己的解释有点糟糕。我想回答的总体问题仍然是您已经回答的问题。但即使它看起来很有希望,但它并没有导致使用两组不同变量的角色。这就是为什么我提出了那些关于还有什么可能导致这个问题的想法。如果我们能够为我在问题中给出的代码提供一个工作示例,我仍然会很高兴。
    • 当然。这也是我的意图。打开一个新问题并将其设为mcve。我不会继续猜测。正确阅读mcve,1)使其最小化(例如,不需要复杂的Redis结构,简单的key: val1将达到目的;创建新的空角色以进行测试并进行最小的更改;发布)2)使其完整(如果有一条错误消息,发布它)3)使其可验证(发布所有详细信息(最少!但全部)以重现您的问题)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2011-11-25
    • 2019-02-21
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多