mirror of
https://github.com/saltstack/salt.git
synced 2025-04-17 10:10:20 +00:00
Merge pull request #46513 from rallytime/merge-2018.3
[2018.3] Merge forward from 2018.3.0rc1 to 2018.3
This commit is contained in:
commit
5429438e4b
21 changed files with 511 additions and 459 deletions
|
@ -36,7 +36,7 @@ provisioner:
|
|||
require_chef: false
|
||||
remote_states:
|
||||
name: git://github.com/saltstack/salt-jenkins.git
|
||||
branch: oxygen
|
||||
branch: 2018.3
|
||||
repo: git
|
||||
testingdir: /testing
|
||||
salt_copy_filter:
|
||||
|
|
|
@ -344,7 +344,35 @@ be set in the configuration file to enable interfacing with GoGrid:
|
|||
OpenStack
|
||||
---------
|
||||
|
||||
.. automodule:: salt.cloud.clouds.openstack
|
||||
Using Salt for OpenStack uses the `shade <https://docs.openstack.org/shade/latest/>` driver managed by the
|
||||
openstack-infra team.
|
||||
|
||||
This driver can be configured using the ``/etc/openstack/clouds.yml`` file with
|
||||
`os-client-config <https://docs.openstack.org/os-client-config/latest/>`
|
||||
|
||||
.. code-block:: yaml
|
||||
myopenstack:
|
||||
driver: openstack
|
||||
region_name: RegionOne
|
||||
cloud: mycloud
|
||||
|
||||
Or by just configuring the same auth block directly in the cloud provider config.
|
||||
|
||||
.. code-block:: yaml
|
||||
myopenstack:
|
||||
driver: openstack
|
||||
region_name: RegionOne
|
||||
auth:
|
||||
username: 'demo'
|
||||
password: secret
|
||||
project_name: 'demo'
|
||||
auth_url: 'http://openstack/identity'
|
||||
|
||||
Both of these methods support using the
|
||||
`vendor <https://docs.openstack.org/os-client-config/latest/user/vendor-support.html>`
|
||||
options.
|
||||
|
||||
For more information, look at :mod:`Openstack Cloud Driver Docs <salt.cloud.clouds.openstack>`
|
||||
|
||||
DigitalOcean
|
||||
------------
|
||||
|
|
5
doc/topics/cloud/openstack.rst
Normal file
5
doc/topics/cloud/openstack.rst
Normal file
|
@ -0,0 +1,5 @@
|
|||
==============================
|
||||
Getting Started with Openstack
|
||||
==============================
|
||||
|
||||
.. automodule:: salt.cloud.clouds.openstack
|
|
@ -1,188 +0,0 @@
|
|||
==============================
|
||||
Getting Started With Rackspace
|
||||
==============================
|
||||
|
||||
Rackspace is a major public cloud platform which may be configured using either
|
||||
the `openstack` driver.
|
||||
|
||||
|
||||
Dependencies
|
||||
============
|
||||
* Libcloud >= 0.13.2
|
||||
|
||||
|
||||
Configuration
|
||||
=============
|
||||
To use the `openstack` driver (recommended), set up the cloud configuration at
|
||||
``/etc/salt/cloud.providers`` or
|
||||
``/etc/salt/cloud.providers.d/rackspace.conf``:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
my-rackspace-config:
|
||||
# Set the location of the salt-master
|
||||
#
|
||||
minion:
|
||||
master: saltmaster.example.com
|
||||
|
||||
# Configure Rackspace using the OpenStack plugin
|
||||
#
|
||||
identity_url: 'https://identity.api.rackspacecloud.com/v2.0/tokens'
|
||||
compute_name: cloudServersOpenStack
|
||||
protocol: ipv4
|
||||
|
||||
# Set the compute region:
|
||||
#
|
||||
compute_region: DFW
|
||||
|
||||
# Configure Rackspace authentication credentials
|
||||
#
|
||||
user: myname
|
||||
tenant: 123456
|
||||
apikey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
|
||||
driver: openstack
|
||||
|
||||
|
||||
.. note::
|
||||
.. versionchanged:: 2015.8.0
|
||||
|
||||
The ``provider`` parameter in cloud provider definitions was renamed to ``driver``. This
|
||||
change was made to avoid confusion with the ``provider`` parameter that is used in cloud profile
|
||||
definitions. Cloud provider definitions now use ``driver`` to refer to the Salt cloud module that
|
||||
provides the underlying functionality to connect to a cloud host, while cloud profiles continue
|
||||
to use ``provider`` to refer to provider configurations that you define.
|
||||
|
||||
Compute Region
|
||||
==============
|
||||
|
||||
Rackspace currently has six compute regions which may be used:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
DFW -> Dallas/Forth Worth
|
||||
ORD -> Chicago
|
||||
SYD -> Sydney
|
||||
LON -> London
|
||||
IAD -> Northern Virginia
|
||||
HKG -> Hong Kong
|
||||
|
||||
Note: Currently the LON region is only available with a UK account, and UK accounts cannot access other regions
|
||||
|
||||
Authentication
|
||||
==============
|
||||
|
||||
The ``user`` is the same user as is used to log into the Rackspace Control
|
||||
Panel. The ``tenant`` and ``apikey`` can be found in the API Keys area of the
|
||||
Control Panel. The ``apikey`` will be labeled as API Key (and may need to be
|
||||
generated), and ``tenant`` will be labeled as Cloud Account Number.
|
||||
|
||||
An initial profile can be configured in ``/etc/salt/cloud.profiles`` or
|
||||
``/etc/salt/cloud.profiles.d/rackspace.conf``:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
openstack_512:
|
||||
provider: my-rackspace-config
|
||||
size: 512 MB Standard
|
||||
image: Ubuntu 12.04 LTS (Precise Pangolin)
|
||||
|
||||
To instantiate a machine based on this profile:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# salt-cloud -p openstack_512 myinstance
|
||||
|
||||
This will create a virtual machine at Rackspace with the name ``myinstance``.
|
||||
This operation may take several minutes to complete, depending on the current
|
||||
load at the Rackspace data center.
|
||||
|
||||
Once the instance has been created with salt-minion installed, connectivity to
|
||||
it can be verified with Salt:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# salt myinstance test.ping
|
||||
|
||||
RackConnect Environments
|
||||
------------------------
|
||||
|
||||
Rackspace offers a hybrid hosting configuration option called RackConnect that
|
||||
allows you to use a physical firewall appliance with your cloud servers. When
|
||||
this service is in use the public_ip assigned by nova will be replaced by a NAT
|
||||
ip on the firewall. For salt-cloud to work properly it must use the newly
|
||||
assigned "access ip" instead of the Nova assigned public ip. You can enable that
|
||||
capability by adding this to your profiles:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
openstack_512:
|
||||
provider: my-openstack-config
|
||||
size: 512 MB Standard
|
||||
image: Ubuntu 12.04 LTS (Precise Pangolin)
|
||||
rackconnect: True
|
||||
|
||||
Managed Cloud Environments
|
||||
--------------------------
|
||||
|
||||
Rackspace offers a managed service level of hosting. As part of the managed
|
||||
service level you have the ability to choose from base of lamp installations on
|
||||
cloud server images. The post build process for both the base and the lamp
|
||||
installations used Chef to install things such as the cloud monitoring agent and
|
||||
the cloud backup agent. It also takes care of installing the lamp stack if
|
||||
selected. In order to prevent the post installation process from stomping over
|
||||
the bootstrapping you can add the below to your profiles.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
openstack_512:
|
||||
provider: my-rackspace-config
|
||||
size: 512 MB Standard
|
||||
image: Ubuntu 12.04 LTS (Precise Pangolin)
|
||||
managedcloud: True
|
||||
|
||||
First and Next Generation Images
|
||||
--------------------------------
|
||||
|
||||
Rackspace provides two sets of virtual machine images, *first*, and *next*
|
||||
generation. As of ``0.8.9`` salt-cloud will default to using the *next*
|
||||
generation images. To force the use of first generation images, on the profile
|
||||
configuration please add:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
FreeBSD-9.0-512:
|
||||
provider: my-rackspace-config
|
||||
size: 512 MB Standard
|
||||
image: FreeBSD 9.0
|
||||
force_first_gen: True
|
||||
|
||||
Private Subnets
|
||||
---------------
|
||||
By default salt-cloud will not add Rackspace private networks to new servers. To enable
|
||||
a private network to a server instantiated by salt cloud, add the following section
|
||||
to the provider file (typically ``/etc/salt/cloud.providers.d/rackspace.conf``)
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
networks:
|
||||
- fixed:
|
||||
# This is the private network
|
||||
- private-network-id
|
||||
# This is Rackspace's "PublicNet"
|
||||
- 00000000-0000-0000-0000-000000000000
|
||||
# This is Rackspace's "ServiceNet"
|
||||
- 11111111-1111-1111-1111-111111111111
|
||||
|
||||
To get the Rackspace private network ID, go to Networking, Networks and hover over the private network name.
|
||||
|
||||
The order of the networks in the above code block does not map to the order of the
|
||||
ethernet devices on newly created servers. Public IP will always be first ( eth0 )
|
||||
followed by servicenet ( eth1 ) and then private networks.
|
||||
|
||||
Enabling the private network per above gives the option of using the private subnet for
|
||||
all master-minion communication, including the bootstrap install of salt-minion. To
|
||||
enable the minion to use the private subnet, update the master: line in the minion:
|
||||
section of the providers file. To configure the master to only listen on the private
|
||||
subnet IP, update the interface: line in the /etc/salt/master file to be the private
|
||||
subnet IP of the salt master.
|
|
@ -665,6 +665,37 @@ The Windows installer will now display command-line help when a help switch
|
|||
Salt Cloud Features
|
||||
-------------------
|
||||
|
||||
OpenStack Revamp
|
||||
================
|
||||
|
||||
The OpenStack Driver has been rewritten mostly from scratch. Salt is now using
|
||||
the `shade driver <https://docs.openstack.org/shade/latest/>`.
|
||||
|
||||
With this, the ``nova`` driver is being deprecated.
|
||||
|
||||
:mod:`openstack driver <salt.cloud.clouds.openstack>`
|
||||
|
||||
There have also been several new modules and states added for managing OpenStack
|
||||
setups using shade as well.
|
||||
|
||||
:mod:`keystone <salt.modules.keystoneng>`
|
||||
:mod:`keystone role grant <salt.states.keystone_role_grant>`
|
||||
:mod:`keystone group <salt.states.keystone_group>`
|
||||
:mod:`keystone role <salt.states.keystone_role>`
|
||||
:mod:`keystone service <salt.states.keystone_service>`
|
||||
:mod:`keystone user <salt.states.keystone_user>`
|
||||
:mod:`keystone domain <salt.states.keystone_domain>`
|
||||
:mod:`keystone project <salt.states.keystone_project>`
|
||||
:mod:`keystone endpoint <salt.states.keystone_endpoint>`
|
||||
:mod:`glance <salt.modules.glanceng>`
|
||||
:mod:`glance_image <salt.states.glance_image>`
|
||||
:mod:`neutron <salt.modules.neutronng>`
|
||||
:mod:`neutron subnet <salt.states.neutron_subnet>`
|
||||
:mod:`neutron secgroup <salt.states.neutron_secgroup>`
|
||||
:mod:`neutron secgroup rule <salt.states.neutron_secgroup_rule>`
|
||||
:mod:`neutron network <salt.states.neutron_network>`
|
||||
|
||||
|
||||
Pre-Flight Commands
|
||||
===================
|
||||
|
||||
|
@ -1557,6 +1588,14 @@ PyCrypto is used as it was in the previous releases. M2Crypto is used in the
|
|||
same way as PyCrypto so there would be no compatibility issues, different nodes
|
||||
could use different backends.
|
||||
|
||||
NaCL Module and Runner changes
|
||||
------------------------------
|
||||
|
||||
In addition to argument changes in both the NaCL module and runner for future
|
||||
deprecation in the Fluorine release, the default box_type has changed from
|
||||
`secretbox` to `sealedbox`. SecretBox is data encrypted using private key
|
||||
`sk` and Sealedbox is encrypted using public key `pk`
|
||||
|
||||
Deprecations
|
||||
------------
|
||||
|
||||
|
@ -1617,6 +1656,15 @@ The ``win_service`` module had the following changes:
|
|||
- The ``type`` option was removed from the ``create`` function. Please use
|
||||
``service_type`` instead.
|
||||
|
||||
The ``nacl`` module had the following changes:
|
||||
|
||||
- The ``key_file`` option was replaced in the ``keygen``, ``enc`` and ``dec``
|
||||
functions. Please use the ``sk_file`` option instead.
|
||||
|
||||
- The ``key`` option was replaced in the ``keygen``, ``enc`` and ``dec``
|
||||
functions. Please use the ``sk`` option instead.
|
||||
|
||||
|
||||
Runner Deprecations
|
||||
===================
|
||||
|
||||
|
@ -1625,6 +1673,14 @@ The ``manage`` runner had the following changes:
|
|||
- The ``root_user`` kwarg was removed from the ``bootstrap`` function. Please
|
||||
use ``salt-ssh`` roster entries for the host instead.
|
||||
|
||||
The ``nacl`` runner had the following changes:
|
||||
|
||||
- The ``key_file`` option was replaced in the ``keygen``, ``enc`` and ``dec``
|
||||
functions. Please use the ``sk_file`` option instead.
|
||||
|
||||
- The ``key`` option was replaced in the ``keygen``, ``enc`` and ``dec``
|
||||
functions. Please use the ``sk`` option instead.
|
||||
|
||||
State Deprecations
|
||||
==================
|
||||
|
||||
|
|
|
@ -79,22 +79,12 @@ from the ``kevinopenstack`` profile above, you would use:
|
|||
|
||||
salt-call sdb.get sdb://kevinopenstack/password
|
||||
|
||||
Some drivers use slightly more complex URIs. For instance, the ``vault`` driver
|
||||
requires the full path to where the key is stored, followed by a question mark,
|
||||
followed by the key to be retrieved. If you were using a profile called
|
||||
``myvault``, you would use a URI that looks like:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-call sdb.get 'sdb://myvault/secret/salt?saltstack'
|
||||
|
||||
Setting a value uses the same URI as would be used to retrieve it, followed
|
||||
by the value as another argument. For the above ``myvault`` URI, you would set
|
||||
a new value using a command like:
|
||||
by the value as another argument.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-call sdb.set 'sdb://myvault/secret/salt?saltstack' 'super awesome'
|
||||
salt-call sdb.set 'sdb://myvault/secret/salt/saltstack' 'super awesome'
|
||||
|
||||
Deleting values (if supported by the driver) is done pretty much the same way as
|
||||
getting them. Provided that you have a profile called ``mykvstore`` that uses
|
||||
|
@ -109,8 +99,8 @@ the runner system:
|
|||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-run sdb.get 'sdb://myvault/secret/salt?saltstack'
|
||||
salt-run sdb.set 'sdb://myvault/secret/salt?saltstack' 'super awesome'
|
||||
salt-run sdb.get 'sdb://myvault/secret/salt/saltstack'
|
||||
salt-run sdb.set 'sdb://myvault/secret/salt/saltstack' 'super awesome'
|
||||
salt-run sdb.delete 'sdb://mykvstore/foobar'
|
||||
|
||||
|
||||
|
|
|
@ -264,6 +264,12 @@ def __virtual__():
|
|||
if get_dependencies() is False:
|
||||
return False
|
||||
|
||||
__utils__['versions.warn_until'](
|
||||
'Neon',
|
||||
'This driver has been deprecated and will be removed in the '
|
||||
'{version} release of Salt. Please use the openstack driver instead.'
|
||||
)
|
||||
|
||||
return __virtualname__
|
||||
|
||||
|
||||
|
|
|
@ -72,6 +72,7 @@ Or if you need to use a profile to setup some extra stuff, it can be passed as a
|
|||
username: rackusername
|
||||
api_key: myapikey
|
||||
region_name: ORD
|
||||
auth_type: rackspace_apikey
|
||||
|
||||
And this will pull in the profile for rackspace and setup all the correct
|
||||
options for the auth_url and different api versions for services.
|
||||
|
@ -101,6 +102,23 @@ The salt specific ones are:
|
|||
|
||||
This is the minimum setup required.
|
||||
|
||||
If metadata is set to make sure that the host has finished setting up the
|
||||
`wait_for_metadata` can be set.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
centos:
|
||||
provider: myopenstack
|
||||
image: CentOS 7
|
||||
size: ds1G
|
||||
ssh_key_name: mykey
|
||||
ssh_key_file: /root/.ssh/id_rsa
|
||||
meta:
|
||||
build_config: rack_user_only
|
||||
wait_for_metadata:
|
||||
rax_service_level_automation: Complete
|
||||
rackconnect_automation_status: DEPLOYED
|
||||
|
||||
Anything else from the create_server_ docs can be passed through here.
|
||||
|
||||
- **image**: Image dict, name or ID to boot with. image is required
|
||||
|
@ -678,12 +696,18 @@ def create(vm_):
|
|||
data = request_instance(conn=conn, call='action', vm_=vm_)
|
||||
log.debug('VM is now running')
|
||||
|
||||
def __query_node_ip(vm_):
|
||||
def __query_node(vm_):
|
||||
data = show_instance(vm_['name'], conn=conn, call='action')
|
||||
if 'wait_for_metadata' in vm_:
|
||||
for key, value in six.iteritems(vm_.get('wait_for_metadata', {})):
|
||||
log.debug('Waiting for metadata: {0}={1}'.format(key, value))
|
||||
if data['metadata'].get(key, None) != value:
|
||||
log.debug('Metadata is not ready: {0}={1}'.format(key, data['metadata'].get(key, None)))
|
||||
return False
|
||||
return preferred_ip(vm_, data[ssh_interface(vm_)])
|
||||
try:
|
||||
ip_address = __utils__['cloud.wait_for_ip'](
|
||||
__query_node_ip,
|
||||
ip_address = __utils__['cloud.wait_for_fun'](
|
||||
__query_node,
|
||||
update_args=(vm_,)
|
||||
)
|
||||
except (SaltCloudExecutionTimeout, SaltCloudExecutionFailure) as exc:
|
||||
|
|
|
@ -22,6 +22,7 @@ from zipimport import zipimporter
|
|||
import salt.config
|
||||
import salt.syspaths
|
||||
import salt.utils.context
|
||||
import salt.utils.data
|
||||
import salt.utils.dictupdate
|
||||
import salt.utils.event
|
||||
import salt.utils.files
|
||||
|
@ -651,7 +652,7 @@ def _load_cached_grains(opts, cfn):
|
|||
try:
|
||||
serial = salt.payload.Serial(opts)
|
||||
with salt.utils.files.fopen(cfn, 'rb') as fp_:
|
||||
cached_grains = serial.load(fp_)
|
||||
cached_grains = salt.utils.data.decode(serial.load(fp_))
|
||||
if not cached_grains:
|
||||
log.debug('Cached grains are empty, cache might be corrupted. Refreshing.')
|
||||
return None
|
||||
|
@ -818,7 +819,7 @@ def grains(opts, force_refresh=False, proxy=None):
|
|||
salt.utils.dictupdate.update(grains_data, opts['grains'])
|
||||
else:
|
||||
grains_data.update(opts['grains'])
|
||||
return grains_data
|
||||
return salt.utils.data.decode(grains_data)
|
||||
|
||||
|
||||
# TODO: get rid of? Does anyone use this? You should use raw() instead
|
||||
|
|
|
@ -12,6 +12,7 @@ import functools
|
|||
import glob
|
||||
import logging
|
||||
import os
|
||||
import platform
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
|
@ -3137,9 +3138,14 @@ def powershell(cmd,
|
|||
python_shell = True
|
||||
|
||||
# Append PowerShell Object formatting
|
||||
cmd += ' | ConvertTo-JSON'
|
||||
if depth is not None:
|
||||
cmd += ' -Depth {0}'.format(depth)
|
||||
# ConvertTo-JSON is only available on Versions of Windows greater than
|
||||
# `7.1.7600`. We have to use `platform.version` instead of `__grains__` here
|
||||
# because this function is called by `salt/grains/core.py` before
|
||||
# `__grains__` is populated
|
||||
if salt.utils.versions.version_cmp(platform.version(), '7.1.7600') == 1:
|
||||
cmd += ' | ConvertTo-JSON'
|
||||
if depth is not None:
|
||||
cmd += ' -Depth {0}'.format(depth)
|
||||
|
||||
if encode_cmd:
|
||||
# Convert the cmd to UTF-16LE without a BOM and base64 encode.
|
||||
|
@ -3156,7 +3162,7 @@ def powershell(cmd,
|
|||
# caught in a try/catch block. For example, the `Get-WmiObject` command will
|
||||
# often return a "Non Terminating Error". To fix this, make sure
|
||||
# `-ErrorAction Stop` is set in the powershell command
|
||||
cmd = 'try {' + cmd + '} catch { "{}" | ConvertTo-JSON}'
|
||||
cmd = 'try {' + cmd + '} catch { "{}" }'
|
||||
|
||||
# Retrieve the response, while overriding shell with 'powershell'
|
||||
response = run(cmd,
|
||||
|
|
|
@ -103,6 +103,13 @@ def _auth(profile=None, api_version=2, **connection_args):
|
|||
|
||||
Only intended to be used within glance-enabled modules
|
||||
'''
|
||||
__utils__['versions.warn_until'](
|
||||
'Neon',
|
||||
(
|
||||
'The glance module has been deprecated and will be removed in {version}. '
|
||||
'Please update to using the glanceng module'
|
||||
),
|
||||
)
|
||||
|
||||
if profile:
|
||||
prefix = profile + ":keystone."
|
||||
|
|
|
@ -163,6 +163,13 @@ def auth(profile=None, **connection_args):
|
|||
|
||||
salt '*' keystone.auth
|
||||
'''
|
||||
__utils__['versions.warn_until'](
|
||||
'Neon',
|
||||
(
|
||||
'The keystone module has been deprecated and will be removed in {version}. '
|
||||
'Please update to using the keystoneng module',
|
||||
),
|
||||
)
|
||||
kwargs = _get_kwargs(profile=profile, **connection_args)
|
||||
|
||||
disc = discover.Discover(auth_url=kwargs['auth_url'])
|
||||
|
|
|
@ -164,7 +164,6 @@ import salt.utils.stringutils
|
|||
import salt.utils.win_functions
|
||||
import salt.utils.win_dacl
|
||||
|
||||
|
||||
REQ_ERROR = None
|
||||
try:
|
||||
import libnacl.secret
|
||||
|
@ -186,9 +185,9 @@ def _get_config(**kwargs):
|
|||
config = {
|
||||
'box_type': 'sealedbox',
|
||||
'sk': None,
|
||||
'sk_file': '/etc/salt/pki/master/nacl',
|
||||
'sk_file': os.path.join(__opts__['pki_dir'], 'master/nacl'),
|
||||
'pk': None,
|
||||
'pk_file': '/etc/salt/pki/master/nacl.pub',
|
||||
'pk_file': os.path.join(__opts__['pki_dir'], 'master/nacl.pub'),
|
||||
}
|
||||
config_key = '{0}.config'.format(__virtualname__)
|
||||
try:
|
||||
|
@ -233,7 +232,7 @@ def _get_pk(**kwargs):
|
|||
return base64.b64decode(pubkey)
|
||||
|
||||
|
||||
def keygen(sk_file=None, pk_file=None):
|
||||
def keygen(sk_file=None, pk_file=None, **kwargs):
|
||||
'''
|
||||
Use libnacl to generate a keypair.
|
||||
|
||||
|
@ -253,6 +252,14 @@ def keygen(sk_file=None, pk_file=None):
|
|||
salt-call nacl.keygen sk_file=/etc/salt/pki/master/nacl pk_file=/etc/salt/pki/master/nacl.pub
|
||||
salt-call --local nacl.keygen
|
||||
'''
|
||||
if 'keyfile' in kwargs:
|
||||
salt.utils.versions.warn_until(
|
||||
'Fluorine',
|
||||
'The \'keyfile\' argument has been deprecated and will be removed in Salt '
|
||||
'{version}. Please use \'sk_file\' argument instead.'
|
||||
)
|
||||
sk_file = kwargs['keyfile']
|
||||
|
||||
if sk_file is None:
|
||||
kp = libnacl.public.SecretKey()
|
||||
return {'sk': base64.b64encode(kp.sk), 'pk': base64.b64encode(kp.pk)}
|
||||
|
@ -313,6 +320,25 @@ def enc(data, **kwargs):
|
|||
|
||||
box_type: secretbox, sealedbox(default)
|
||||
'''
|
||||
if 'keyfile' in kwargs:
|
||||
salt.utils.versions.warn_until(
|
||||
'Fluorine',
|
||||
'The \'keyfile\' argument has been deprecated and will be removed in Salt '
|
||||
'{version}. Please use \'sk_file\' argument instead.'
|
||||
)
|
||||
kwargs['sk_file'] = kwargs['keyfile']
|
||||
|
||||
if 'key' in kwargs:
|
||||
salt.utils.versions.warn_until(
|
||||
'Fluorine',
|
||||
'The \'key\' argument has been deprecated and will be removed in Salt '
|
||||
'{version}. Please use \'sk\' argument instead.'
|
||||
)
|
||||
kwargs['sk'] = kwargs['key']
|
||||
|
||||
# ensure data is in bytes
|
||||
data = salt.utils.stringutils.to_bytes(data)
|
||||
|
||||
box_type = _get_config(**kwargs)['box_type']
|
||||
if box_type == 'sealedbox':
|
||||
return sealedbox_encrypt(data, **kwargs)
|
||||
|
@ -360,6 +386,31 @@ def dec(data, **kwargs):
|
|||
|
||||
box_type: secretbox, sealedbox(default)
|
||||
'''
|
||||
if 'keyfile' in kwargs:
|
||||
salt.utils.versions.warn_until(
|
||||
'Fluorine',
|
||||
'The \'keyfile\' argument has been deprecated and will be removed in Salt '
|
||||
'{version}. Please use \'sk_file\' argument instead.'
|
||||
)
|
||||
kwargs['sk_file'] = kwargs['keyfile']
|
||||
|
||||
# set boxtype to `secretbox` to maintain backward compatibility
|
||||
kwargs['box_type'] = 'secretbox'
|
||||
|
||||
if 'key' in kwargs:
|
||||
salt.utils.versions.warn_until(
|
||||
'Fluorine',
|
||||
'The \'key\' argument has been deprecated and will be removed in Salt '
|
||||
'{version}. Please use \'sk\' argument instead.'
|
||||
)
|
||||
kwargs['sk'] = kwargs['key']
|
||||
|
||||
# set boxtype to `secretbox` to maintain backward compatibility
|
||||
kwargs['box_type'] = 'secretbox'
|
||||
|
||||
# ensure data is in bytes
|
||||
data = salt.utils.stringutils.to_bytes(data)
|
||||
|
||||
box_type = _get_config(**kwargs)['box_type']
|
||||
if box_type == 'sealedbox':
|
||||
return sealedbox_decrypt(data, **kwargs)
|
||||
|
@ -414,6 +465,9 @@ def sealedbox_encrypt(data, **kwargs):
|
|||
salt-call --local nacl.sealedbox_encrypt datatoenc pk_file=/etc/salt/pki/master/nacl.pub
|
||||
salt-call --local nacl.sealedbox_encrypt datatoenc pk='vrwQF7cNiNAVQVAiS3bvcbJUnF0cN6fU9YTZD9mBfzQ='
|
||||
'''
|
||||
# ensure data is in bytes
|
||||
data = salt.utils.stringutils.to_bytes(data)
|
||||
|
||||
pk = _get_pk(**kwargs)
|
||||
b = libnacl.sealed.SealedBox(pk)
|
||||
return base64.b64encode(b.encrypt(data))
|
||||
|
@ -433,6 +487,10 @@ def sealedbox_decrypt(data, **kwargs):
|
|||
'''
|
||||
if data is None:
|
||||
return None
|
||||
|
||||
# ensure data is in bytes
|
||||
data = salt.utils.stringutils.to_bytes(data)
|
||||
|
||||
sk = _get_sk(**kwargs)
|
||||
keypair = libnacl.public.SecretKey(sk)
|
||||
b = libnacl.sealed.SealedBox(keypair)
|
||||
|
@ -452,6 +510,9 @@ def secretbox_encrypt(data, **kwargs):
|
|||
salt-call --local nacl.secretbox_encrypt datatoenc sk_file=/etc/salt/pki/master/nacl
|
||||
salt-call --local nacl.secretbox_encrypt datatoenc sk='YmFkcGFzcwo='
|
||||
'''
|
||||
# ensure data is in bytes
|
||||
data = salt.utils.stringutils.to_bytes(data)
|
||||
|
||||
sk = _get_sk(**kwargs)
|
||||
b = libnacl.secret.SecretBox(sk)
|
||||
return base64.b64encode(b.encrypt(data))
|
||||
|
@ -472,6 +533,10 @@ def secretbox_decrypt(data, **kwargs):
|
|||
'''
|
||||
if data is None:
|
||||
return None
|
||||
|
||||
# ensure data is in bytes
|
||||
data = salt.utils.stringutils.to_bytes(data)
|
||||
|
||||
key = _get_sk(**kwargs)
|
||||
b = libnacl.secret.SecretBox(key=key)
|
||||
return b.decrypt(base64.b64decode(data))
|
||||
|
|
|
@ -1618,167 +1618,3 @@ def list_agents(profile=None):
|
|||
'''
|
||||
conn = _auth(profile)
|
||||
return conn.list_agents()
|
||||
|
||||
|
||||
# The following is a list of functions that need to be incorporated in the
|
||||
# neutron module. This list should be updated as functions are added.
|
||||
#
|
||||
# update_ipsec_site_connection
|
||||
# Updates an IPsecSiteConnection.
|
||||
# update_ikepolicy Updates an IKEPolicy
|
||||
# update_ipsecpolicy Updates an IPsecPolicy
|
||||
# list_vips Fetches a list of all load balancer vips for a tenant.
|
||||
# show_vip Fetches information of a certain load balancer vip.
|
||||
# create_vip Creates a new load balancer vip.
|
||||
# update_vip Updates a load balancer vip.
|
||||
# delete_vip Deletes the specified load balancer vip.
|
||||
# list_pools Fetches a list of all load balancer pools for a tenant.
|
||||
# show_pool Fetches information of a certain load balancer pool.
|
||||
# create_pool Creates a new load balancer pool.
|
||||
# update_pool Updates a load balancer pool.
|
||||
# delete_pool Deletes the specified load balancer pool.
|
||||
# retrieve_pool_stats Retrieves stats for a certain load balancer pool.
|
||||
# list_members Fetches a list of all load balancer members for
|
||||
# a tenant.
|
||||
# show_member Fetches information of a certain load balancer member.
|
||||
# create_member Creates a new load balancer member.
|
||||
# update_member Updates a load balancer member.
|
||||
# delete_member Deletes the specified load balancer member.
|
||||
# list_health_monitors Fetches a list of all load balancer health monitors for
|
||||
# a tenant.
|
||||
# show_health_monitor Fetches information of a certain load balancer
|
||||
# health monitor.
|
||||
# create_health_monitor
|
||||
# Creates a new load balancer health monitor.
|
||||
# update_health_monitor
|
||||
# Updates a load balancer health monitor.
|
||||
# delete_health_monitor
|
||||
# Deletes the specified load balancer health monitor.
|
||||
# associate_health_monitor
|
||||
# Associate specified load balancer health monitor
|
||||
# and pool.
|
||||
# disassociate_health_monitor
|
||||
# Disassociate specified load balancer health monitor
|
||||
# and pool.
|
||||
# create_qos_queue Creates a new queue.
|
||||
# list_qos_queues Fetches a list of all queues for a tenant.
|
||||
# show_qos_queue Fetches information of a certain queue.
|
||||
# delete_qos_queue Deletes the specified queue.
|
||||
# list_agents Fetches agents.
|
||||
# show_agent Fetches information of a certain agent.
|
||||
# update_agent Updates an agent.
|
||||
# delete_agent Deletes the specified agent.
|
||||
# list_network_gateways
|
||||
# Retrieve network gateways.
|
||||
# show_network_gateway Fetch a network gateway.
|
||||
# create_network_gateway
|
||||
# Create a new network gateway.
|
||||
# update_network_gateway
|
||||
# Update a network gateway.
|
||||
# delete_network_gateway
|
||||
# Delete the specified network gateway.
|
||||
# connect_network_gateway
|
||||
# Connect a network gateway to the specified network.
|
||||
# disconnect_network_gateway
|
||||
# Disconnect a network from the specified gateway.
|
||||
# list_gateway_devices Retrieve gateway devices.
|
||||
# show_gateway_device Fetch a gateway device.
|
||||
# create_gateway_device
|
||||
# Create a new gateway device.
|
||||
# update_gateway_device
|
||||
# Updates a new gateway device.
|
||||
# delete_gateway_device
|
||||
# Delete the specified gateway device.
|
||||
# list_dhcp_agent_hosting_networks
|
||||
# Fetches a list of dhcp agents hosting a network.
|
||||
# list_networks_on_dhcp_agent
|
||||
# Fetches a list of dhcp agents hosting a network.
|
||||
# add_network_to_dhcp_agent
|
||||
# Adds a network to dhcp agent.
|
||||
# remove_network_from_dhcp_agent
|
||||
# Remove a network from dhcp agent.
|
||||
# list_l3_agent_hosting_routers
|
||||
# Fetches a list of L3 agents hosting a router.
|
||||
# list_routers_on_l3_agent
|
||||
# Fetches a list of L3 agents hosting a router.
|
||||
# add_router_to_l3_agent
|
||||
# Adds a router to L3 agent.
|
||||
# list_firewall_rules Fetches a list of all firewall rules for a tenant.
|
||||
# show_firewall_rule Fetches information of a certain firewall rule.
|
||||
# create_firewall_rule Creates a new firewall rule.
|
||||
# update_firewall_rule Updates a firewall rule.
|
||||
# delete_firewall_rule Deletes the specified firewall rule.
|
||||
# list_firewall_policies
|
||||
# Fetches a list of all firewall policies for a tenant.
|
||||
# show_firewall_policy Fetches information of a certain firewall policy.
|
||||
# create_firewall_policy
|
||||
# Creates a new firewall policy.
|
||||
# update_firewall_policy
|
||||
# Updates a firewall policy.
|
||||
# delete_firewall_policy
|
||||
# Deletes the specified firewall policy.
|
||||
# firewall_policy_insert_rule
|
||||
# Inserts specified rule into firewall policy.
|
||||
# firewall_policy_remove_rule
|
||||
# Removes specified rule from firewall policy.
|
||||
# list_firewalls Fetches a list of all firewals for a tenant.
|
||||
# show_firewall Fetches information of a certain firewall.
|
||||
# create_firewall Creates a new firewall.
|
||||
# update_firewall Updates a firewall.
|
||||
# delete_firewall Deletes the specified firewall.
|
||||
# remove_router_from_l3_agent
|
||||
# Remove a router from l3 agent.
|
||||
# get_lbaas_agent_hosting_pool
|
||||
# Fetches a loadbalancer agent hosting a pool.
|
||||
# list_pools_on_lbaas_agent
|
||||
# Fetches a list of pools hosted by
|
||||
# the loadbalancer agent.
|
||||
# list_service_providers
|
||||
# Fetches service providers.
|
||||
# list_credentials Fetch a list of all credentials for a tenant.
|
||||
# show_credential Fetch a credential.
|
||||
# create_credential Create a new credential.
|
||||
# update_credential Update a credential.
|
||||
# delete_credential Delete the specified credential.
|
||||
# list_network_profile_bindings
|
||||
# Fetch a list of all tenants associated for
|
||||
# a network profile.
|
||||
# list_network_profiles
|
||||
# Fetch a list of all network profiles for a tenant.
|
||||
# show_network_profile Fetch a network profile.
|
||||
# create_network_profile
|
||||
# Create a network profile.
|
||||
# update_network_profile
|
||||
# Update a network profile.
|
||||
# delete_network_profile
|
||||
# Delete the network profile.
|
||||
# list_policy_profile_bindings
|
||||
# Fetch a list of all tenants associated for
|
||||
# a policy profile.
|
||||
# list_policy_profiles Fetch a list of all network profiles for a tenant.
|
||||
# show_policy_profile Fetch a network profile.
|
||||
# update_policy_profile
|
||||
# Update a policy profile.
|
||||
# create_metering_label
|
||||
# Creates a metering label.
|
||||
# delete_metering_label
|
||||
# Deletes the specified metering label.
|
||||
# list_metering_labels Fetches a list of all metering labels for a tenant.
|
||||
# show_metering_label Fetches information of a certain metering label.
|
||||
# create_metering_label_rule
|
||||
# Creates a metering label rule.
|
||||
# delete_metering_label_rule
|
||||
# Deletes the specified metering label rule.
|
||||
# list_metering_label_rules
|
||||
# Fetches a list of all metering label rules for a label.
|
||||
# show_metering_label_rule
|
||||
# Fetches information of a certain metering label rule.
|
||||
# list_net_partitions Fetch a list of all network partitions for a tenant.
|
||||
# show_net_partition etch a network partition.
|
||||
# create_net_partition Create a network partition.
|
||||
# delete_net_partition Delete the network partition.
|
||||
# create_packet_filter Create a new packet filter.
|
||||
# update_packet_filter Update a packet filter.
|
||||
# list_packet_filters Fetch a list of all packet filters for a tenant.
|
||||
# show_packet_filter Fetch information of a certain packet filter.
|
||||
# delete_packet_filter Delete the specified packet filter.
|
||||
|
|
|
@ -83,6 +83,9 @@ def _to_unicode(vdata):
|
|||
Converts from current users character encoding to unicode. Use this for
|
||||
parameters being pass to reg functions
|
||||
'''
|
||||
# None does not convert to Unicode
|
||||
if vdata is None:
|
||||
return None
|
||||
return salt.utils.stringutils.to_unicode(vdata, 'utf-8')
|
||||
|
||||
|
||||
|
@ -526,13 +529,13 @@ def set_value(hive,
|
|||
# https://www.python.org/dev/peps/pep-0237/
|
||||
|
||||
# String Types to Unicode
|
||||
if vtype_value in [1, 2]:
|
||||
if vtype_value in [win32con.REG_SZ, win32con.REG_EXPAND_SZ]:
|
||||
local_vdata = _to_unicode(vdata)
|
||||
# Don't touch binary...
|
||||
elif vtype_value == 3:
|
||||
elif vtype_value == win32con.REG_BINARY:
|
||||
local_vdata = vdata
|
||||
# Make sure REG_MULTI_SZ is a list of strings
|
||||
elif vtype_value == 7:
|
||||
elif vtype_value == win32con.REG_MULTI_SZ:
|
||||
local_vdata = [_to_unicode(i) for i in vdata]
|
||||
# Everything else is int
|
||||
else:
|
||||
|
@ -686,7 +689,6 @@ def delete_value(hive, key, vname=None, use_32bit_registry=False):
|
|||
|
||||
salt '*' reg.delete_value HKEY_CURRENT_USER 'SOFTWARE\\Salt' 'version'
|
||||
'''
|
||||
|
||||
local_hive = _to_unicode(hive)
|
||||
local_key = _to_unicode(key)
|
||||
local_vname = _to_unicode(vname)
|
||||
|
|
|
@ -8,9 +8,6 @@ This is often useful if you wish to store your pillars in source control or
|
|||
share your pillar data with others that you trust. I don't advise making your pillars public
|
||||
regardless if they are encrypted or not.
|
||||
|
||||
When generating keys and encrypting passwords use --local when using salt-call for extra
|
||||
security. Also consider using just the salt runner nacl when encrypting pillar passwords.
|
||||
|
||||
:configuration: The following configuration defaults can be
|
||||
define (pillar or config files) Avoid storing private keys in pillars! Ensure master does not have `pillar_opts=True`:
|
||||
|
||||
|
@ -30,7 +27,7 @@ security. Also consider using just the salt runner nacl when encrypting pillar p
|
|||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-call nacl.enc sk_file=/etc/salt/pki/master/nacl pk_file=/etc/salt/pki/master/nacl.pub
|
||||
salt-run nacl.enc sk_file=/etc/salt/pki/master/nacl pk_file=/etc/salt/pki/master/nacl.pub
|
||||
|
||||
|
||||
The nacl lib uses 32byte keys, these keys are base64 encoded to make your life more simple.
|
||||
|
@ -38,9 +35,9 @@ To generate your `sk_file` and `pk_file` use:
|
|||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-call --local nacl.keygen sk_file=/etc/salt/pki/master/nacl
|
||||
salt-run nacl.keygen sk_file=/etc/salt/pki/master/nacl
|
||||
# or if you want to work without files.
|
||||
salt-call --local nacl.keygen
|
||||
salt-run nacl.keygen
|
||||
local:
|
||||
----------
|
||||
pk:
|
||||
|
@ -59,14 +56,14 @@ Sealedbox only has one key that is for both encryption and decryption.
|
|||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-call --local nacl.enc asecretpass pk=/kfGX7PbWeu099702PBbKWLpG/9p06IQRswkdWHCDk0=
|
||||
salt-run nacl.enc asecretpass pk=/kfGX7PbWeu099702PBbKWLpG/9p06IQRswkdWHCDk0=
|
||||
tqXzeIJnTAM9Xf0mdLcpEdklMbfBGPj2oTKmlgrm3S1DTVVHNnh9h8mU1GKllGq/+cYsk6m5WhGdk58=
|
||||
|
||||
To decrypt the data:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-call --local nacl.dec data='tqXzeIJnTAM9Xf0mdLcpEdklMbfBGPj2oTKmlgrm3S1DTVVHNnh9h8mU1GKllGq/+cYsk6m5WhGdk58=' \
|
||||
salt-run nacl.dec data='tqXzeIJnTAM9Xf0mdLcpEdklMbfBGPj2oTKmlgrm3S1DTVVHNnh9h8mU1GKllGq/+cYsk6m5WhGdk58=' \
|
||||
sk='SVWut5SqNpuPeNzb1b9y6b2eXg2PLIog43GBzp48Sow='
|
||||
|
||||
When the keys are defined in the master config you can use them from the nacl runner
|
||||
|
@ -94,7 +91,7 @@ The developer can then use a less-secure system to encrypt data.
|
|||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-call --local nacl.enc apassword
|
||||
salt-run nacl.enc apassword
|
||||
|
||||
|
||||
Pillar files can include protected data that the salt master decrypts:
|
||||
|
@ -111,42 +108,7 @@ Larger files like certificates can be encrypted with:
|
|||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-call nacl.enc_file /tmp/cert.crt out=/tmp/cert.nacl
|
||||
# or more advanced
|
||||
cert=$(cat /tmp/cert.crt)
|
||||
salt-call --out=newline_values_only nacl.enc_pub data="$cert" > /tmp/cert.nacl
|
||||
|
||||
In pillars rended with jinja be sure to include `|json` so line breaks are encoded:
|
||||
|
||||
.. code-block:: jinja
|
||||
|
||||
cert: "{{salt.nacl.dec('S2uogToXkgENz9...085KYt')|json}}"
|
||||
|
||||
In states rendered with jinja it is also good pratice to include `|json`:
|
||||
|
||||
.. code-block:: jinja
|
||||
|
||||
{{sls}} private key:
|
||||
file.managed:
|
||||
- name: /etc/ssl/private/cert.key
|
||||
- mode: 700
|
||||
- contents: "{{pillar['pillarexample']['cert_key']|json}}"
|
||||
|
||||
|
||||
Optional small program to encrypt data without needing salt modules.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/bin/python3
|
||||
import sys, base64, libnacl.sealed
|
||||
pk = base64.b64decode('YOURPUBKEY')
|
||||
b = libnacl.sealed.SealedBox(pk)
|
||||
data = sys.stdin.buffer.read()
|
||||
print(base64.b64encode(b.encrypt(data)).decode())
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
echo 'apassword' | nacl_enc.py
|
||||
salt-run nacl.enc_file /tmp/cert.crt out=/tmp/cert.nacl
|
||||
|
||||
'''
|
||||
|
||||
|
@ -158,6 +120,7 @@ import os
|
|||
# Import Salt libs
|
||||
import salt.utils.files
|
||||
import salt.utils.platform
|
||||
import salt.utils.stringutils
|
||||
import salt.utils.win_functions
|
||||
import salt.utils.win_dacl
|
||||
import salt.syspaths
|
||||
|
@ -186,9 +149,9 @@ def _get_config(**kwargs):
|
|||
config = {
|
||||
'box_type': 'sealedbox',
|
||||
'sk': None,
|
||||
'sk_file': '/etc/salt/pki/master/nacl',
|
||||
'sk_file': os.path.join(__opts__['pki_dir'], 'nacl'),
|
||||
'pk': None,
|
||||
'pk_file': '/etc/salt/pki/master/nacl.pub',
|
||||
'pk_file': os.path.join(__opts__['pki_dir'], 'nacl.pub'),
|
||||
}
|
||||
config_key = '{0}.config'.format(__virtualname__)
|
||||
try:
|
||||
|
@ -233,7 +196,7 @@ def _get_pk(**kwargs):
|
|||
return base64.b64decode(pubkey)
|
||||
|
||||
|
||||
def keygen(sk_file=None, pk_file=None):
|
||||
def keygen(sk_file=None, pk_file=None, **kwargs):
|
||||
'''
|
||||
Use libnacl to generate a keypair.
|
||||
|
||||
|
@ -248,11 +211,20 @@ def keygen(sk_file=None, pk_file=None):
|
|||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-call nacl.keygen
|
||||
salt-call nacl.keygen sk_file=/etc/salt/pki/master/nacl
|
||||
salt-call nacl.keygen sk_file=/etc/salt/pki/master/nacl pk_file=/etc/salt/pki/master/nacl.pub
|
||||
salt-call --local nacl.keygen
|
||||
salt-run nacl.keygen
|
||||
salt-run nacl.keygen sk_file=/etc/salt/pki/master/nacl
|
||||
salt-run nacl.keygen sk_file=/etc/salt/pki/master/nacl pk_file=/etc/salt/pki/master/nacl.pub
|
||||
salt-run nacl.keygen
|
||||
'''
|
||||
|
||||
if 'keyfile' in kwargs:
|
||||
salt.utils.versions.warn_until(
|
||||
'Fluorine',
|
||||
'The \'keyfile\' argument has been deprecated and will be removed in Salt '
|
||||
'{version}. Please use \'sk_file\' argument instead.'
|
||||
)
|
||||
sk_file = kwargs['keyfile']
|
||||
|
||||
if sk_file is None:
|
||||
kp = libnacl.public.SecretKey()
|
||||
return {'sk': base64.b64encode(kp.sk), 'pk': base64.b64encode(kp.pk)}
|
||||
|
@ -313,6 +285,26 @@ def enc(data, **kwargs):
|
|||
|
||||
box_type: secretbox, sealedbox(default)
|
||||
'''
|
||||
|
||||
if 'keyfile' in kwargs:
|
||||
salt.utils.versions.warn_until(
|
||||
'Fluorine',
|
||||
'The \'keyfile\' argument has been deprecated and will be removed in Salt '
|
||||
'{version}. Please use \'sk_file\' argument instead.'
|
||||
)
|
||||
kwargs['sk_file'] = kwargs['keyfile']
|
||||
|
||||
if 'key' in kwargs:
|
||||
salt.utils.versions.warn_until(
|
||||
'Fluorine',
|
||||
'The \'key\' argument has been deprecated and will be removed in Salt '
|
||||
'{version}. Please use \'sk\' argument instead.'
|
||||
)
|
||||
kwargs['sk'] = kwargs['key']
|
||||
|
||||
# ensure data is bytes
|
||||
data = salt.utils.stringutils.to_bytes(data)
|
||||
|
||||
box_type = _get_config(**kwargs)['box_type']
|
||||
if box_type == 'sealedbox':
|
||||
return sealedbox_encrypt(data, **kwargs)
|
||||
|
@ -334,7 +326,6 @@ def enc_file(name, out=None, **kwargs):
|
|||
.. code-block:: bash
|
||||
|
||||
salt-run nacl.enc_file name=/tmp/id_rsa
|
||||
salt-call nacl.enc_file name=salt://crt/mycert out=/tmp/cert
|
||||
salt-run nacl.enc_file name=/tmp/id_rsa box_type=secretbox \
|
||||
sk_file=/etc/salt/pki/master/nacl.pub
|
||||
'''
|
||||
|
@ -360,6 +351,31 @@ def dec(data, **kwargs):
|
|||
|
||||
box_type: secretbox, sealedbox(default)
|
||||
'''
|
||||
if 'keyfile' in kwargs:
|
||||
salt.utils.versions.warn_until(
|
||||
'Fluorine',
|
||||
'The \'keyfile\' argument has been deprecated and will be removed in Salt '
|
||||
'{version}. Please use \'sk_file\' argument instead.'
|
||||
)
|
||||
kwargs['sk_file'] = kwargs['keyfile']
|
||||
|
||||
# set boxtype to `secretbox` to maintain backward compatibility
|
||||
kwargs['box_type'] = 'secretbox'
|
||||
|
||||
if 'key' in kwargs:
|
||||
salt.utils.versions.warn_until(
|
||||
'Fluorine',
|
||||
'The \'key\' argument has been deprecated and will be removed in Salt '
|
||||
'{version}. Please use \'sk\' argument instead.'
|
||||
)
|
||||
kwargs['sk'] = kwargs['key']
|
||||
|
||||
# set boxtype to `secretbox` to maintain backward compatibility
|
||||
kwargs['box_type'] = 'secretbox'
|
||||
|
||||
# ensure data is bytes
|
||||
data = salt.utils.stringutils.to_bytes(data)
|
||||
|
||||
box_type = _get_config(**kwargs)['box_type']
|
||||
if box_type == 'sealedbox':
|
||||
return sealedbox_decrypt(data, **kwargs)
|
||||
|
@ -381,7 +397,6 @@ def dec_file(name, out=None, **kwargs):
|
|||
.. code-block:: bash
|
||||
|
||||
salt-run nacl.dec_file name=/tmp/id_rsa.nacl
|
||||
salt-call nacl.dec_file name=salt://crt/mycert.nacl out=/tmp/id_rsa
|
||||
salt-run nacl.dec_file name=/tmp/id_rsa.nacl box_type=secretbox \
|
||||
sk_file=/etc/salt/pki/master/nacl.pub
|
||||
'''
|
||||
|
@ -411,9 +426,10 @@ def sealedbox_encrypt(data, **kwargs):
|
|||
.. code-block:: bash
|
||||
|
||||
salt-run nacl.sealedbox_encrypt datatoenc
|
||||
salt-call --local nacl.sealedbox_encrypt datatoenc pk_file=/etc/salt/pki/master/nacl.pub
|
||||
salt-call --local nacl.sealedbox_encrypt datatoenc pk='vrwQF7cNiNAVQVAiS3bvcbJUnF0cN6fU9YTZD9mBfzQ='
|
||||
'''
|
||||
# ensure data is bytes
|
||||
data = salt.utils.stringutils.to_bytes(data)
|
||||
|
||||
pk = _get_pk(**kwargs)
|
||||
b = libnacl.sealed.SealedBox(pk)
|
||||
return base64.b64encode(b.encrypt(data))
|
||||
|
@ -427,12 +443,16 @@ def sealedbox_decrypt(data, **kwargs):
|
|||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-call nacl.sealedbox_decrypt pEXHQM6cuaF7A=
|
||||
salt-call --local nacl.sealedbox_decrypt data='pEXHQM6cuaF7A=' sk_file=/etc/salt/pki/master/nacl
|
||||
salt-call --local nacl.sealedbox_decrypt data='pEXHQM6cuaF7A=' sk='YmFkcGFzcwo='
|
||||
salt-run nacl.sealedbox_decrypt pEXHQM6cuaF7A=
|
||||
salt-run nacl.sealedbox_decrypt data='pEXHQM6cuaF7A=' sk_file=/etc/salt/pki/master/nacl
|
||||
salt-run nacl.sealedbox_decrypt data='pEXHQM6cuaF7A=' sk='YmFkcGFzcwo='
|
||||
'''
|
||||
if data is None:
|
||||
return None
|
||||
|
||||
# ensure data is bytes
|
||||
data = salt.utils.stringutils.to_bytes(data)
|
||||
|
||||
sk = _get_sk(**kwargs)
|
||||
keypair = libnacl.public.SecretKey(sk)
|
||||
b = libnacl.sealed.SealedBox(keypair)
|
||||
|
@ -449,9 +469,12 @@ def secretbox_encrypt(data, **kwargs):
|
|||
.. code-block:: bash
|
||||
|
||||
salt-run nacl.secretbox_encrypt datatoenc
|
||||
salt-call --local nacl.secretbox_encrypt datatoenc sk_file=/etc/salt/pki/master/nacl
|
||||
salt-call --local nacl.secretbox_encrypt datatoenc sk='YmFkcGFzcwo='
|
||||
salt-run nacl.secretbox_encrypt datatoenc sk_file=/etc/salt/pki/master/nacl
|
||||
salt-run nacl.secretbox_encrypt datatoenc sk='YmFkcGFzcwo='
|
||||
'''
|
||||
# ensure data is bytes
|
||||
data = salt.utils.stringutils.to_bytes(data)
|
||||
|
||||
sk = _get_sk(**kwargs)
|
||||
b = libnacl.secret.SecretBox(sk)
|
||||
return base64.b64encode(b.encrypt(data))
|
||||
|
@ -466,12 +489,16 @@ def secretbox_decrypt(data, **kwargs):
|
|||
|
||||
.. code-block:: bash
|
||||
|
||||
salt-call nacl.secretbox_decrypt pEXHQM6cuaF7A=
|
||||
salt-call --local nacl.secretbox_decrypt data='pEXHQM6cuaF7A=' sk_file=/etc/salt/pki/master/nacl
|
||||
salt-call --local nacl.secretbox_decrypt data='pEXHQM6cuaF7A=' sk='YmFkcGFzcwo='
|
||||
salt-run nacl.secretbox_decrypt pEXHQM6cuaF7A=
|
||||
salt-run nacl.secretbox_decrypt data='pEXHQM6cuaF7A=' sk_file=/etc/salt/pki/master/nacl
|
||||
salt-run nacl.secretbox_decrypt data='pEXHQM6cuaF7A=' sk='YmFkcGFzcwo='
|
||||
'''
|
||||
if data is None:
|
||||
return None
|
||||
|
||||
# ensure data is bytes
|
||||
data = salt.utils.stringutils.to_bytes(data)
|
||||
|
||||
key = _get_sk(**kwargs)
|
||||
b = libnacl.secret.SecretBox(key=key)
|
||||
return b.decrypt(base64.b64decode(data))
|
||||
|
|
|
@ -27,7 +27,7 @@ Once configured you can access data using a URL such as:
|
|||
|
||||
.. code-block:: yaml
|
||||
|
||||
password: sdb://myvault/secret/passwords?mypassword
|
||||
password: sdb://myvault/secret/passwords/mypassword
|
||||
|
||||
In this URL, ``myvault`` refers to the configuration profile,
|
||||
``secret/passwords`` is the path where the data resides, and ``mypassword`` is
|
||||
|
@ -56,9 +56,17 @@ def set_(key, value, profile=None):
|
|||
'''
|
||||
Set a key/value pair in the vault service
|
||||
'''
|
||||
comps = key.split('?')
|
||||
path = comps[0]
|
||||
key = comps[1]
|
||||
if '?' in key:
|
||||
__utils__['versions.warn_until'](
|
||||
'Neon',
|
||||
(
|
||||
'Using ? to seperate between the path and key for vault has been deprecated '
|
||||
'and will be removed in {version}. Please just use a /.'
|
||||
),
|
||||
)
|
||||
path, key = key.split('?')
|
||||
else:
|
||||
path, key = key.rsplit('/', 1)
|
||||
|
||||
try:
|
||||
url = 'v1/{0}'.format(path)
|
||||
|
@ -81,9 +89,17 @@ def get(key, profile=None):
|
|||
'''
|
||||
Get a value from the vault service
|
||||
'''
|
||||
comps = key.split('?')
|
||||
path = comps[0]
|
||||
key = comps[1]
|
||||
if '?' in key:
|
||||
__utils__['versions.warn_until'](
|
||||
'Neon',
|
||||
(
|
||||
'Using ? to seperate between the path and key for vault has been deprecated '
|
||||
'and will be removed in {version}. Please just use a /.'
|
||||
),
|
||||
)
|
||||
path, key = key.split('?')
|
||||
else:
|
||||
path, key = key.rsplit('/', 1)
|
||||
|
||||
try:
|
||||
url = 'v1/{0}'.format(path)
|
||||
|
|
|
@ -720,8 +720,12 @@ class State(object):
|
|||
except AttributeError:
|
||||
pillar_enc = six.text_type(pillar_enc).lower()
|
||||
self._pillar_enc = pillar_enc
|
||||
if initial_pillar:
|
||||
if initial_pillar and not self._pillar_override:
|
||||
self.opts['pillar'] = initial_pillar
|
||||
else:
|
||||
# Compile pillar data
|
||||
self.opts['pillar'] = self._gather_pillar()
|
||||
# Reapply overrides on top of compiled pillar
|
||||
if self._pillar_override:
|
||||
self.opts['pillar'] = salt.utils.dictupdate.merge(
|
||||
self.opts['pillar'],
|
||||
|
@ -729,8 +733,6 @@ class State(object):
|
|||
self.opts.get('pillar_source_merging_strategy', 'smart'),
|
||||
self.opts.get('renderer', 'yaml'),
|
||||
self.opts.get('pillar_merge_lists', False))
|
||||
else:
|
||||
self.opts['pillar'] = self._gather_pillar()
|
||||
self.state_con = context or {}
|
||||
self.load_modules()
|
||||
self.active = set()
|
||||
|
|
|
@ -81,6 +81,13 @@ class SaltNeutron(NeutronShell):
|
|||
'''
|
||||
Set up neutron credentials
|
||||
'''
|
||||
__utils__['versions.warn_until'](
|
||||
'Neon',
|
||||
(
|
||||
'The neutron module has been deprecated and will be removed in {version}. '
|
||||
'Please update to using the neutronng module'
|
||||
),
|
||||
)
|
||||
if not HAS_NEUTRON:
|
||||
return None
|
||||
|
||||
|
|
66
tests/integration/modules/test_nacl.py
Normal file
66
tests/integration/modules/test_nacl.py
Normal file
|
@ -0,0 +1,66 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
'''
|
||||
Tests for the salt-run command
|
||||
'''
|
||||
# Import Python libs
|
||||
from __future__ import absolute_import, print_function, unicode_literals
|
||||
|
||||
import salt.utils.stringutils
|
||||
|
||||
# Import Salt Testing libs
|
||||
from tests.support.case import ModuleCase
|
||||
from tests.support.unit import skipIf
|
||||
|
||||
try:
|
||||
import libnacl # pylint: disable=unused-import
|
||||
HAS_LIBNACL = True
|
||||
except ImportError:
|
||||
HAS_LIBNACL = False
|
||||
|
||||
|
||||
@skipIf(not HAS_LIBNACL, 'skipping test_nacl, libnacl is unavailable')
|
||||
class NaclTest(ModuleCase):
|
||||
'''
|
||||
Test the nacl runner
|
||||
'''
|
||||
def test_keygen(self):
|
||||
'''
|
||||
Test keygen
|
||||
'''
|
||||
# Store the data
|
||||
ret = self.run_function(
|
||||
'nacl.keygen',
|
||||
)
|
||||
self.assertIn('pk', ret)
|
||||
self.assertIn('sk', ret)
|
||||
|
||||
def test_enc_dec(self):
|
||||
'''
|
||||
Generate keys, encrypt, then decrypt.
|
||||
'''
|
||||
# Store the data
|
||||
ret = self.run_function(
|
||||
'nacl.keygen',
|
||||
)
|
||||
self.assertIn('pk', ret)
|
||||
self.assertIn('sk', ret)
|
||||
pk = ret['pk']
|
||||
sk = ret['sk']
|
||||
|
||||
unencrypted_data = salt.utils.stringutils.to_bytes('hello')
|
||||
|
||||
# Encrypt with pk
|
||||
ret = self.run_function(
|
||||
'nacl.enc',
|
||||
data=unencrypted_data,
|
||||
pk=pk,
|
||||
)
|
||||
encrypted_data = ret
|
||||
|
||||
# Decrypt with sk
|
||||
ret = self.run_function(
|
||||
'nacl.dec',
|
||||
data=encrypted_data,
|
||||
sk=sk,
|
||||
)
|
||||
self.assertEqual(unencrypted_data, ret)
|
89
tests/integration/runners/test_nacl.py
Normal file
89
tests/integration/runners/test_nacl.py
Normal file
|
@ -0,0 +1,89 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
'''
|
||||
Tests for the salt-run command
|
||||
'''
|
||||
# Import Python libs
|
||||
from __future__ import absolute_import, print_function, unicode_literals
|
||||
|
||||
# Import Salt Testing libs
|
||||
from tests.support.case import ShellCase
|
||||
from tests.support.unit import skipIf
|
||||
|
||||
try:
|
||||
import libnacl # pylint: disable=unused-import
|
||||
HAS_LIBNACL = True
|
||||
except ImportError:
|
||||
HAS_LIBNACL = False
|
||||
|
||||
|
||||
@skipIf(not HAS_LIBNACL, 'skipping test_nacl, libnacl is unavailable')
|
||||
class NaclTest(ShellCase):
|
||||
'''
|
||||
Test the nacl runner
|
||||
'''
|
||||
def test_keygen(self):
|
||||
'''
|
||||
Test keygen
|
||||
'''
|
||||
# Store the data
|
||||
ret = self.run_run_plus(
|
||||
'nacl.keygen',
|
||||
)
|
||||
self.assertIn('pk', ret['return'])
|
||||
self.assertIn('sk', ret['return'])
|
||||
|
||||
def test_enc(self):
|
||||
'''
|
||||
Test keygen
|
||||
'''
|
||||
# Store the data
|
||||
ret = self.run_run_plus(
|
||||
'nacl.keygen',
|
||||
)
|
||||
self.assertIn('pk', ret['return'])
|
||||
self.assertIn('sk', ret['return'])
|
||||
pk = ret['return']['pk']
|
||||
sk = ret['return']['sk']
|
||||
|
||||
unencrypted_data = 'hello'
|
||||
|
||||
# Encrypt with pk
|
||||
ret = self.run_run_plus(
|
||||
'nacl.enc',
|
||||
data=unencrypted_data,
|
||||
pk=pk,
|
||||
)
|
||||
self.assertIn('return', ret)
|
||||
|
||||
def test_enc_dec(self):
|
||||
'''
|
||||
Store, list, fetch, then flush data
|
||||
'''
|
||||
# Store the data
|
||||
ret = self.run_run_plus(
|
||||
'nacl.keygen',
|
||||
)
|
||||
self.assertIn('pk', ret['return'])
|
||||
self.assertIn('sk', ret['return'])
|
||||
pk = ret['return']['pk']
|
||||
sk = ret['return']['sk']
|
||||
|
||||
unencrypted_data = 'hello'
|
||||
|
||||
# Encrypt with pk
|
||||
ret = self.run_run_plus(
|
||||
'nacl.enc',
|
||||
data=unencrypted_data,
|
||||
pk=pk,
|
||||
)
|
||||
self.assertIn('return', ret)
|
||||
encrypted_data = ret['return']
|
||||
|
||||
# Decrypt with sk
|
||||
ret = self.run_run_plus(
|
||||
'nacl.dec',
|
||||
data=encrypted_data,
|
||||
sk=sk,
|
||||
)
|
||||
self.assertIn('return', ret)
|
||||
self.assertEqual(unencrypted_data, ret['return'])
|
Loading…
Add table
Reference in a new issue