2020-10-19 14:14:13 +02:00
|
|
|
#!/usr/bin/python
|
|
|
|
# coding: utf-8 -*-
|
|
|
|
|
|
|
|
# (c) 2020, FERREIRA Christophe <christophe.ferreira@cnaf.fr>
|
|
|
|
# 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
|
|
|
|
|
|
|
|
DOCUMENTATION = '''
|
|
|
|
---
|
|
|
|
module: nomad_job_info
|
|
|
|
author: FERREIRA Christophe (@chris93111)
|
|
|
|
version_added: "1.3.0"
|
|
|
|
short_description: Get Nomad Jobs info
|
|
|
|
description:
|
|
|
|
- Get info for one Nomad job.
|
|
|
|
- List Nomad jobs.
|
|
|
|
requirements:
|
|
|
|
- python-nomad
|
|
|
|
extends_documentation_fragment:
|
|
|
|
- community.general.nomad
|
|
|
|
options:
|
|
|
|
name:
|
|
|
|
description:
|
|
|
|
- Name of job for Get info.
|
|
|
|
- If not specified, lists all jobs.
|
|
|
|
type: str
|
|
|
|
notes:
|
|
|
|
- C(check_mode) is supported.
|
|
|
|
seealso:
|
|
|
|
- name: Nomad jobs documentation
|
|
|
|
description: Complete documentation for Nomad API jobs.
|
|
|
|
link: https://www.nomadproject.io/api-docs/jobs/
|
|
|
|
'''
|
|
|
|
|
|
|
|
EXAMPLES = '''
|
|
|
|
- name: Get info for job awx
|
2021-04-14 10:00:23 +02:00
|
|
|
community.general.nomad_job_info:
|
2020-10-19 14:14:13 +02:00
|
|
|
host: localhost
|
|
|
|
name: awx
|
|
|
|
register: result
|
|
|
|
|
|
|
|
- name: List Nomad jobs
|
2021-04-14 10:00:23 +02:00
|
|
|
community.general.nomad_job_info:
|
2020-10-19 14:14:13 +02:00
|
|
|
host: localhost
|
|
|
|
register: result
|
|
|
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
RETURN = '''
|
|
|
|
result:
|
|
|
|
description: List with dictionary contains jobs info
|
|
|
|
returned: success
|
|
|
|
type: list
|
|
|
|
sample: [
|
|
|
|
{
|
|
|
|
"Affinities": null,
|
|
|
|
"AllAtOnce": false,
|
|
|
|
"Constraints": null,
|
|
|
|
"ConsulToken": "",
|
|
|
|
"CreateIndex": 13,
|
|
|
|
"Datacenters": [
|
|
|
|
"dc1"
|
|
|
|
],
|
|
|
|
"Dispatched": false,
|
|
|
|
"ID": "example",
|
|
|
|
"JobModifyIndex": 13,
|
|
|
|
"Meta": null,
|
|
|
|
"ModifyIndex": 13,
|
|
|
|
"Multiregion": null,
|
|
|
|
"Name": "example",
|
|
|
|
"Namespace": "default",
|
|
|
|
"NomadTokenID": "",
|
|
|
|
"ParameterizedJob": null,
|
|
|
|
"ParentID": "",
|
|
|
|
"Payload": null,
|
|
|
|
"Periodic": null,
|
|
|
|
"Priority": 50,
|
|
|
|
"Region": "global",
|
|
|
|
"Spreads": null,
|
|
|
|
"Stable": false,
|
|
|
|
"Status": "pending",
|
|
|
|
"StatusDescription": "",
|
|
|
|
"Stop": false,
|
|
|
|
"SubmitTime": 1602244370615307000,
|
|
|
|
"TaskGroups": [
|
|
|
|
{
|
|
|
|
"Affinities": null,
|
|
|
|
"Constraints": null,
|
|
|
|
"Count": 1,
|
|
|
|
"EphemeralDisk": {
|
|
|
|
"Migrate": false,
|
|
|
|
"SizeMB": 300,
|
|
|
|
"Sticky": false
|
|
|
|
},
|
|
|
|
"Meta": null,
|
|
|
|
"Migrate": {
|
|
|
|
"HealthCheck": "checks",
|
|
|
|
"HealthyDeadline": 300000000000,
|
|
|
|
"MaxParallel": 1,
|
|
|
|
"MinHealthyTime": 10000000000
|
|
|
|
},
|
|
|
|
"Name": "cache",
|
|
|
|
"Networks": null,
|
|
|
|
"ReschedulePolicy": {
|
|
|
|
"Attempts": 0,
|
|
|
|
"Delay": 30000000000,
|
|
|
|
"DelayFunction": "exponential",
|
|
|
|
"Interval": 0,
|
|
|
|
"MaxDelay": 3600000000000,
|
|
|
|
"Unlimited": true
|
|
|
|
},
|
|
|
|
"RestartPolicy": {
|
|
|
|
"Attempts": 3,
|
|
|
|
"Delay": 15000000000,
|
|
|
|
"Interval": 1800000000000,
|
|
|
|
"Mode": "fail"
|
|
|
|
},
|
|
|
|
"Scaling": null,
|
|
|
|
"Services": null,
|
|
|
|
"ShutdownDelay": null,
|
|
|
|
"Spreads": null,
|
|
|
|
"StopAfterClientDisconnect": null,
|
|
|
|
"Tasks": [
|
|
|
|
{
|
|
|
|
"Affinities": null,
|
|
|
|
"Artifacts": null,
|
|
|
|
"CSIPluginConfig": null,
|
|
|
|
"Config": {
|
|
|
|
"image": "redis:3.2",
|
|
|
|
"port_map": [
|
|
|
|
{
|
|
|
|
"db": 6379.0
|
|
|
|
}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
"Constraints": null,
|
|
|
|
"DispatchPayload": null,
|
|
|
|
"Driver": "docker",
|
|
|
|
"Env": null,
|
|
|
|
"KillSignal": "",
|
|
|
|
"KillTimeout": 5000000000,
|
|
|
|
"Kind": "",
|
|
|
|
"Leader": false,
|
|
|
|
"Lifecycle": null,
|
|
|
|
"LogConfig": {
|
|
|
|
"MaxFileSizeMB": 10,
|
|
|
|
"MaxFiles": 10
|
|
|
|
},
|
|
|
|
"Meta": null,
|
|
|
|
"Name": "redis",
|
|
|
|
"Resources": {
|
|
|
|
"CPU": 500,
|
|
|
|
"Devices": null,
|
|
|
|
"DiskMB": 0,
|
|
|
|
"IOPS": 0,
|
|
|
|
"MemoryMB": 256,
|
|
|
|
"Networks": [
|
|
|
|
{
|
|
|
|
"CIDR": "",
|
|
|
|
"DNS": null,
|
|
|
|
"Device": "",
|
|
|
|
"DynamicPorts": [
|
|
|
|
{
|
|
|
|
"HostNetwork": "default",
|
|
|
|
"Label": "db",
|
|
|
|
"To": 0,
|
|
|
|
"Value": 0
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"IP": "",
|
|
|
|
"MBits": 10,
|
|
|
|
"Mode": "",
|
|
|
|
"ReservedPorts": null
|
|
|
|
}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
"RestartPolicy": {
|
|
|
|
"Attempts": 3,
|
|
|
|
"Delay": 15000000000,
|
|
|
|
"Interval": 1800000000000,
|
|
|
|
"Mode": "fail"
|
|
|
|
},
|
|
|
|
"Services": [
|
|
|
|
{
|
|
|
|
"AddressMode": "auto",
|
|
|
|
"CanaryMeta": null,
|
|
|
|
"CanaryTags": null,
|
|
|
|
"Checks": [
|
|
|
|
{
|
|
|
|
"AddressMode": "",
|
|
|
|
"Args": null,
|
|
|
|
"CheckRestart": null,
|
|
|
|
"Command": "",
|
|
|
|
"Expose": false,
|
|
|
|
"FailuresBeforeCritical": 0,
|
|
|
|
"GRPCService": "",
|
|
|
|
"GRPCUseTLS": false,
|
|
|
|
"Header": null,
|
|
|
|
"InitialStatus": "",
|
|
|
|
"Interval": 10000000000,
|
|
|
|
"Method": "",
|
|
|
|
"Name": "alive",
|
|
|
|
"Path": "",
|
|
|
|
"PortLabel": "",
|
|
|
|
"Protocol": "",
|
|
|
|
"SuccessBeforePassing": 0,
|
|
|
|
"TLSSkipVerify": false,
|
|
|
|
"TaskName": "",
|
|
|
|
"Timeout": 2000000000,
|
|
|
|
"Type": "tcp"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"Connect": null,
|
|
|
|
"EnableTagOverride": false,
|
|
|
|
"Meta": null,
|
|
|
|
"Name": "redis-cache",
|
|
|
|
"PortLabel": "db",
|
|
|
|
"Tags": [
|
|
|
|
"global",
|
|
|
|
"cache"
|
|
|
|
],
|
|
|
|
"TaskName": ""
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"ShutdownDelay": 0,
|
|
|
|
"Templates": null,
|
|
|
|
"User": "",
|
|
|
|
"Vault": null,
|
|
|
|
"VolumeMounts": null
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"Update": {
|
|
|
|
"AutoPromote": false,
|
|
|
|
"AutoRevert": false,
|
|
|
|
"Canary": 0,
|
|
|
|
"HealthCheck": "checks",
|
|
|
|
"HealthyDeadline": 180000000000,
|
|
|
|
"MaxParallel": 1,
|
|
|
|
"MinHealthyTime": 10000000000,
|
|
|
|
"ProgressDeadline": 600000000000,
|
|
|
|
"Stagger": 30000000000
|
|
|
|
},
|
|
|
|
"Volumes": null
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"Type": "service",
|
|
|
|
"Update": {
|
|
|
|
"AutoPromote": false,
|
|
|
|
"AutoRevert": false,
|
|
|
|
"Canary": 0,
|
|
|
|
"HealthCheck": "",
|
|
|
|
"HealthyDeadline": 0,
|
|
|
|
"MaxParallel": 1,
|
|
|
|
"MinHealthyTime": 0,
|
|
|
|
"ProgressDeadline": 0,
|
|
|
|
"Stagger": 30000000000
|
|
|
|
},
|
|
|
|
"VaultNamespace": "",
|
|
|
|
"VaultToken": "",
|
|
|
|
"Version": 0
|
|
|
|
}
|
|
|
|
]
|
|
|
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
import json
|
|
|
|
|
|
|
|
from ansible.module_utils.basic import AnsibleModule, missing_required_lib
|
|
|
|
from ansible.module_utils._text import to_native
|
|
|
|
|
|
|
|
import_nomad = None
|
|
|
|
try:
|
|
|
|
import nomad
|
|
|
|
import_nomad = True
|
|
|
|
except ImportError:
|
|
|
|
import_nomad = False
|
|
|
|
|
|
|
|
|
|
|
|
def run():
|
|
|
|
module = AnsibleModule(
|
|
|
|
argument_spec=dict(
|
|
|
|
host=dict(required=True, type='str'),
|
|
|
|
use_ssl=dict(type='bool', default=True),
|
|
|
|
timeout=dict(type='int', default=5),
|
|
|
|
validate_certs=dict(type='bool', default=True),
|
|
|
|
client_cert=dict(type='path', default=None),
|
|
|
|
client_key=dict(type='path', default=None),
|
|
|
|
namespace=dict(type='str', default=None),
|
|
|
|
name=dict(type='str', default=None),
|
|
|
|
token=dict(type='str', default=None, no_log=True)
|
|
|
|
),
|
|
|
|
supports_check_mode=True
|
|
|
|
)
|
|
|
|
|
|
|
|
if not import_nomad:
|
|
|
|
module.fail_json(msg=missing_required_lib("python-nomad"))
|
|
|
|
|
|
|
|
certificate_ssl = (module.params.get('client_cert'), module.params.get('client_key'))
|
|
|
|
|
|
|
|
nomad_client = nomad.Nomad(
|
|
|
|
host=module.params.get('host'),
|
|
|
|
secure=module.params.get('use_ssl'),
|
|
|
|
timeout=module.params.get('timeout'),
|
|
|
|
verify=module.params.get('validate_certs'),
|
|
|
|
cert=certificate_ssl,
|
|
|
|
namespace=module.params.get('namespace'),
|
|
|
|
token=module.params.get('token')
|
|
|
|
)
|
|
|
|
|
|
|
|
changed = False
|
2021-02-15 08:56:50 +01:00
|
|
|
result = list()
|
2020-10-19 14:14:13 +02:00
|
|
|
try:
|
|
|
|
job_list = nomad_client.jobs.get_jobs()
|
|
|
|
for job in job_list:
|
2021-02-15 08:56:50 +01:00
|
|
|
result.append(nomad_client.job.get_job(job.get('ID')))
|
2020-10-19 14:14:13 +02:00
|
|
|
except Exception as e:
|
|
|
|
module.fail_json(msg=to_native(e))
|
|
|
|
|
|
|
|
if module.params.get('name'):
|
|
|
|
filter = list()
|
|
|
|
try:
|
|
|
|
for job in result:
|
|
|
|
if job.get('ID') == module.params.get('name'):
|
|
|
|
filter.append(job)
|
|
|
|
result = filter
|
|
|
|
if not filter:
|
|
|
|
module.fail_json(msg="Couldn't find Job with id " + str(module.params.get('name')))
|
|
|
|
except Exception as e:
|
|
|
|
module.fail_json(msg=to_native(e))
|
|
|
|
|
|
|
|
module.exit_json(changed=changed, result=result)
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
|
|
|
run()
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|