在Ansible中从主机构建动态命令

tkn*_*man 2 command solr jinja2 ansible apache-zookeeper

我正在使用Ansible部署脚本将solr节点连接到正在运行的zookeeper集成。将solr配置链接到zookeeper的命令如下所示:

solr/scripts/cloud-scripts/zkcli.sh -zkhost 33.33.33.30:2181,33.33.33.31:2181,33.33.33.32:2181 -cmd upconfig -confdir solr/solr/collection1/conf -confname solr_config
Run Code Online (Sandbox Code Playgroud)

我想使命令尽可能动态-因此我想从清单文件中拉出Zookeeper主机。我知道总是3时就可以执行此操作,但是我希望命令根据列表中的数量进行调整。我已经尝试使用Ansibles with命令-但我无法使它正常工作,因为在最后一个主机之后我不需要逗号。

这是我的清单文件:

[zookeeper]
33.33.33.30
33.33.33.31
33.33.33.32

[solr]
33.33.33.33
33.33.33.34
33.33.33.35
Run Code Online (Sandbox Code Playgroud)

这是我没有循环的Ansible任务:

- name: SOLR | Upload Configs To Zookeeper
  command: "{{ solr.home }}/scripts/cloud-scripts/zkcli.sh -zkhost {{groups.zookeeper[0] }}:{{ zookeeper.port }}, {{ groups.zookeeper[1] }}:{{ zookeeper.port }}, {{ groups.zookeeper[2] }}:{{ zookeeper.port }} -cmd upconfig -confdir {{ solr.home }}/solr/{{ solr.collection_name }}/conf -confname {{ solr.config_name }}"
  when: inventory_hostname == groups.solr[0]
Run Code Online (Sandbox Code Playgroud)

以及如何使这种动态变化与清单中的Zookeeper主机数量有关?

udo*_*dan 5

在循环中,您可以使用Jinja2循环控件防止最后一项后面的逗号:

{%- if not loop.last %}, {% endif -%}
Run Code Online (Sandbox Code Playgroud)

但这是一个更性感的解决方案:

{{ groups.zookeeper | join(":%d, " | format(zookeeper.port)) }}:{{ zookeeper.port }}
Run Code Online (Sandbox Code Playgroud)

因此,我们join将您的数组元素与port+逗号粘合在一起。由于最后一个元素将因此没有port,因此我们port在第一个表达式之后再次输出。