如何在 Ansible 中创建数字递增的变量?

问题描述 投票:0回答:1

我正在编写一个 Ansible 任务,它会安装一组具有以下 objectClass 以及属性和值的 LDAP 条目。

dn: entry=101,cn=multicast,{{ ipa_base }}
objectClass: multicastAddress
objectClass: top
entry: 101
network: test
ipNumber: 224.0.0.1

我有多个网络,每个网络将分配62个IP,并且条目的每个值和ipNumber都会递增。

Network A:
entry=101 ipNumber: 224.0.0.1
entry=102 ipNumber: 224.0.0.2

Network B:
entry=101 ipNumber: 224.0.1.1
entry=102 ipNumber: 224.0.1.2

目前,我只有一个静态创建条目的任务,我想高效地编写它,而不必创建每个静态条目。

- name: Create entries
  ldap_entry:
    dn: entry=101,cn=multicast,{{ ipa_base }}
    state: present
    objectClass:
      - top
      - multicastAddress
    attributes:
      entry: 101
      network: test
      ipNumber: 224.0.0.1
    server_uri: localhost
    bind_dn: "cn=Directory Manager"
    bind_pw: '{{ dmgr_pass }}'
ansible ansible-2.x ansible-template
1个回答
0
投票

根据您的具体要求,有多种方法可以实现您的目标。这是一本带有中间调试功能的不言自明的剧本,可让您走上正轨。注意:为了示例和易读性,我将输出限制为 2 个网络,每个网络有 2 个 ip。只需更改这些数字即可满足您的需求。

---
- hosts: localhost
  gather_facts: false

  vars:
    number_of_networks: 2
    ips_per_network: 2

    networks_list: "{{ range(0, number_of_networks) | list }}"
    ips_list: "{{ range(1, ips_per_network + 1) }}"

    networks_ips_product: "{{ networks_list | product(ips_list) }}"

    ipa_base: "dc=whatever,dc=local"

  tasks:
    - name: Create a list of networks starting from 0
      ansible.builtin.debug:
        var: networks_list

    - name: Create a list of ips starting grom 1
      ansible.builtin.debug:
        var: ips_list

    - name: Combine networks and ips in a single list
      ansible.builtin.debug:
        var: networks_ips_product

    - name: Loop on that list in a debug tasks which mimics your ldap task
      vars:
        network_it: "{{ item.0 }}"
        ip_it: "{{ item.1 }}"
        entry: "10{{ ip_it }}"
        ip: "224.0.{{ network_it }}.{{ ip_it }}"
        ldap_entry:
          dn: entry={{ entry }},cn=multicast,{{ ipa_base }}
          state: present
          objectClass:
            - multicastAddress
            - top
          attributes:
            entry: "{{ entry }}"
            network: "Network{{ network_it }}"
            ipNumber: "{{ ip }}"
          server_uri: localhost
          bind_dn: "cn=Directory Manager"
          bind_pw: "v3rys3cr3t"
      ansible.builtin.debug:
        var: ldap_entry
      loop: "{{ networks_ips_product }}"

运行上面的剧本会给出:

PLAY [localhost] ***********************************************************************************************************************************************************************************************************************

TASK [Create a list of networks starting from 0] ***************************************************************************************************************************************************************************************
ok: [localhost] => {
    "networks_list": [
        0,
        1
    ]
}

TASK [Create a list of ips starting grom 1] ********************************************************************************************************************************************************************************************
ok: [localhost] => {
    "ips_list": [
        1,
        2
    ]
}

TASK [Combine networks and ips in a single list] ***************************************************************************************************************************************************************************************
ok: [localhost] => {
    "networks_ips_product": [
        [
            0,
            1
        ],
        [
            0,
            2
        ],
        [
            1,
            1
        ],
        [
            1,
            2
        ]
    ]
}

TASK [Loop on that list in a debug tasks which mimics your ldap task] ******************************************************************************************************************************************************************
ok: [localhost] => (item=[0, 1]) => {
    "ansible_loop_var": "item",
    "item": [
        0,
        1
    ],
    "ldap_entry": {
        "attributes": {
            "entry": "101",
            "ipNumber": "224.0.0.1",
            "network": "Network0"
        },
        "bind_dn": "cn=Directory Manager",
        "bind_pw": "v3rys3cr3t",
        "dn": "entry=101,cn=multicast,dc=whatever,dc=local",
        "objectClass": [
            "multicastAddress",
            "top"
        ],
        "server_uri": "localhost",
        "state": "present"
    }
}
ok: [localhost] => (item=[0, 2]) => {
    "ansible_loop_var": "item",
    "item": [
        0,
        2
    ],
    "ldap_entry": {
        "attributes": {
            "entry": "102",
            "ipNumber": "224.0.0.2",
            "network": "Network0"
        },
        "bind_dn": "cn=Directory Manager",
        "bind_pw": "v3rys3cr3t",
        "dn": "entry=102,cn=multicast,dc=whatever,dc=local",
        "objectClass": [
            "multicastAddress",
            "top"
        ],
        "server_uri": "localhost",
        "state": "present"
    }
}
ok: [localhost] => (item=[1, 1]) => {
    "ansible_loop_var": "item",
    "item": [
        1,
        1
    ],
    "ldap_entry": {
        "attributes": {
            "entry": "101",
            "ipNumber": "224.0.1.1",
            "network": "Network1"
        },
        "bind_dn": "cn=Directory Manager",
        "bind_pw": "v3rys3cr3t",
        "dn": "entry=101,cn=multicast,dc=whatever,dc=local",
        "objectClass": [
            "multicastAddress",
            "top"
        ],
        "server_uri": "localhost",
        "state": "present"
    }
}
ok: [localhost] => (item=[1, 2]) => {
    "ansible_loop_var": "item",
    "item": [
        1,
        2
    ],
    "ldap_entry": {
        "attributes": {
            "entry": "102",
            "ipNumber": "224.0.1.2",
            "network": "Network1"
        },
        "bind_dn": "cn=Directory Manager",
        "bind_pw": "v3rys3cr3t",
        "dn": "entry=102,cn=multicast,dc=whatever,dc=local",
        "objectClass": [
            "multicastAddress",
            "top"
        ],
        "server_uri": "localhost",
        "state": "present"
    }
}

PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost                  : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
© www.soinside.com 2019 - 2024. All rights reserved.