Ansible lineinfile with list to set ntp servers

时间:2018-05-14 06:18:32

标签: loops ansible

我想在文件中添加一些行(它们是/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字典上循环。我尝试了各种组合,但怀疑我使用了错误的数据结构 - 有人可以提出建议吗?

由于

1 个答案:

答案 0 :(得分:1)

我发现vars结构存在问题。您应该从ntpdns变量声明中删除连字符:

瓦尔:   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 }}"