我正在开发一个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
我想让命令尽可能动态 - 所以我想从我的库存文件中提取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主机数量?
答案 0 :(得分:4)
在循环中,您可以使用loop controls of Jinja2
阻止最后一项之后的逗号{%- if not loop.last %}, {% endif -%}
但这是一个更性感的解决方案:
{{ groups.zookeeper | join(":%d, " | format(zookeeper.port)) }}:{{ zookeeper.port }}
所以我们join
你的数组元素和port
+逗号的粘合剂。由于最后一个元素不会有port
,因此我们会在第一个表达式后再次输出port
。
答案 1 :(得分:1)
只是旁注:如果 SolrCloud 已经开始指向 ZooKeeper 整体,那么 solr create 命令可以用于除了创建相应的Solr核心外,还要将配置上传到ZooKeeper。
注意:如果您只想将文件上传到ZooKeeper,而不创建相应的Solr核心,那么您应该继续执行 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