在 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
我正在编写一个 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