plugins/modules/ali_key_pair.py (104 lines of code) (raw):
#!/usr/bin/python
# Copyright (c) 2017-present Alibaba Group Holding Limited. <xiaozhu36>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'community'}
DOCUMENTATION = """
---
module: ali_key_pair
short_description: Create, Import, Delete ECS KeyPairs in Alibaba Cloud.
description:
- Create, Import, Delete ECS KeyPairs in Alibaba Cloud.
options:
state:
description:
- If I(state=present), key pair will be created.
- If I(state=absent), key pair will be removed.
choices: ['present', 'absent']
default: 'present'
type: str
name:
description:
- The name of key pair, which is a string of 2 to 128 Chinese or English characters. It must begin with an
uppercase/lowercase letter or a Chinese character and can contain numerals, "_" or "-".
It cannot begin with http:// or https://.
required: True
aliases: ['key_pair_name']
type: str
public_key:
description:
- The public key of the key pair. import key pair to Alicloud.
type: str
force:
description:
- Force overwrite of already existing key pair if key has changed.
default: True
type: bool
tags:
description:
- A hash/dictionaries of key pair tags. C({"key":"value"})
type: dict
requirements:
- "python >= 3.6"
- "footmark >= 1.21.0"
extends_documentation_fragment:
- alicloud
author:
- "Yang Liu (@liuyangc3)"
"""
EXAMPLES = """
# Note: These examples do not set authentication details, see the Alibaba Cloud Guide for details.
- name: Create a new key pair
alibaba.alicloud.ali_key_pair:
name: my_keypair
- name: Import a key pair using provided public_key
alibaba.alicloud.ali_key_pair:
name: my_keypair
public_key: 'ssh-rsa AAAAxyz...== me@example.com'
- name: Create key pair using public_key obtained using 'file' lookup plugin
alibaba.alicloud.ali_key_pair:
name: my_keypair
public_key: "{{ lookup('file', '/path/to/public_key/id_rsa.pub') }}"
# try creating a key pair with the name of an already existing keypair
# but don't overwrite it even if the key is different (force=false)
- name: try creating a key pair with name of an already existing keypair
alibaba.alicloud.ali_key_pair:
name: my_existing_keypair
public_key: 'ssh-rsa AAAAxyz...== me@example.com'
force: false
- name: Delete the existing key pair
alibaba.alicloud.ali_key_pair:
name: my_keypair
state: absent
"""
RETURN = '''
key:
description: Dictionary of key pair, (this is set to null when state is absent)
returned: always
type: complex
contains:
name:
description: The name of the key pair
returned: always
type: str
sample: "mykey"
fingerprint:
description: fingerprint of the key
returned: when state is present
type: str
sample: 'b0:22:49:61:d9:44:9d:0c:7e:ac:8a:32:93:21:6c:e8:fb:59:62:43'
private_key:
description: private key of a newly created key pair
returned: when state is present (public_key is not provided)
type: str
sample: "-----BEGIN RSA PRIVATE KEY-----\nMII..."
tags:
description: tags attached to the key pair
returned: always
type: dict
sample: {"Name": "My key", "env": "staging"}
creation_time:
description: The time the key pair was created.
returned: always
type: str
sample: '2018-06-24T15:14:45Z'
'''
import time
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.alicloud_ecs import ecs_argument_spec, ecs_connect
HAS_FOOTMARK = False
try:
from footmark.exception import ECSResponseError
HAS_FOOTMARK = True
except ImportError:
HAS_FOOTMARK = False
def key_pair_exists(conn, module, key_pair_name):
try:
for kp in conn.describe_key_pairs():
if key_pair_name and kp.name != key_pair_name:
continue
return kp
except Exception as e:
module.fail_json(msg="Couldn't get matching key pair: {0}".format(e))
def main():
argument_spec = ecs_argument_spec()
argument_spec.update(dict(
state=dict(default='present', choices=['present', 'absent']),
name=dict(type='str', required=True),
public_key=dict(type='str'),
force=dict(type='bool', default=True),
tags=dict(type='dict')
))
module = AnsibleModule(argument_spec=argument_spec)
if HAS_FOOTMARK is False:
module.fail_json(msg='footmark required for the module ali_key_pair.')
ecs = ecs_connect(module)
# Get values of variable
state = module.params['state']
key_pair_name = module.params['name']
force = module.params['force']
public_key = module.params.get('public_key', '')
changed = False
key_pair = key_pair_exists(ecs, module, key_pair_name)
if state == 'absent':
if not key_pair:
module.exit_json(changed=changed, key={})
try:
changed = key_pair.delete()
module.exit_json(changed=changed, key={})
except ECSResponseError as ex:
module.fail_json(msg='Unable to delete key_pair: {0}, error: {1}'.format(key_pair.name, ex))
if str(key_pair_name).startswith('http://') or str(key_pair_name).startswith('https://'):
module.fail_json(msg='key pair name can not start with http:// or https://')
if key_pair and force:
try:
key_pair.delete()
except ECSResponseError as ex:
module.fail_json(msg='Unable to force delete key_pair: {0}, error: {1}'.format(key_pair.name, ex))
if not key_pair:
try:
params = module.params
params['client_token'] = "Ansible-Alicloud-{0}-{1}".format(hash(str(module.params)), str(time.time()))
params['key_pair_name'] = key_pair_name
if public_key:
key_pair = ecs.import_key_pair(**params)
else:
key_pair = ecs.create_key_pair(**params)
module.exit_json(changed=True, key=key_pair)
except ECSResponseError as e:
module.fail_json(msg='Unable to create key pair, error: {0}'.format(e))
if __name__ == '__main__':
main()