如何在 Ansible $var 中循环多次?
How to loop in Ansible $var number of times?
我想运行在Ansible中循环在一个变量中定义的次数。这有可能吗?
想象一个服务器列表,我们想在每个服务器上创建一些编号的文件。这些值在 vars.yml:
中定义
server_list:
server1:
name: server1
os: Linux
num_files: 3
server2:
name: server2
os: Linux
num_files: 2
我想要的输出是文件 /tmp/1
、/tmp/2
和 /tmp/3
是在服务器 1 上创建的,/tmp/1
和 /tmp/2
是在服务器 2 上创建的.我曾尝试使用 with_nested
、with_dict
和 with_subelements
编写剧本,但我似乎找不到任何方法:
- hosts: "{{ target }}"
tasks:
- name: Load vars
include_vars: vars.yml
- name: Create files
command: touch /tmp/{{ loop_index? }}
with_dict: {{ server_list[target] }}
loop_control:
loop_var: {{ item.value.num_files }}
如果我需要在每台服务器上创建 50 个文件,如果我要为每台服务器创建一个列表变量,列表中有 50 个项目,它只是数字 1 到 50,我可以看到如何做到这一点,但是那将是对 Ansible 的一种自我挫败的使用。
文档中有一章:Looping over Integer Sequences(ver 2.4)
你的任务:
- file:
state: touch
path: /tmp/{{ item }}
with_sequence: start=1 end={{ server_list[target].num_files }}
更新: Ansible 2.5 中的内容发生了变化。请参阅 sequence 插件的单独文档页面。
新的loop
语法是:
- file:
state: touch
path: /tmp/{{ item }}
loop: "{{ query('sequence', 'start=1 end='+(server_list[target].num_files)|string) }}"
不幸的是 sequence
只接受字符串格式的参数,因此传递给 query
的参数看起来很笨拙。
我想运行在Ansible中循环在一个变量中定义的次数。这有可能吗?
想象一个服务器列表,我们想在每个服务器上创建一些编号的文件。这些值在 vars.yml:
中定义server_list:
server1:
name: server1
os: Linux
num_files: 3
server2:
name: server2
os: Linux
num_files: 2
我想要的输出是文件 /tmp/1
、/tmp/2
和 /tmp/3
是在服务器 1 上创建的,/tmp/1
和 /tmp/2
是在服务器 2 上创建的.我曾尝试使用 with_nested
、with_dict
和 with_subelements
编写剧本,但我似乎找不到任何方法:
- hosts: "{{ target }}"
tasks:
- name: Load vars
include_vars: vars.yml
- name: Create files
command: touch /tmp/{{ loop_index? }}
with_dict: {{ server_list[target] }}
loop_control:
loop_var: {{ item.value.num_files }}
如果我需要在每台服务器上创建 50 个文件,如果我要为每台服务器创建一个列表变量,列表中有 50 个项目,它只是数字 1 到 50,我可以看到如何做到这一点,但是那将是对 Ansible 的一种自我挫败的使用。
文档中有一章:Looping over Integer Sequences(ver 2.4)
你的任务:
- file:
state: touch
path: /tmp/{{ item }}
with_sequence: start=1 end={{ server_list[target].num_files }}
更新: Ansible 2.5 中的内容发生了变化。请参阅 sequence 插件的单独文档页面。
新的loop
语法是:
- file:
state: touch
path: /tmp/{{ item }}
loop: "{{ query('sequence', 'start=1 end='+(server_list[target].num_files)|string) }}"
不幸的是 sequence
只接受字符串格式的参数,因此传递给 query
的参数看起来很笨拙。