首页 > 解决方案 > Ansible - 使用来自 vars 的一个或多个参数运行 shell 命令

问题描述

这个标题可能不是最清楚的。我正在尝试使用 ansible 通过 shell 命令配置某些东西(没有用于此的模块),格式如下:

dsconf dirname backend index add --index-type arg1 --index-type arg2 --attr attr1 userRoot

让我感到困惑的是 --index-type 选项 - 它可能会使用不同的参数调用一次或多次。

我定义了以下变量:

indexes:
  - name: "attr1"
    indextype:
      - "arg1"
  - name: "attr2"
    indextype:
      - "arg1"
      - "arg2"

但是我不知道如何编写我的任务来处理 --index-type 的可变数量的参数。作为一个简单且明显错误的示例:

- command: "dsconf {{ host_name }} backend index add --reindex --index-type {{ item.indextype }} --attr {{ item.name }} userRoot"
  register: index
  with_items:
    - "{{ indexes }}"

这导致“--index-type [arg1, arg2]”。我需要以某种方式对每个参数重复 --index-type,例如“--index-type arg1 --index-type arg2”。

我找到了一些关于如何使用嵌套项和子元素通过内置函数解决此问题的好示例(例如此链接),但我不知道如何将其转换为 shell 命令。我还发现这个 stackoverflow 问题很接近,但是它将嵌套项本身作为参数加入,而不是使用嵌套项作为参数的参数并根据需要多次重复参数。

有什么好的方法可以做到这一点吗?我可能可以像这样在子元素列表中包含完整的参数和参数,然后像第二个示例一样加入:

  - name: "attr2"
    indextype:
      - "--index-type arg1"
      - "--index-type arg2"

但是,希望有一些更清洁的东西。将不胜感激任何想法。或者解释为什么我这样做完全错误,如果是这样的话。:-) 谢谢。

- - 编辑 - -

所以,是的,如下重构确实有效:

  - name: "attr1"
    parameters:
      - "--index-type arg1"
      - "--index-type arg1"


- command: "dsconf {{ host_name }} backend index add --reindex {{ item.parameters | join(' ') }} --attr {{ item.name }} userRoot"
  register: index
  with_items:
    - "{{ indexes }}"

我仍然对是否有某种方法可以按照最初的要求解决这个问题感兴趣,但如果需要,我当然可以使用这种方法。

标签: ansible

解决方案


问:为--index-type处理可变数量的参数

A:这就是Jinja的用途。例如

    - debug:
        msg: "{{ cmd_part1 }}{{ cmd_part2 }}{{ cmd_part3 }}"
      loop: "{{ indexes }}"
      vars:
        cmd_part1: "dsconf options"
        cmd_part3: " --attr {{ item.name }} userRoot"
        cmd_part2: |-
          {% for i in item.indextype %} --index-type {{ i }}{% endfor %}

给出(删节)

  msg: dsconf options --index-type arg1 --attr attr1 userRoot
  msg: dsconf options --index-type arg1 --index-type arg2 --attr attr2 userRoot

请参阅YAML 块样式


推荐阅读