Provisioning overhaul
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 6317b51..e6520ad 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -3,6 +3,13 @@
salt-formula
============
+0.0.3
+-----
+
+- High availability
+- Cloud control updated
+- Virt control added
+
0.0.2
-----
diff --git a/README.rst b/README.rst
index 91f1754..80c7de9 100644
--- a/README.rst
+++ b/README.rst
@@ -13,79 +13,15 @@
Salt master
-----------
-Salt master with base environment and pillar metadata source
+Salt master with base production environment and pillar tree as metadata backend
-.. code-block:: yaml
+.. literalinclude:: tests/pillar/master_single_pillar.sls
+ :language: yaml
- salt:
- master:
- enabled: true
- command_timeout: 5
- worker_threads: 2
- pillar:
- engine: salt
- source:
- engine: git
- address: 'git@repo.domain.com:salt/pillar-demo.git'
- branch: 'master'
- base_environment: prd
- environment:
- prd:
- enabled: true
- formula:
- linux:
- source: git
- address: 'git@repo.domain.com:salt/formula-linux.git'
- branch: 'master'
- salt:
- source: git
- address: 'git@repo.domain.com:salt/formula-salt.git'
- branch: 'master'
- openssh:
- source: git
- address: 'git@repo.domain.com:salt/formula-openssh.git'
- branch: 'master'
+Salt master with reclass ENC as metadata backend
-Simple Salt master with base environment and custom states
-
-.. code-block:: yaml
-
- salt:
- master:
- ...
- environment:
- base:
- states:
- - name: gitlab
- source: git
- address: 'git@repo.domain.cz:salt/state-gitlab.git'
- branch: 'master'
- formulas:
- ...
-
-Salt master with reclass ENC
-
-.. code-block:: yaml
-
- salt:
- master:
- enabled: true
- ...
- pillar:
- engine: reclass
- data_dir: /srv/salt/reclass
-
-Salt master with windows repository
-
-.. code-block:: yaml
-
- salt:
- master:
- enabled: true
- ...
- windows_repo:
- type: git
- address: 'git@repo.domain.com:salt/win-packages.git'
+.. literalinclude:: tests/pillar/master_single_reclass.sls
+ :language: yaml
Salt master with API
@@ -139,153 +75,70 @@
salt:
master:
enabled: true
- command_timeout: 5
- worker_threads: 2
- environments:
- - name: base
- states:
- - source: git
- address: 'git@repo.domain.com:salt/state-ubuntu.git'
- branch: 'master'
- pillar:
- source: git
- address: 'git@repo.domain.com:salt/pillar-demo.git'
- branch: 'master'
- handlers:
- name: logstash
- type: udp
- bind:
- host: 127.0.0.1
- port: 9999
+ handler:
+ handler01:
+ engine: udp
+ bind:
+ host: 127.0.0.1
+ port: 9999
minion:
- handlers:
- - engine: udp
- bind:
- host: 127.0.0.1
- port: 9999
- - engine: zmq
- bind:
- host: 127.0.0.1
- port: 9999
+ handler:
+ handler01:
+ engine: udp
+ bind:
+ host: 127.0.0.1
+ port: 9999
+ handler02:
+ engine: zmq
+ bind:
+ host: 127.0.0.1
+ port: 9999
+
Salt minion
-----------
-Simplest Salt minion
+Simplest Salt minion setup with central configuration node
.. code-block:: yaml
- salt:
- minion:
- enabled: true
- master:
- host: master.domain.com
+.. literalinclude:: tests/pillar/minion_master.sls
+ :language: yaml
-Multi-master Salt minion
+Multi-master Salt minion setup
-.. code-block:: yaml
-
- salt:
- minion:
- enabled: true
- masters:
- - host: master1.domain.com
- - host: master2.domain.com
+.. literalinclude:: tests/pillar/minion_multi_master.sls
+ :language: yaml
Salt minion with salt mine options
-.. code-block:: yaml
-
- salt:
- minion:
- enabled: true
- master:
- host: master.domain.com
- mine:
- interval: 60
- module:
- grains.items: []
- network.interfaces: []
+.. literalinclude:: tests/pillar/minion_mine.sls
+ :language: yaml
Salt minion with graphing dependencies
-.. code-block:: yaml
+.. literalinclude:: tests/pillar/minion_graph.sls
+ :language: yaml
- salt:
- minion:
- enabled: true
- graph_states: true
- master:
- host: master.domain.com
-Salt control (cloud/virt)
--------------------------
+Salt control (cloud/kvm/docker)
+-------------------------------
-Salt cloud with local OpenStack insecure (ignoring SSL cert errors) provider
+Salt cloud with local OpenStack provider
-.. code-block:: yaml
-
- salt:
- control:
- enabled: true
- provider:
- openstack_account:
- engine: openstack
- insecure: true
- region: RegionOne
- identity_url: 'https://10.0.0.2:35357'
- tenant: devops
- user: user
- password: 'password'
- fixed_networks:
- - 123d3332-18be-4d1d-8d4d-5f5a54456554e
- floating_networks:
- - public
- ignore_cidr: 192.168.0.0/16
+.. literalinclude:: tests/pillar/control_cloud_openstack.sls
+ :language: yaml
Salt cloud with Digital Ocean provider
-.. code-block:: yaml
+.. literalinclude:: tests/pillar/control_cloud_digitalocean.sls
+ :language: yaml
- salt:
- control:
- enabled: true
- provider:
- dony1:
- engine: digital_ocean
- region: New York 1
- client_key: xxxxxxx
- api_key: xxxxxxx
+Salt virt KVM cluster
-Salt cloud with cluster definition
+.. literalinclude:: tests/pillar/control_virt.sls
+ :language: yaml
-.. code-block:: yaml
-
- salt:
- control:
- enabled: true
- cluster:
- devops_ase:
- config:
- engine: salt
- host: 147.32.120.1
- node:
- proxy1.ase.cepsos.cz:
- provider: cepsos_devops
- image: Ubuntu12.04 x86_64
- size: m1.medium
- node1.ase.cepsos.cz:
- provider: cepsos_devops
- image: Ubuntu12.04 x86_64
- size: m1.medium
- node2.ase.cepsos.cz:
- provider: cepsos_devops
- image: Ubuntu12.04 x86_64
- size: m1.medium
- node3.ase.cepsos.cz:
- provider: cepsos_devops
- image: Ubuntu12.04 x86_64
- size: m1.medium
Usage
=====
@@ -302,6 +155,7 @@
export LIBCLOUD_DEBUG=/dev/stderr; salt-cloud --list-sizes provider_name --log-level all
+
Read more
=========
@@ -313,6 +167,7 @@
* https://github.com/saltstack-formulas/salt-formula
* http://docs.saltstack.com/en/latest/topics/tutorials/multimaster.html
+
salt-cloud
----------
@@ -323,3 +178,6 @@
* http://salt-cloud.readthedocs.org/en/latest/topics/rackspace.html
* http://salt-cloud.readthedocs.org/en/latest/topics/map.html
* http://docs.saltstack.com/en/latest/topics/tutorials/multimaster.html
+
+salt-virt
+---------
diff --git a/metadata/service/control/cloud_aws.yml b/metadata/service/control/cloud_aws.yml
new file mode 100644
index 0000000..54f0a65
--- /dev/null
+++ b/metadata/service/control/cloud_aws.yml
@@ -0,0 +1,5 @@
+parameters:
+ salt:
+ control:
+ enabled: true
+ cloud_enabled: true
\ No newline at end of file
diff --git a/metadata/service/control/cloud_do.yml b/metadata/service/control/cloud_do.yml
new file mode 100644
index 0000000..54f0a65
--- /dev/null
+++ b/metadata/service/control/cloud_do.yml
@@ -0,0 +1,5 @@
+parameters:
+ salt:
+ control:
+ enabled: true
+ cloud_enabled: true
\ No newline at end of file
diff --git a/metadata/service/control/cloud_os.yml b/metadata/service/control/cloud_os.yml
new file mode 100644
index 0000000..54f0a65
--- /dev/null
+++ b/metadata/service/control/cloud_os.yml
@@ -0,0 +1,5 @@
+parameters:
+ salt:
+ control:
+ enabled: true
+ cloud_enabled: true
\ No newline at end of file
diff --git a/metadata/service/control/maas.yml b/metadata/service/control/maas.yml
new file mode 100644
index 0000000..405f52f
--- /dev/null
+++ b/metadata/service/control/maas.yml
@@ -0,0 +1,5 @@
+parameters:
+ salt:
+ control:
+ enabled: true
+ maas_enabled: true
\ No newline at end of file
diff --git a/metadata/service/control/virt.yml b/metadata/service/control/virt.yml
new file mode 100644
index 0000000..63050ea
--- /dev/null
+++ b/metadata/service/control/virt.yml
@@ -0,0 +1,18 @@
+parameters:
+ salt:
+ control:
+ enabled: true
+ virt_enabled: true
+ size:
+ small:
+ cpu: 1
+ ram: 2
+ hdd: 10
+ medium:
+ cpu: 2
+ ram: 4
+ hdd: 20
+ large:
+ cpu: 4
+ ram: 8
+ hdd: 70
diff --git a/salt/control/cluster.sls b/salt/control/cloud.sls
similarity index 67%
rename from salt/control/cluster.sls
rename to salt/control/cloud.sls
index de9d2a2..f46646f 100644
--- a/salt/control/cluster.sls
+++ b/salt/control/cloud.sls
@@ -1,5 +1,23 @@
{% from "salt/map.jinja" import control with context %}
-{%- if control.enabled %}
+{%- if control.enabled and control.cloud_enabled is defined %}
+
+salt_control_cloud_packages:
+ pkg.installed:
+ - names: {{ control.cloud_pkgs }}
+
+/etc/salt/control.providers:
+ file.managed:
+ - source: salt://salt/files/providers.conf
+ - user: root
+ - group: root
+ - template: jinja
+
+/etc/salt/control.profiles:
+ file.managed:
+ - source: salt://salt/files/profiles.conf
+ - user: root
+ - group: root
+ - template: jinja
/srv/salt/cloud/maps:
file.directory:
@@ -11,6 +29,8 @@
{%- for cluster_name, cluster in control.cluster.iteritems() %}
+{%- if cluster.engine == "cloud" %}
+
/srv/salt/cloud/maps/{{ cluster_name }}:
file.managed:
- source: salt://salt/files/map
@@ -42,6 +62,8 @@
{%- endfor %}
+{%- endif %}
+
{%- endfor %}
-{%- endif %}
\ No newline at end of file
+{%- endif %}
diff --git a/salt/control/docker.sls b/salt/control/docker.sls
new file mode 100644
index 0000000..29b6366
--- /dev/null
+++ b/salt/control/docker.sls
@@ -0,0 +1,6 @@
+{% from "salt/map.jinja" import control with context %}
+{%- if control.enabled and control.docker_enabled is defined %}
+
+{# TODO: dockerng implementation #}
+
+{%- endif %}
diff --git a/salt/control/init.sls b/salt/control/init.sls
index 1feb678..0667db3 100644
--- a/salt/control/init.sls
+++ b/salt/control/init.sls
@@ -1,4 +1,15 @@
+{%- if pillar.salt.control is defined %}
include:
-- salt.control.service
-- salt.control.provider
-- salt.control.cluster
\ No newline at end of file
+{%- if pillar.salt.control.cloud_enabled is defined %}
+- salt.control.cloud
+{%- endif %}
+{%- if pillar.salt.control.docker_enabled is defined %}
+- salt.control.docker
+{%- endif %}
+{%- if pillar.salt.control.maas_enabled is defined %}
+- salt.control.maas
+{%- endif %}
+{%- if pillar.salt.control.virt_enabled is defined %}
+- salt.control.virt
+{%- endif %}
+{%- endif %}
diff --git a/salt/control/maas.sls b/salt/control/maas.sls
new file mode 100644
index 0000000..bd46395
--- /dev/null
+++ b/salt/control/maas.sls
@@ -0,0 +1,22 @@
+{% from "salt/map.jinja" import control with context %}
+{%- if control.enabled and control.maas_enabled is defined %}
+
+salt_control_maas_packages:
+ pkg.installed:
+ - names: {{ control.maas_pkgs }}
+
+{%- for cluster_name, cluster in control.cluster.iteritems() %}
+
+{%- if cluster.engine == "maas" %}
+
+{%- for node_name, node in cluster.node.iteritems() %}
+
+{# TODO: mass.server_active implementation #}
+
+{%- endfor %}
+
+{%- endif %}
+
+{%- endfor %}
+
+{%- endif %}
diff --git a/salt/control/provider.sls b/salt/control/provider.sls
deleted file mode 100644
index 09a5452..0000000
--- a/salt/control/provider.sls
+++ /dev/null
@@ -1,18 +0,0 @@
-{% from "salt/map.jinja" import control with context %}
-{%- if control.enabled %}
-
-/etc/salt/cloud.providers:
- file.managed:
- - source: salt://salt/files/providers.conf
- - user: root
- - group: root
- - template: jinja
-
-/etc/salt/cloud.profiles:
- file.managed:
- - source: salt://salt/files/profiles.conf
- - user: root
- - group: root
- - template: jinja
-
-{%- endif %}
\ No newline at end of file
diff --git a/salt/control/service.sls b/salt/control/service.sls
deleted file mode 100644
index 2acab7b..0000000
--- a/salt/control/service.sls
+++ /dev/null
@@ -1,26 +0,0 @@
-{% from "salt/map.jinja" import control with context %}
-{%- if control.enabled %}
-
-{%- if control.pkgs is defined and control.pkgs|length > 0 %}
-
-salt_control_packages:
- pkg.installed:
- - names: {{ control.pkgs }}
-
-{%- else %}
-{# No system packages defined, install with pip #}
-
-salt_control_packages:
- pkg.installed:
- - name: python-pip
-
-{%- for package in control.python_pkgs %}
-{{ package }}:
- pip.installed:
- - require:
- - pkg: salt_control_packages
-{%- endfor %}
-
-{%- endif %}
-
-{%- endif %}
diff --git a/salt/control/virt.sls b/salt/control/virt.sls
new file mode 100644
index 0000000..dc0aa1c
--- /dev/null
+++ b/salt/control/virt.sls
@@ -0,0 +1,39 @@
+{% from "salt/map.jinja" import control with context %}
+{%- if control.enabled and control.virt_enabled is defined %}
+
+salt_control_virt_packages:
+ pkg.installed:
+ - names: {{ control.virt_pkgs }}
+
+{%- for package in control.virt_pips %}
+
+{{ package }}:
+ pip.installed:
+ - require:
+ - pkg: salt_control_virt_packages
+
+{%- endfor %}
+
+{%- for cluster_name, cluster in control.cluster.iteritems() %}
+
+{%- if cluster.engine == "virt" %}
+
+{%- for node_name, node in cluster.node.iteritems() %}
+
+{%- set size = control.size.get(node.size) %}
+
+salt_control_virt_{{ cluster_name }}_{{ node_name }}:
+ module.run:
+ - name: virt.init
+ - m_name: {{ node_name }}_{{ cluster.domain }}
+ - cpu: {{ size.cpu }}
+ - mem: {{ size.ram }}
+ - image: salt://{{ node.image }}
+
+{%- endfor %}
+
+{%- endif %}
+
+{%- endfor %}
+
+{%- endif %}
diff --git a/salt/files/minion.conf b/salt/files/minion.conf
index f5a2cc7..35f8c2c 100644
--- a/salt/files/minion.conf
+++ b/salt/files/minion.conf
@@ -2,12 +2,20 @@
{%- from "linux/map.jinja" import system with context %}
{%- if minion.masters is defined %}
+
master:
{%- for master in minion.masters %}
- {{ master.host }}
{%- endfor %}
+
+{%- if minion.master_type == "failover" %}
+master_type: failover
+master_shuffle: True
+master_alive_interval: 60
{%- else %}
+
master: {{ minion.master.host }}
+
{%- endif %}
id: {{ system.name }}.{{ system.domain }}
diff --git a/salt/map.jinja b/salt/map.jinja
index 886404a..ec88187 100644
--- a/salt/map.jinja
+++ b/salt/map.jinja
@@ -95,6 +95,7 @@
},
}, merge=salt['pillar.get']('salt:minion')) %}
+
{% set api = salt['grains.filter_by']({
'Debian': {
'pkgs': ['salt-api'],
@@ -106,15 +107,22 @@
},
}, merge=salt['pillar.get']('salt:api')) %}
+
{% set control = salt['grains.filter_by']({
'Debian': {
- 'python_pkgs': ['apache-libcloud', 'netaddr'],
- 'pkgs': ['python-netaddr', 'python-libcloud'],
+ 'cloud_pips': ['apache-libcloud', 'netaddr'],
+ 'cloud_pkgs': ['python-netaddr', 'python-libcloud'],
+ 'virt_pips': ['libvirt-python',],
+ 'virt_pkgs': ['libvirt-dev', 'pkg-config'],
+ 'maas_pkgs': ['python-maas-client',],
'cluster': {},
},
'RedHat': {
- 'python_pkgs': ['apache-libcloud', 'netaddr'],
- 'pkgs': ['python-netaddr', 'python-libcloud'],
+ 'cloud_pips': ['apache-libcloud', 'netaddr'],
+ 'cloud_pkgs': ['python-netaddr', 'python-libcloud'],
+ 'virt_pips': ['libvirt-python',],
+ 'virt_pkgs': ['libvirt-dev', 'pkg-config'],
+ 'maas_pkgs': ['python-maas-client',],
'cluster': {},
},
}, merge=salt['pillar.get']('salt:control')) %}
diff --git a/tests/pillar/control_cloud_digitalocean.sls b/tests/pillar/control_cloud_digitalocean.sls
new file mode 100644
index 0000000..57db1e6
--- /dev/null
+++ b/tests/pillar/control_cloud_digitalocean.sls
@@ -0,0 +1,25 @@
+salt:
+ control:
+ enabled: true
+ provider:
+ digitalocean_account:
+ engine: digital_ocean
+ region: New York 1
+ client_key: xxxxxxx
+ api_key: xxxxxxx
+ cluster:
+ dc01_prd:
+ domain: dc01.prd.domain.com
+ engine: cloud
+ config:
+ engine: salt
+ host: master.dc01.domain.com
+ node:
+ ubuntu1:
+ provider: digitalocean_account
+ image: Ubuntu14.04 x86_64
+ size: m1.medium
+ ubuntu2:
+ provider: digitalocean_account
+ image: Ubuntu14.04 x86_64
+ size: m1.medium
\ No newline at end of file
diff --git a/tests/pillar/control_cloud_openstack.sls b/tests/pillar/control_cloud_openstack.sls
new file mode 100644
index 0000000..08c3b8c
--- /dev/null
+++ b/tests/pillar/control_cloud_openstack.sls
@@ -0,0 +1,33 @@
+salt:
+ control:
+ enabled: true
+ provider:
+ openstack_account:
+ engine: openstack
+ insecure: true
+ region: RegionOne
+ identity_url: 'https://10.0.0.2:35357'
+ tenant: project
+ user: user
+ password: 'password'
+ fixed_networks:
+ - 123d3332-18be-4d1d-8d4d-5f5a54456554e
+ floating_networks:
+ - public
+ ignore_cidr: 192.168.0.0/16
+ cluster:
+ dc01_prd:
+ domain: dc01.prd.domain.com
+ engine: cloud
+ config:
+ engine: salt
+ host: master.dc01.domain.com
+ node:
+ ubuntu1:
+ provider: openstack_account
+ image: Ubuntu14.04 x86_64
+ size: m1.medium
+ ubuntu2:
+ provider: openstack_account
+ image: Ubuntu14.04 x86_64
+ size: m1.medium
\ No newline at end of file
diff --git a/tests/pillar/control_virt.sls b/tests/pillar/control_virt.sls
new file mode 100644
index 0000000..7ca7e11
--- /dev/null
+++ b/tests/pillar/control_virt.sls
@@ -0,0 +1,32 @@
+salt:
+ control:
+ enabled: true
+ size:
+ small:
+ cpu: 1
+ ram: 1
+ hdd: 10
+ medium:
+ cpu: 2
+ ram: 4
+ hdd: 20
+ large:
+ cpu: 4
+ ram: 8
+ hdd: 70
+ cluster:
+ vpc20_infra:
+ domain: neco.virt.domain.com
+ engine: virt
+ config:
+ engine: salt
+ host: master.domain.com
+ node:
+ ubuntu1:
+ provider: node01.domain.com
+ image: ubuntu.qcow
+ size: medium
+ ubuntu2:
+ provider: node02.domain.com
+ image: bubuntu.qcomw
+ size: small
\ No newline at end of file
diff --git a/tests/pillar/master_base.sls b/tests/pillar/master_base.sls
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/pillar/master_base.sls
diff --git a/tests/pillar/master_cluster_failover.sls b/tests/pillar/master_cluster_failover.sls
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/pillar/master_cluster_failover.sls
diff --git a/tests/pillar/master_single.sls b/tests/pillar/master_single_pillar.sls
similarity index 70%
rename from tests/pillar/master_single.sls
rename to tests/pillar/master_single_pillar.sls
index 62f9fd3..b20e2b6 100644
--- a/tests/pillar/master_single.sls
+++ b/tests/pillar/master_single_pillar.sls
@@ -10,16 +10,19 @@
command_timeout: 5
worker_threads: 2
base_environment: prd
+ environment:
+ prd:
+ formula:
+ service01:
+ source: git
+ address: 'git@git.domain.com/service01-formula.git'
+ revision: master
+ service02:
+ source: pkg
+ name: salt-formula-service02
pillar:
engine: salt
source:
engine: git
address: 'git@repo.domain.com:salt/pillar-demo.git'
branch: 'master'
- environment:
- prd:
- formula:
- memcached:
- source: git
- address: 'git@git.domain.com/memcached-formula.git'
- revision: master
diff --git a/tests/pillar/master_single_reclass.sls b/tests/pillar/master_single_reclass.sls
index 637c018..d6db522 100644
--- a/tests/pillar/master_single_reclass.sls
+++ b/tests/pillar/master_single_reclass.sls
@@ -17,13 +17,16 @@
command_timeout: 5
worker_threads: 2
base_environment: prd
- pillar:
- engine: reclass
- data_dir: /srv/salt/reclass
environment:
prd:
formula:
- memcached:
+ service01:
source: git
- address: 'git@git.domain.com/memcached-formula.git'
+ address: 'git@git.domain.com/service01-formula.git'
revision: master
+ service02:
+ source: pkg
+ name: salt-formula-service02
+ pillar:
+ engine: reclass
+ data_dir: /srv/salt/reclass
diff --git a/tests/pillar/minion_graph.sls b/tests/pillar/minion_graph.sls
new file mode 100644
index 0000000..1a357d4
--- /dev/null
+++ b/tests/pillar/minion_graph.sls
@@ -0,0 +1,4 @@
+salt:
+ minion:
+ enabled: true
+ graph_states: true
diff --git a/tests/pillar/minion_local.sls b/tests/pillar/minion_local_pillar.sls
similarity index 99%
rename from tests/pillar/minion_local.sls
rename to tests/pillar/minion_local_pillar.sls
index 9e3168f..cd8f611 100644
--- a/tests/pillar/minion_local.sls
+++ b/tests/pillar/minion_local_pillar.sls
@@ -7,4 +7,4 @@
source:
engine: git
address: 'git@repo.domain.com:salt/pillar-demo.git'
- branch: 'master'
\ No newline at end of file
+ branch: 'master'
diff --git a/tests/pillar/minion_master.sls b/tests/pillar/minion_master.sls
index 3adb7e6..cd722f2 100644
--- a/tests/pillar/minion_master.sls
+++ b/tests/pillar/minion_master.sls
@@ -2,9 +2,4 @@
minion:
enabled: true
master:
- host: 127.0.0.1
- mine:
- interval: 60
- module:
- grains.items: []
- network.interfaces: []
+ host: config01.dc01.domain.com
diff --git a/tests/pillar/minion_mine.sls b/tests/pillar/minion_mine.sls
new file mode 100644
index 0000000..3ee5d0a
--- /dev/null
+++ b/tests/pillar/minion_mine.sls
@@ -0,0 +1,8 @@
+salt:
+ minion:
+ enabled: true
+ mine:
+ interval: 60
+ module:
+ grains.items: []
+ network.interfaces: []
diff --git a/tests/pillar/minion_multi_master.sls b/tests/pillar/minion_multi_master.sls
new file mode 100644
index 0000000..381e50c
--- /dev/null
+++ b/tests/pillar/minion_multi_master.sls
@@ -0,0 +1,6 @@
+salt:
+ minion:
+ enabled: true
+ masters:
+ - host: config01.dc01.domain.com
+ - host: config02.dc01.domain.com
diff --git a/tests/pillar/minion_multi_master_failover.sls b/tests/pillar/minion_multi_master_failover.sls
new file mode 100644
index 0000000..cffefec
--- /dev/null
+++ b/tests/pillar/minion_multi_master_failover.sls
@@ -0,0 +1,7 @@
+salt:
+ minion:
+ enabled: true
+ masters:
+ - host: config01.dc01.domain.com
+ - host: config02.dc01.domain.com
+ master_type: failover