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

Build a dynamic command from hosts in Ansible

我正在编写一个 Ansible 部署脚本以将 solr 节点连接到 运行 zookeeper 集合。 link zookeeper 的 solr 配置命令如下所示:

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

我想让命令尽可能动态 - 所以我想从我的清单文件中提取 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

这是我没有循环的 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]

关于如何使清单中的 zookeeper 主机数量动态变化的想法?

在您的循环中,您可以使用 loop controls of Jinja2:

来防止在最后一项之后出现逗号
{%- if not loop.last %}, {% endif -%}

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

{{ groups.zookeeper | join(":%d, " | format(zookeeper.port)) }}:{{ zookeeper.port }}

所以我们 join 你的数组元素与 port+ 逗号的胶水在一起。由于最后一个元素因此不会有 port,我们在第一个表达式后再次输出 port

只是补充说明:如果 SolrCloud 已经开始指向 ZooKeeper 集成,那么 solr create命令除了可以创建相应的Solr cores之外,还可以用来上传配置到ZooKeeper。

注意:如果你只是想上传文件到ZooKeeper,而不创建相应的Solr cores,那么你应该继续执行zkcli.sh,如示例所示问题。

在 SolrCloud 中创建核心并将配置上传到 ZooKeeper 的 Ansible 任务:

- name: create solr cores
  command: /opt/solr/bin/solr create -c {{ item }} -d /tmp/solr/{{ item }}
  with_items:
    - my_collection
    - another_collection
  become: yes
  become_user: solr

上述 Ansible 任务假设如下:

  • 可用的目录结构如下:

    /tmp/solr
    ├── my_collection
    │   └── conf
    │       ├── schema.xml
    ├── another_collection
    │   └── conf
    │       ├── schema.xml
    
  • Solr 分布被提取到 /opt/solr.

  • 用户solr在机器中启动了Solr。

另请参阅:

https://cwiki.apache.org/confluence/display/solr/Taking+Solr+to+Production

https://cwiki.apache.org/confluence/display/solr/Using+ZooKeeper+to+Manage+Configuration+Files