-- 2020.10.09 更新
对于cassandra 集群,seeds 不建议设置整个集群,每个机房至少两台即可
对yaml语法不是很熟,记录下动态生成变量的方法。只是自己找到的,如果有更好的方法就更好了🙏
生成 "host:port,host:port,..."
类型文件
例如:
PXC 变量wsrep_cluster_address
需要列出集群中的节点,
cassandra 的seeds 需要写集群的种子节点
以及redis-cluster 创建集群的时候也要使用到,这些都要我们动态生成了
话不多说,直接上code吧
- 在template中的用法
# 需要定义个空列表
{% set cluster_address=[] -%}
{% set pxc_hosts = groups.pxc %}
{% for host in pxc_hosts -%}
{% set pxc_ip = hostvars[host].inventory_hostname | default(host) -%}
{% set pxc_port = group_port -%}
{% set _ = cluster_address.append("%s:%s" % (pxc_ip, pxc_port)) -%}
# 基本和python语法一样,只是注意写法就可以了🐶
{% endfor -%}
# 使用的时候
wsrep_cluster_address = 'gcomm://{{ cluster_address | join(',') }}'
# 使用join 过滤器 可以生成',' 分隔的字符串
- 在playbook 中的用法
# 直接生成列表,免去定义的一步,再根据需要转为字符串
set_fact:
cluster_address: |-
[
{% set pxc_hosts = groups.pxc %}
{% for host in pxc_hosts -%}
{% set pxc_ip = hostvars[host].inventory_hostname | default(host) -%}
{% set pxc_port = group_port -%}
"{{ pxc_ip }}:{{ pxc_port }}"
{% endfor -%}
]
>使用的时候
{{ cluster_address | join(',') }}' # 使用join 过滤器可生成',' 分隔的字符串,分隔符自己定义
在playbook 中的用法也是相同,我找到的用的都是循环的方法 ,根据循环或者判断就能生成自己的需求了