ansible - 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 }}"
我仍然对是否有某种方法可以按照最初的要求解决这个问题感兴趣,但如果需要,我当然可以使用这种方法。
解决方案
问:“为--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 块样式。
推荐阅读
- javascript - Javascript 优化 - 从列表中查找 id 并将其映射到 Tree
- java - 创建名为“org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter”的bean时出错
- javascript - 如何重置 angular2 表单中定义的下拉列表的值?
- javascript - 使用 Canvas JS 在页面中渲染多个图表
- flutter - 如果用户尚未登录,如何显示登录页面,如果用户已登录,如何显示帐户页面
- c - lseek() 的偏移量和大块设备
- r - 到达时间间隔中绝对时间的 R 向量
- python - 列表匹配中大小写不同的计数问题
- windows - rtsp 到 youtube 流在 Windows 中不起作用
- c# - 删除密码保护方法后使用 System.Data.SQLite 在 C# 中加密和打开加密的 SQLite 数据库