mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Merge remote branch 'origin/devel' into devel
This commit is contained in:
commit
96134d003e
10 changed files with 88 additions and 17 deletions
|
@ -310,7 +310,7 @@ If you would like to access sudo mode, there are also flags to do that:
|
||||||
# as bruce, sudoing to batman
|
# as bruce, sudoing to batman
|
||||||
$ ansible all -m ping -u bruce --sudo --sudo-user batman
|
$ ansible all -m ping -u bruce --sudo --sudo-user batman
|
||||||
|
|
||||||
(The sudo implementation is changeable in ansbile's configuration file if you happen to want to use a sudo
|
(The sudo implementation is changeable in ansible's configuration file if you happen to want to use a sudo
|
||||||
replacement. Flags passed dot sudo can also be set.)
|
replacement. Flags passed dot sudo can also be set.)
|
||||||
|
|
||||||
Now run a live command on all of your nodes:
|
Now run a live command on all of your nodes:
|
||||||
|
|
|
@ -186,6 +186,15 @@ in a push-script::
|
||||||
|
|
||||||
There are full examples of both of these items in the github examples/playbooks directory.
|
There are full examples of both of these items in the github examples/playbooks directory.
|
||||||
|
|
||||||
|
If you have a variable that changes infrequently, it might make sense to
|
||||||
|
provide a default value that can be overriden. This can be accomplished using
|
||||||
|
the default argument::
|
||||||
|
|
||||||
|
vars_prompt:
|
||||||
|
- name: "release_version"
|
||||||
|
prompt: "Product release version"
|
||||||
|
default: "1.0"
|
||||||
|
|
||||||
An alternative form of vars_prompt allows for hiding input from the user, and may later support
|
An alternative form of vars_prompt allows for hiding input from the user, and may later support
|
||||||
some other options, but otherwise works equivalently::
|
some other options, but otherwise works equivalently::
|
||||||
|
|
||||||
|
@ -290,7 +299,7 @@ decide to do something conditionally based on success or failure::
|
||||||
- action: command /bin/something
|
- action: command /bin/something
|
||||||
when: result|failed
|
when: result|failed
|
||||||
- action: command /bin/something_else
|
- action: command /bin/something_else
|
||||||
when: result|sucess
|
when: result|success
|
||||||
|
|
||||||
|
|
||||||
As a reminder, to see what derived variables are available, you can do::
|
As a reminder, to see what derived variables are available, you can do::
|
||||||
|
|
|
@ -381,6 +381,7 @@ class Runner(object):
|
||||||
inject = utils.combine_vars(inject, host_variables)
|
inject = utils.combine_vars(inject, host_variables)
|
||||||
inject = utils.combine_vars(inject, self.module_vars)
|
inject = utils.combine_vars(inject, self.module_vars)
|
||||||
inject = utils.combine_vars(inject, self.setup_cache[host])
|
inject = utils.combine_vars(inject, self.setup_cache[host])
|
||||||
|
inject.setdefault('ansible_ssh_user', self.remote_user)
|
||||||
inject['hostvars'] = HostVars(self.setup_cache, self.inventory)
|
inject['hostvars'] = HostVars(self.setup_cache, self.inventory)
|
||||||
inject['group_names'] = host_variables.get('group_names', [])
|
inject['group_names'] = host_variables.get('group_names', [])
|
||||||
inject['groups'] = self.inventory.groups_list()
|
inject['groups'] = self.inventory.groups_list()
|
||||||
|
|
|
@ -142,6 +142,13 @@ options:
|
||||||
required: false
|
required: false
|
||||||
default: null
|
default: null
|
||||||
aliases: []
|
aliases: []
|
||||||
|
placement_group:
|
||||||
|
version_added: "1.3"
|
||||||
|
description:
|
||||||
|
- placement group for the instance when using EC2 Clustered Compute
|
||||||
|
required: false
|
||||||
|
default: null
|
||||||
|
aliases: []
|
||||||
vpc_subnet_id:
|
vpc_subnet_id:
|
||||||
version_added: "1.1"
|
version_added: "1.1"
|
||||||
description:
|
description:
|
||||||
|
@ -223,6 +230,7 @@ def main():
|
||||||
ec2_url = dict(aliases=['EC2_URL']),
|
ec2_url = dict(aliases=['EC2_URL']),
|
||||||
ec2_secret_key = dict(aliases=['EC2_SECRET_KEY'], no_log=True),
|
ec2_secret_key = dict(aliases=['EC2_SECRET_KEY'], no_log=True),
|
||||||
ec2_access_key = dict(aliases=['EC2_ACCESS_KEY']),
|
ec2_access_key = dict(aliases=['EC2_ACCESS_KEY']),
|
||||||
|
placement_group = dict(),
|
||||||
user_data = dict(),
|
user_data = dict(),
|
||||||
instance_tags = dict(),
|
instance_tags = dict(),
|
||||||
vpc_subnet_id = dict(),
|
vpc_subnet_id = dict(),
|
||||||
|
@ -247,6 +255,7 @@ def main():
|
||||||
ec2_url = module.params.get('ec2_url')
|
ec2_url = module.params.get('ec2_url')
|
||||||
ec2_secret_key = module.params.get('ec2_secret_key')
|
ec2_secret_key = module.params.get('ec2_secret_key')
|
||||||
ec2_access_key = module.params.get('ec2_access_key')
|
ec2_access_key = module.params.get('ec2_access_key')
|
||||||
|
placement_group = module.params.get('placement_group')
|
||||||
user_data = module.params.get('user_data')
|
user_data = module.params.get('user_data')
|
||||||
instance_tags = module.params.get('instance_tags')
|
instance_tags = module.params.get('instance_tags')
|
||||||
vpc_subnet_id = module.params.get('vpc_subnet_id')
|
vpc_subnet_id = module.params.get('vpc_subnet_id')
|
||||||
|
@ -310,7 +319,6 @@ def main():
|
||||||
count_remaining = count_remaining - len(running_instances)
|
count_remaining = count_remaining - len(running_instances)
|
||||||
|
|
||||||
# Both min_count and max_count equal count parameter. This means the launch request is explicit (we want count, or fail) in how many instances we want.
|
# Both min_count and max_count equal count parameter. This means the launch request is explicit (we want count, or fail) in how many instances we want.
|
||||||
|
|
||||||
|
|
||||||
if count_remaining > 0:
|
if count_remaining > 0:
|
||||||
try:
|
try:
|
||||||
|
@ -320,7 +328,8 @@ def main():
|
||||||
'min_count': count_remaining,
|
'min_count': count_remaining,
|
||||||
'max_count': count_remaining,
|
'max_count': count_remaining,
|
||||||
'monitoring_enabled': monitoring,
|
'monitoring_enabled': monitoring,
|
||||||
'placement': zone,
|
'placement': zone,
|
||||||
|
'placement_group': placement_group,
|
||||||
'instance_type': instance_type,
|
'instance_type': instance_type,
|
||||||
'kernel_id': kernel,
|
'kernel_id': kernel,
|
||||||
'ramdisk_id': ramdisk,
|
'ramdisk_id': ramdisk,
|
||||||
|
|
|
@ -239,7 +239,7 @@ def main():
|
||||||
if module.params['state'] == 'absent':
|
if module.params['state'] == 'absent':
|
||||||
port_id = _get_port_id(quantum, module, router_id, subnet_id)
|
port_id = _get_port_id(quantum, module, router_id, subnet_id)
|
||||||
if not port_id:
|
if not port_id:
|
||||||
module.exit_json(changed = False, result = "Sucess")
|
module.exit_json(changed = False, result = "Success")
|
||||||
_remove_interface_router(quantum, module, router_id, subnet_id)
|
_remove_interface_router(quantum, module, router_id, subnet_id)
|
||||||
module.exit_json(changed=True, result="Deleted")
|
module.exit_json(changed=True, result="Deleted")
|
||||||
|
|
||||||
|
|
|
@ -89,7 +89,6 @@ author: Jan-Piet Mens
|
||||||
'''
|
'''
|
||||||
|
|
||||||
EXAMPLES='''
|
EXAMPLES='''
|
||||||
<<<<<<< HEAD
|
|
||||||
- name: download foo.conf
|
- name: download foo.conf
|
||||||
get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf mode=0440
|
get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf mode=0440
|
||||||
|
|
||||||
|
|
|
@ -103,7 +103,7 @@ options:
|
||||||
|
|
||||||
EXAMPLES = '''
|
EXAMPLES = '''
|
||||||
# Example playbook sending mail to root
|
# Example playbook sending mail to root
|
||||||
- local_action: mail msg='System ${ansible_hostname} has been sucessfully provisioned.'
|
- local_action: mail msg='System ${ansible_hostname} has been successfully provisioned.'
|
||||||
|
|
||||||
# Send e-mail to a bunch of users, attaching files
|
# Send e-mail to a bunch of users, attaching files
|
||||||
- local_action: mail
|
- local_action: mail
|
||||||
|
|
|
@ -31,7 +31,7 @@ options:
|
||||||
pkg:
|
pkg:
|
||||||
description:
|
description:
|
||||||
- A package name or package specifier with version, like C(foo) or C(foo=1.0)
|
- A package name or package specifier with version, like C(foo) or C(foo=1.0)
|
||||||
required: true
|
required: false
|
||||||
default: null
|
default: null
|
||||||
state:
|
state:
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -54,6 +54,12 @@ options:
|
||||||
- Whether the service should start on boot. At least one of state and
|
- Whether the service should start on boot. At least one of state and
|
||||||
enabled are required.
|
enabled are required.
|
||||||
|
|
||||||
|
runlevel:
|
||||||
|
required: false
|
||||||
|
description:
|
||||||
|
- The runlevel that this service belongs to. Needed by OpenRC system
|
||||||
|
(e.g. Gentoo), and default to "default" if not set.
|
||||||
|
|
||||||
arguments:
|
arguments:
|
||||||
description:
|
description:
|
||||||
- Additional arguments provided on the command line
|
- Additional arguments provided on the command line
|
||||||
|
@ -85,6 +91,7 @@ EXAMPLES = '''
|
||||||
|
|
||||||
import platform
|
import platform
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
import tempfile
|
import tempfile
|
||||||
import shlex
|
import shlex
|
||||||
import select
|
import select
|
||||||
|
@ -115,8 +122,10 @@ class Service(object):
|
||||||
self.state = module.params['state']
|
self.state = module.params['state']
|
||||||
self.pattern = module.params['pattern']
|
self.pattern = module.params['pattern']
|
||||||
self.enable = module.params['enabled']
|
self.enable = module.params['enabled']
|
||||||
|
self.runlevel = module.params['runlevel']
|
||||||
self.changed = False
|
self.changed = False
|
||||||
self.running = None
|
self.running = None
|
||||||
|
self.crashed = None
|
||||||
self.action = None
|
self.action = None
|
||||||
self.svc_cmd = None
|
self.svc_cmd = None
|
||||||
self.svc_initscript = None
|
self.svc_initscript = None
|
||||||
|
@ -360,7 +369,7 @@ class LinuxService(Service):
|
||||||
def get_service_tools(self):
|
def get_service_tools(self):
|
||||||
|
|
||||||
paths = [ '/sbin', '/usr/sbin', '/bin', '/usr/bin' ]
|
paths = [ '/sbin', '/usr/sbin', '/bin', '/usr/bin' ]
|
||||||
binaries = [ 'service', 'chkconfig', 'update-rc.d', 'initctl', 'systemctl', 'start', 'stop', 'restart' ]
|
binaries = [ 'service', 'chkconfig', 'update-rc.d', 'rc-service', 'rc-update', 'initctl', 'systemctl', 'start', 'stop', 'restart' ]
|
||||||
initpaths = [ '/etc/init.d' ]
|
initpaths = [ '/etc/init.d' ]
|
||||||
location = dict()
|
location = dict()
|
||||||
|
|
||||||
|
@ -379,6 +388,11 @@ class LinuxService(Service):
|
||||||
elif location.get('update-rc.d', None) and os.path.exists("/etc/init.d/%s" % self.name):
|
elif location.get('update-rc.d', None) and os.path.exists("/etc/init.d/%s" % self.name):
|
||||||
# service is managed by with SysV init scripts, but with update-rc.d
|
# service is managed by with SysV init scripts, but with update-rc.d
|
||||||
self.enable_cmd = location['update-rc.d']
|
self.enable_cmd = location['update-rc.d']
|
||||||
|
elif location.get('rc-service', None) and not location.get('systemctl', None):
|
||||||
|
# service is managed by OpenRC
|
||||||
|
self.svc_cmd = location['rc-service']
|
||||||
|
self.enable_cmd = location['rc-update']
|
||||||
|
return
|
||||||
elif location.get('systemctl', None):
|
elif location.get('systemctl', None):
|
||||||
|
|
||||||
# verify service is managed by systemd
|
# verify service is managed by systemd
|
||||||
|
@ -435,6 +449,11 @@ class LinuxService(Service):
|
||||||
elif initctl_status_stdout.find("start/running") != -1:
|
elif initctl_status_stdout.find("start/running") != -1:
|
||||||
self.running = True
|
self.running = True
|
||||||
|
|
||||||
|
if self.svc_cmd.endswith("rc-service") and self.running is None:
|
||||||
|
openrc_rc, openrc_status_stdout, openrc_status_stderr = self.execute_command("%s %s status" % (self.svc_cmd, self.name))
|
||||||
|
self.running = "started" in openrc_status_stdout
|
||||||
|
self.crashed = "crashed" in openrc_status_stderr
|
||||||
|
|
||||||
# if the job status is still not known check it by response code
|
# if the job status is still not known check it by response code
|
||||||
# For reference, see:
|
# For reference, see:
|
||||||
# http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html
|
# http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html
|
||||||
|
@ -509,19 +528,44 @@ class LinuxService(Service):
|
||||||
elif not self.enable:
|
elif not self.enable:
|
||||||
return
|
return
|
||||||
|
|
||||||
# we change argument depending on real binary used
|
if self.enable_cmd.endswith("rc-update"):
|
||||||
# update-rc.d wants enable/disable while
|
(rc, out, err) = self.execute_command("%s show" % self.enable_cmd)
|
||||||
# chkconfig wants on/off
|
for line in out.splitlines():
|
||||||
# also, systemctl needs the argument order reversed
|
service_name, runlevels = line.split('|')
|
||||||
|
service_name = service_name.strip()
|
||||||
|
if service_name != self.name:
|
||||||
|
continue
|
||||||
|
runlevels = re.split(r'\s+', runlevels)
|
||||||
|
# service already enabled for the runlevel
|
||||||
|
if self.enable and self.runlevel in runlevels:
|
||||||
|
return
|
||||||
|
# service already disabled for the runlevel
|
||||||
|
elif not self.enable and self.runlevel not in runlevels:
|
||||||
|
return
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
# service already disabled altogether
|
||||||
|
if not self.enable:
|
||||||
|
return
|
||||||
|
|
||||||
|
# we change argument depending on real binary used:
|
||||||
|
# - update-rc.d and systemctl wants enable/disable
|
||||||
|
# - chkconfig wants on/off
|
||||||
|
# - rc-update wants add/delete
|
||||||
|
# also, rc-update and systemctl needs the argument order reversed
|
||||||
if self.enable:
|
if self.enable:
|
||||||
on_off = "on"
|
on_off = "on"
|
||||||
enable_disable = "enable"
|
enable_disable = "enable"
|
||||||
|
add_delete = "add"
|
||||||
else:
|
else:
|
||||||
on_off = "off"
|
on_off = "off"
|
||||||
enable_disable = "disable"
|
enable_disable = "disable"
|
||||||
|
add_delete = "delete"
|
||||||
|
|
||||||
if self.enable_cmd.endswith("update-rc.d"):
|
if self.enable_cmd.endswith("update-rc.d"):
|
||||||
args = (self.enable_cmd, self.name, enable_disable)
|
args = (self.enable_cmd, self.name, enable_disable)
|
||||||
|
elif self.enable_cmd.endswith("rc-update"):
|
||||||
|
args = (self.enable_cmd, add_delete, self.name + " " + self.runlevel)
|
||||||
elif self.enable_cmd.endswith("systemctl"):
|
elif self.enable_cmd.endswith("systemctl"):
|
||||||
args = (self.enable_cmd, enable_disable, self.name + ".service")
|
args = (self.enable_cmd, enable_disable, self.name + ".service")
|
||||||
else:
|
else:
|
||||||
|
@ -542,7 +586,7 @@ class LinuxService(Service):
|
||||||
arguments = self.arguments
|
arguments = self.arguments
|
||||||
if self.svc_cmd:
|
if self.svc_cmd:
|
||||||
if not self.svc_cmd.endswith("systemctl"):
|
if not self.svc_cmd.endswith("systemctl"):
|
||||||
# SysV take the form <cmd> <name> <action>
|
# SysV and OpenRC take the form <cmd> <name> <action>
|
||||||
svc_cmd = "%s %s" % (self.svc_cmd, self.name)
|
svc_cmd = "%s %s" % (self.svc_cmd, self.name)
|
||||||
else:
|
else:
|
||||||
# systemd commands take the form <cmd> <action> <name>
|
# systemd commands take the form <cmd> <action> <name>
|
||||||
|
@ -552,15 +596,23 @@ class LinuxService(Service):
|
||||||
# upstart
|
# upstart
|
||||||
svc_cmd = "%s" % self.svc_initscript
|
svc_cmd = "%s" % self.svc_initscript
|
||||||
|
|
||||||
|
# In OpenRC, if a service crashed, we need to reset its status to
|
||||||
|
# stopped with the zap command, before we can start it back.
|
||||||
|
if self.svc_cmd.endswith('rc-service') and self.action == 'start' and self.crashed:
|
||||||
|
self.execute_command("%s zap" % svc_cmd, daemonize=True)
|
||||||
|
|
||||||
if self.action is not "restart":
|
if self.action is not "restart":
|
||||||
if svc_cmd != '':
|
if svc_cmd != '':
|
||||||
# upstart or systemd
|
# upstart or systemd or OpenRC
|
||||||
rc_state, stdout, stderr = self.execute_command("%s %s %s" % (svc_cmd, self.action, arguments), daemonize=True)
|
rc_state, stdout, stderr = self.execute_command("%s %s %s" % (svc_cmd, self.action, arguments), daemonize=True)
|
||||||
else:
|
else:
|
||||||
# SysV
|
# SysV
|
||||||
rc_state, stdout, stderr = self.execute_command("%s %s %s" % (self.action, self.name, arguments), daemonize=True)
|
rc_state, stdout, stderr = self.execute_command("%s %s %s" % (self.action, self.name, arguments), daemonize=True)
|
||||||
|
elif self.svc_cmd.endswith('rc-service'):
|
||||||
|
# All services in OpenRC support restart.
|
||||||
|
rc_state, stdout, stderr = self.execute_command("%s %s %s" % (svc_cmd, self.action, arguments), daemonize=True)
|
||||||
else:
|
else:
|
||||||
# not all services support restart. Do it the hard way.
|
# In other systems, not all services support restart. Do it the hard way.
|
||||||
if svc_cmd != '':
|
if svc_cmd != '':
|
||||||
# upstart or systemd
|
# upstart or systemd
|
||||||
rc1, stdout1, stderr1 = self.execute_command("%s %s %s" % (svc_cmd, 'stop', arguments), daemonize=True)
|
rc1, stdout1, stderr1 = self.execute_command("%s %s %s" % (svc_cmd, 'stop', arguments), daemonize=True)
|
||||||
|
@ -938,6 +990,7 @@ def main():
|
||||||
state = dict(choices=['running', 'started', 'stopped', 'restarted', 'reloaded']),
|
state = dict(choices=['running', 'started', 'stopped', 'restarted', 'reloaded']),
|
||||||
pattern = dict(required=False, default=None),
|
pattern = dict(required=False, default=None),
|
||||||
enabled = dict(choices=BOOLEANS, type='bool'),
|
enabled = dict(choices=BOOLEANS, type='bool'),
|
||||||
|
runlevel = dict(required=False, default='default'),
|
||||||
arguments = dict(aliases=['args'], default=''),
|
arguments = dict(aliases=['args'], default=''),
|
||||||
),
|
),
|
||||||
supports_check_mode=True
|
supports_check_mode=True
|
||||||
|
|
|
@ -41,7 +41,7 @@ package() {
|
||||||
|
|
||||||
python2 setup.py install -O1 --root="$pkgdir"
|
python2 setup.py install -O1 --root="$pkgdir"
|
||||||
|
|
||||||
install -D examples/ansible.cfg "$pkgdir/etc/ansible/ansbile.cfg"
|
install -D examples/ansible.cfg "$pkgdir/etc/ansible/ansible.cfg"
|
||||||
|
|
||||||
install -D README.md "$pkgdir/usr/share/doc/ansible/README.md"
|
install -D README.md "$pkgdir/usr/share/doc/ansible/README.md"
|
||||||
install -D COPYING "$pkgdir/usr/share/doc/ansible/COPYING"
|
install -D COPYING "$pkgdir/usr/share/doc/ansible/COPYING"
|
||||||
|
|
Loading…
Reference in a new issue