mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Added support to GCE module for image families and external projects. (#26711)
* Added support to GCE module for image families and external projects. * Added image_family and external_projects to gce_pd. * Added version_added for new options.
This commit is contained in:
parent
db5d799122
commit
5e6984a34c
2 changed files with 54 additions and 5 deletions
|
@ -28,6 +28,20 @@ options:
|
||||||
stable debian image)
|
stable debian image)
|
||||||
required: false
|
required: false
|
||||||
default: "debian-8"
|
default: "debian-8"
|
||||||
|
image_family:
|
||||||
|
description:
|
||||||
|
- image family from which to select the image. The most recent
|
||||||
|
non-deprecated image in the family will be used.
|
||||||
|
required: false
|
||||||
|
default: null
|
||||||
|
version_added: "2.4"
|
||||||
|
external_projects:
|
||||||
|
description:
|
||||||
|
- A list of other projects (accessible with the provisioning credentials)
|
||||||
|
to be searched for the image.
|
||||||
|
required: false
|
||||||
|
default: null
|
||||||
|
version_added: "2.4"
|
||||||
instance_names:
|
instance_names:
|
||||||
description:
|
description:
|
||||||
- a comma-separated list of instance names to create or destroy
|
- a comma-separated list of instance names to create or destroy
|
||||||
|
@ -197,6 +211,22 @@ EXAMPLES = '''
|
||||||
project_id: "your-project-name"
|
project_id: "your-project-name"
|
||||||
disk_size: 32
|
disk_size: 32
|
||||||
|
|
||||||
|
# Create a single instance of an image from the "my-base-image" image family
|
||||||
|
# in the us-central1-a Zone of the n1-standard-1 machine type.
|
||||||
|
# This image family is in the "my-other-project" GCP project.
|
||||||
|
gce:
|
||||||
|
instance_names: my-test-instance1
|
||||||
|
zone: us-central1-a
|
||||||
|
machine_type: n1-standard-1
|
||||||
|
image_family: my-base-image
|
||||||
|
external_projects:
|
||||||
|
- my-other-project
|
||||||
|
state: present
|
||||||
|
service_account_email: "your-sa@your-project-name.iam.gserviceaccount.com"
|
||||||
|
credentials_file: "/path/to/your-key.json"
|
||||||
|
project_id: "your-project-name"
|
||||||
|
disk_size: 32
|
||||||
|
|
||||||
# Create a single Debian 8 instance in the us-central1-a Zone
|
# Create a single Debian 8 instance in the us-central1-a Zone
|
||||||
# Use existing disks, custom network/subnetwork, set service account permissions
|
# Use existing disks, custom network/subnetwork, set service account permissions
|
||||||
# add tags and metadata.
|
# add tags and metadata.
|
||||||
|
@ -291,6 +321,7 @@ EXAMPLES = '''
|
||||||
'''
|
'''
|
||||||
|
|
||||||
import socket
|
import socket
|
||||||
|
import logging
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from ast import literal_eval
|
from ast import literal_eval
|
||||||
|
@ -379,6 +410,8 @@ def create_instances(module, gce, instance_names, number, lc_zone):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
image = module.params.get('image')
|
image = module.params.get('image')
|
||||||
|
image_family = module.params.get('image_family')
|
||||||
|
external_projects = module.params.get('external_projects')
|
||||||
machine_type = module.params.get('machine_type')
|
machine_type = module.params.get('machine_type')
|
||||||
metadata = module.params.get('metadata')
|
metadata = module.params.get('metadata')
|
||||||
network = module.params.get('network')
|
network = module.params.get('network')
|
||||||
|
@ -452,7 +485,7 @@ def create_instances(module, gce, instance_names, number, lc_zone):
|
||||||
else:
|
else:
|
||||||
metadata = md
|
metadata = md
|
||||||
|
|
||||||
lc_image = LazyDiskImage(module, gce, image, lc_disks)
|
lc_image = LazyDiskImage(module, gce, image, lc_disks, family=image_family, projects=external_projects)
|
||||||
ex_sa_perms = []
|
ex_sa_perms = []
|
||||||
bad_perms = []
|
bad_perms = []
|
||||||
if service_account_permissions:
|
if service_account_permissions:
|
||||||
|
@ -615,6 +648,8 @@ def main():
|
||||||
module = AnsibleModule(
|
module = AnsibleModule(
|
||||||
argument_spec = dict(
|
argument_spec = dict(
|
||||||
image = dict(default='debian-8'),
|
image = dict(default='debian-8'),
|
||||||
|
image_family = dict(),
|
||||||
|
external_projects = dict(type='list'),
|
||||||
instance_names = dict(),
|
instance_names = dict(),
|
||||||
machine_type = dict(default='n1-standard-1'),
|
machine_type = dict(default='n1-standard-1'),
|
||||||
metadata = dict(),
|
metadata = dict(),
|
||||||
|
@ -650,6 +685,9 @@ def main():
|
||||||
|
|
||||||
gce = gce_connect(module)
|
gce = gce_connect(module)
|
||||||
|
|
||||||
|
image = module.params.get('image')
|
||||||
|
image_family = module.params.get('image_family')
|
||||||
|
external_projects = module.params.get('external_projects')
|
||||||
instance_names = module.params.get('instance_names')
|
instance_names = module.params.get('instance_names')
|
||||||
name = module.params.get('name')
|
name = module.params.get('name')
|
||||||
number = module.params.get('num_instances')
|
number = module.params.get('num_instances')
|
||||||
|
@ -713,19 +751,24 @@ class LazyDiskImage:
|
||||||
Object for lazy instantiation of disk image
|
Object for lazy instantiation of disk image
|
||||||
gce.ex_get_image is a very expensive call, so we want to avoid calling it as much as possible.
|
gce.ex_get_image is a very expensive call, so we want to avoid calling it as much as possible.
|
||||||
"""
|
"""
|
||||||
def __init__(self, module, gce, name, has_pd):
|
def __init__(self, module, gce, name, has_pd, family=None, projects=None):
|
||||||
self.image = None
|
self.image = None
|
||||||
self.was_called = False
|
self.was_called = False
|
||||||
self.gce = gce
|
self.gce = gce
|
||||||
self.name = name
|
self.name = name
|
||||||
self.has_pd = has_pd
|
self.has_pd = has_pd
|
||||||
self.module = module
|
self.module = module
|
||||||
|
self.family = family
|
||||||
|
self.projects = projects
|
||||||
|
|
||||||
def __call__(self):
|
def __call__(self):
|
||||||
if not self.was_called:
|
if not self.was_called:
|
||||||
self.was_called = True
|
self.was_called = True
|
||||||
if not self.has_pd:
|
if not self.has_pd:
|
||||||
self.image = self.gce.ex_get_image(self.name)
|
if self.family:
|
||||||
|
self.image = self.gce.ex_get_image_from_family(self.family, ex_project_list=self.projects)
|
||||||
|
else:
|
||||||
|
self.image = self.gce.ex_get_image(self.name, ex_project_list=self.projects)
|
||||||
if not self.image:
|
if not self.image:
|
||||||
self.module.fail_json(msg='image or disks missing for create instance', changed=False)
|
self.module.fail_json(msg='image or disks missing for create instance', changed=False)
|
||||||
return self.image
|
return self.image
|
||||||
|
|
|
@ -166,6 +166,8 @@ def main():
|
||||||
size_gb = dict(default=10),
|
size_gb = dict(default=10),
|
||||||
disk_type = dict(default='pd-standard'),
|
disk_type = dict(default='pd-standard'),
|
||||||
image = dict(),
|
image = dict(),
|
||||||
|
image_family = dict(),
|
||||||
|
external_projects = dict(type='list'),
|
||||||
snapshot = dict(),
|
snapshot = dict(),
|
||||||
state = dict(default='present'),
|
state = dict(default='present'),
|
||||||
zone = dict(default='us-central1-b'),
|
zone = dict(default='us-central1-b'),
|
||||||
|
@ -188,6 +190,8 @@ def main():
|
||||||
size_gb = module.params.get('size_gb')
|
size_gb = module.params.get('size_gb')
|
||||||
disk_type = module.params.get('disk_type')
|
disk_type = module.params.get('disk_type')
|
||||||
image = module.params.get('image')
|
image = module.params.get('image')
|
||||||
|
image_family = module.params.get('image_family')
|
||||||
|
external_projects = module.params.get('external_projects')
|
||||||
snapshot = module.params.get('snapshot')
|
snapshot = module.params.get('snapshot')
|
||||||
state = module.params.get('state')
|
state = module.params.get('state')
|
||||||
zone = module.params.get('zone')
|
zone = module.params.get('zone')
|
||||||
|
@ -257,8 +261,10 @@ def main():
|
||||||
image, snapshot), changed=False)
|
image, snapshot), changed=False)
|
||||||
lc_image = None
|
lc_image = None
|
||||||
lc_snapshot = None
|
lc_snapshot = None
|
||||||
if image is not None:
|
if image_family is not None:
|
||||||
lc_image = gce.ex_get_image(image)
|
lc_image = gce.ex_get_image_from_family(image_family, ex_project_list=external_projects)
|
||||||
|
elif image is not None:
|
||||||
|
lc_image = gce.ex_get_image(image, ex_project_list=external_projects)
|
||||||
elif snapshot is not None:
|
elif snapshot is not None:
|
||||||
lc_snapshot = gce.ex_get_snapshot(snapshot)
|
lc_snapshot = gce.ex_get_snapshot(snapshot)
|
||||||
try:
|
try:
|
||||||
|
|
Loading…
Reference in a new issue