自定义动态库存

时间:2019-08-24 06:23:32

标签: ansible ansible-2.x ansible-inventory ansible-facts

在Ansible库存中配置的组:

  • Group_A有30台服务器
  • Group_B有40台服务器
  • Group_C有15台服务器

我想从每个组中获取10台服务器,并在不手动编辑清单的情况下创建一个新组。

这10个服务器是可以动态更改的变量。如果可行,我又遇到一个问题,如果库存本身是动态的

[Group_C]
server-1
server-2
server-3
...
server-10

'''从3个分组服务器中创建的新组现在将在剧本'''

中使用

1 个答案:

答案 0 :(得分:0)

(可使用2.8.3)

如果清单是动态的,我们不知道主机。假设我们可以选择其中任何一个。让我们首先创建所选主机的列表,然后循环add_hosts。有了库存

[Group_A]
A-0
A-1
..
A-29

[Group_B]
B-0
B-1
..
B-39

[Group_C]
C-0
C-1
..
C-14

下面的戏

- name: Create Group_X
  hosts: localhost
  vars:
    no_of_servers: 2
    my_groups:
      - Group_A
      - Group_B
      - Group_C
  tasks:
    - set_fact:
        my_list: "{{ my_list|default([]) +
                     groups[item][0:no_of_servers] }}"
      loop: "{{ my_groups }}"
    - add_host:
        name: "{{ item }}"
        groups: Group_X
      loop: "{{ my_list }}"
    - debug:
        msg: "{{ groups['Group_X'] }}"

- name: Use Group_X
  hosts: Group_X
  gather_facts: false
  tasks:
    - debug:
        msg: "{{ inventory_hostname }} is member of {{ group_names }}"
      run_once: true

给予

ok: [localhost] => {
    "msg": [
        "A-0", 
        "A-1", 
        "B-0", 
        "B-1", 
        "C-0", 
        "C-1"
    ]
}

ok: [A-0] => {
    "msg": "A-0 is member of [u'Group_A', u'Group_X']"
}


随机选择。

可以使用下面的简单插件随机选择主机

$ cat filter_plugins/list_methods.py
import random

def list_sample(l,n):
    return random.sample(l,n)

class FilterModule(object):
    def filters(self):
        return {
            'list_sample' : list_sample
        }

进行以下修改

- set_fact:
    my_list: '{{ my_list|default([]) +
                 groups[item]|list_sample(no_of_servers) }}'

举个例子

ok: [localhost] => {
    "msg": [
        "A-8", 
        "A-9", 
        "B-8", 
        "B-2", 
        "C-2", 
        "C-5"
    ]
}

ok: [A-8] => {
    "msg": "A-8 is member of [u'Group_A', u'Group_X']"
}