ansible中的混合循环
Mixed cycling loops in ansible
我继承了一个ansible角色(我没有控制权),这个角色是在集群中安装一个redis。
为此,我必须在硬编码 defaults/main.yml 中提供一个看起来像这样的变量:
r_cluster:
- "192.168.0.2:6380 192.168.0.1:6379"
- "192.168.0.3:6380 192.168.0.2:6379"
- "192.168.0.1:6380 192.168.0.3:6379"
所以,我的目标是构建这样一个变量,不是硬编码的,而是从我的主机文件中提取的。
另一方面,我配置了主机组:
[mygroup]
redis1 ansible_host=192.168.0.1 ...
redis2 ansible_host=192.168.0.2 ...
redis3 ansible_host=192.168.0.3 ...
棘手的部分是通过这种循环从这个组中构建一个像 "r_cluster" 的变量!
我最接近的是:
- name: define my hosts list
set_fact: h_item="{{ hostvars[item]['ansible_fqdn'] }}:6380 {{ hostvars[item]['ansible_fqdn'] }}:6379"
with_items: "{{groups['mygroup']}}"
register: h_result
- name: transform it into the final r_cluster
set_fact: r_cluster="{{ h_result.results | map(attribute='ansible_facts.h_item') | list }}"
输出:
"r_cluster": [
"192.168.0.1:6380 192.168.0.1:6379",
"192.168.0.2:6380 192.168.0.2:6379",
"192.168.0.3:6380 192.168.0.3:6379"
]
当然,IP 并没有在输出中循环。
我没有找到任何 "item+1",或循环 "from the second element and ending to the first element",...
有没有办法做到这一点,而不是构建一个完整的算法(在 yaml 中做起来不是很方便)?
我不认为我可以使用{% %}来构建代码,因为这似乎只允许在模板中使用,而模板在这里无关紧要,我必须构建一个变量(供合作伙伴使用角色)。
您可以在 group-vars 中明确定义从属节点,而不是通过 IP 循环。
[mygroup]
redis1 ansible_host=192.168.0.1 slave_host=192.168.0.3
redis2 ansible_host=192.168.0.2 slave_host=192.168.0.1
redis3 ansible_host=192.168.0.3 slave_host=192.168.0.2
您可以在循环中使用的变量:
- name: define my hosts list
set_fact: h_item="{{ hostvars[item]['ansible_fqdn'] }}:6380 {{ hostvars[item]['slave_host'] }}:6379"
with_items: "{{groups['mygroup']}}"
register: h_result
我继承了一个ansible角色(我没有控制权),这个角色是在集群中安装一个redis。
为此,我必须在硬编码 defaults/main.yml 中提供一个看起来像这样的变量:
r_cluster:
- "192.168.0.2:6380 192.168.0.1:6379"
- "192.168.0.3:6380 192.168.0.2:6379"
- "192.168.0.1:6380 192.168.0.3:6379"
所以,我的目标是构建这样一个变量,不是硬编码的,而是从我的主机文件中提取的。
另一方面,我配置了主机组:
[mygroup]
redis1 ansible_host=192.168.0.1 ...
redis2 ansible_host=192.168.0.2 ...
redis3 ansible_host=192.168.0.3 ...
棘手的部分是通过这种循环从这个组中构建一个像 "r_cluster" 的变量!
我最接近的是:
- name: define my hosts list
set_fact: h_item="{{ hostvars[item]['ansible_fqdn'] }}:6380 {{ hostvars[item]['ansible_fqdn'] }}:6379"
with_items: "{{groups['mygroup']}}"
register: h_result
- name: transform it into the final r_cluster
set_fact: r_cluster="{{ h_result.results | map(attribute='ansible_facts.h_item') | list }}"
输出:
"r_cluster": [
"192.168.0.1:6380 192.168.0.1:6379",
"192.168.0.2:6380 192.168.0.2:6379",
"192.168.0.3:6380 192.168.0.3:6379"
]
当然,IP 并没有在输出中循环。
我没有找到任何 "item+1",或循环 "from the second element and ending to the first element",...
有没有办法做到这一点,而不是构建一个完整的算法(在 yaml 中做起来不是很方便)?
我不认为我可以使用{% %}来构建代码,因为这似乎只允许在模板中使用,而模板在这里无关紧要,我必须构建一个变量(供合作伙伴使用角色)。
您可以在 group-vars 中明确定义从属节点,而不是通过 IP 循环。
[mygroup]
redis1 ansible_host=192.168.0.1 slave_host=192.168.0.3
redis2 ansible_host=192.168.0.2 slave_host=192.168.0.1
redis3 ansible_host=192.168.0.3 slave_host=192.168.0.2
您可以在循环中使用的变量:
- name: define my hosts list
set_fact: h_item="{{ hostvars[item]['ansible_fqdn'] }}:6380 {{ hostvars[item]['slave_host'] }}:6379"
with_items: "{{groups['mygroup']}}"
register: h_result