1

我正在尝试通过使用 ansible 来管理 netplan。过去效果很好,我使用了以下模板:

network:
  version: 2
  renderer: networkd
  ethernets:
    {{ ansible_default_ipv4.interface }}:
      match:
          macaddress: {{ ansible_default_ipv4.macaddress }}
      dhcp4: false
      dhcp6: false
  bridges:
    br0:
      macaddress: {{ ansible_default_ipv4.macaddress }}
      interfaces:
        - {{ ansible_default_ipv4.interface }}
      dhcp4: no
      dhcp6: no
      addresses: [{{ ansible_default_ipv4.address }}/32]
      routes:
        - to: 0.0.0.0/0
          via: {{ ansible_default_ipv4.gateway }}
          on-link: true
      nameservers:
        addresses:
          - {{ DNS1 }}
          - {{ DNS2 }}
          - {{ DNS3 }}

现在我必须在路由部分添加几行:

...
  bridges:
    br0:
      routes:
        - to: 0.0.0.0/0
          via: {{ ansible_default_ipv4.gateway }}
          on-link: true
        - to: {{ IP1 }}/32
          scope: link
        - to: {{ IP2 }}/32
          scope: link
...

现在到了我挣扎的部分。

由于我的本地路由因主机而异,因此我不能使用静态模板。所以我尝试在主机 vars 文件中创建一个列表,其中包含一个 ips 列表。

ROUTES:
  - ip: "aaa.AAA.aaa.AAA"
  - ip: "bbb.BBB.bbb.BBB"
  - ip: "ccc.CCC.ccc.CCC"
  - ip :"...."
  - n

我想在循环这个列表时将此列表插入到我的 netplan 文件中。

但我不让它工作。你有什么提示或建议吗?提前谢谢

4

1 回答 1

0

你在 ROUTES 变量上添加循环

- name: vartest
  hosts: localhost
  vars:
    ROUTES:
      - ip: "aaa.AAA.aaa.AAA"
      - ip: "bbb.BBB.bbb.BBB"
      - ip: "ccc.CCC.ccc.CCC" 
  tasks: 
    - name: display
      template:
        src: test.j2 
        dest: test.conf

模板文件:

        :
      routes:
        - to: 0.0.0.0/0
          via: {{ ansible_default_ipv4.gateway }}
          on-link: true
{% for rec in ROUTES %}
        - to: {{ rec.ip }}/32
          scope: link
{% endfor %}

小心在行首开始循环 jinja2 以避免字符串之前的空格

生成结果文件:

  routes:
    - to: 0.0.0.0/0
      via: 10.0.2.2
      on-link: true
    - to: aaa.AAA.aaa.AAA/32
      scope: link
    - to: bbb.BBB.bbb.BBB/32
      scope: link
    - to: ccc.CCC.ccc.CCC/32
      scope: link
于 2021-10-27T12:19:13.457 回答