我想在文件中添加一些行(它们是/etc/ntp.conf中的ntp服务器)。不幸的是,出于各种原因,我无法使用模板。 所以我有一个像这样的变量:
<mat-form-field class="full-width-container">
<mat-chip-list #chipList (click)="openPanel(chipAutoComplete, chipInput)">
<mat-chip *ngFor="let chip of chips" [selectable]="true" [removable]="true" (removed)="removeChip(chip)">
{{chip[displayPropertyKey]}}
<mat-icon matChipRemove *ngIf="true">cancel</mat-icon>
</mat-chip>
<div [formGroup]="chipFormGroup">
<input [placeholder]="inputPlaceholder" [matChipInputFor]="chipList" [matChipInputAddOnBlur]="true" [matAutocomplete]="chipAutoComplete"
formControlName="inputFormControl" (click)="openPanel(chipAutoComplete, chipInput)" (keyup)="chooseFirstItem($event.key, chipAutoComplete)"
#chipInput />
</div>
</mat-chip-list>
<mat-autocomplete #chipAutoComplete="matAutocomplete" (optionSelected)="addChip(chipInput)">
<mat-option *ngFor="let option of filteredOptions | async" [value]="option[displayPropertyKey]">
<span>{{option[displayPropertyKey]}}</span>
</mat-option>
</mat-autocomplete>
那里有2个名单; dns和ntp。每个列表都包含一个区域字典 - &gt;服务器映射。
我想迭代(在这种情况下是ntp列表)列表,依次为每个ntp服务器添加一行。我发现循环结构的loop_control参数,它允许我在ntp_servers列表中设置一个偏移量。
这是我试图循环遍历字典中列表元素的一次尝试:
vars:
- dns:
- "{ 'region': 'syd', 'dns_servers': ['1.2.3.4', '2.3.4.5', '3.4.5.6' ] }"
- "{ 'region': 'lon', 'dns_servers': ['2.2.2.2', '3.3.3.3', '4.4.4.4' ] }"
- "{ 'region': 'ny', 'dns_servers': ['5.5.5.5', '6.6.6.6', '7.7.7.7' ] }"
- ntp:
- { 'region': 'syd', 'ntp_servers': ['syd1.pool.ntp.org','syd2.pool.ntp.org','syd2.pool.ntp.org'] }
- { 'region': 'lon', 'ntp_servers': ['lon1.pool.ntp.org','lon2.pool.ntp.org','lon2.pool.ntp.org'] }
- { 'region': 'ny', 'ntp_servers': ['ntp1.pool.ntp.org','ntp2.pool.ntp.org','ntp2.pool.ntp.org'] }
(顺便说一句,您如何使用&#39; i&#39;作为循环计数器变量?)
我知道使用模板会更容易,而lineinfile是一个反模式,但我受到我无法控制的问题的限制。
我遇到的问题是我想循环遍历ntp_servers数组的项目,但我的循环是在ntp字典上循环。我尝试了各种组合,但怀疑我使用了错误的数据结构 - 有人可以提出建议吗?
由于
答案 0 :(得分:1)
我发现vars
结构存在问题。您应该从ntp
和dns
变量声明中删除连字符:
瓦尔: NTP: ..... DNS: .....
此外,dns
列表元素中的双引号将元素视为字符串,ntp
看起来不错。
在列表中获取ntp
变量的所有9个ntp服务器,因此您可以在循环中处理,您可以使用表达式(随意删除sum(start=[])
和最终{{1转换,然后添加它们以查看我使用它们的原因):
list
示例剧本:
"{{ ntp | map(attribute='ntp_servers') | list | sum(start=[]) | list }}"
输出:
- hosts: localhost
gather_facts: false
vars:
ntp:
- { 'region': 'syd', 'ntp_servers': ['syd1.pool.ntp.org','syd2.pool.ntp.org','syd2.pool.ntp.org'] }
- { 'region': 'lon', 'ntp_servers': ['lon1.pool.ntp.org','lon2.pool.ntp.org','lon2.pool.ntp.org'] }
- { 'region': 'ny', 'ntp_servers': ['ntp1.pool.ntp.org','ntp2.pool.ntp.org','ntp2.pool.ntp.org'] }
tasks:
- name: print
debug:
msg: "{{ item }}"
with_items:
- "{{ ntp | map(attribute='ntp_servers') | list | sum(start=[]) | list }}"