summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--roles/openshift_common/defaults/main.yml5
-rw-r--r--roles/openshift_common/tasks/main.yml1
-rw-r--r--roles/openshift_master/tasks/main.yml4
-rw-r--r--roles/openshift_node/library/openshift_register_node.py150
-rw-r--r--roles/openshift_node/tasks/main.yml6
5 files changed, 164 insertions, 2 deletions
diff --git a/roles/openshift_common/defaults/main.yml b/roles/openshift_common/defaults/main.yml
index 20b6f082c..a541591fb 100644
--- a/roles/openshift_common/defaults/main.yml
+++ b/roles/openshift_common/defaults/main.yml
@@ -1,3 +1,8 @@
---
openshift_bind_ip: "{{ ansible_default_ipv4.address }}"
openshift_debug_level: 0
+
+# TODO: Once openshift stops resolving hostnames for node queries remove
+# this...
+openshift_hostname_workaround: true
+openshift_hostname: "{{ openshift_public_ip if openshift_hostname_workaround else ansible_fqdn }}"
diff --git a/roles/openshift_common/tasks/main.yml b/roles/openshift_common/tasks/main.yml
index cfa0d8dfe..f72beb65b 100644
--- a/roles/openshift_common/tasks/main.yml
+++ b/roles/openshift_common/tasks/main.yml
@@ -2,6 +2,7 @@
# fixme: Once openshift stops resolving hostnames for node queries remove this...
- name: Set hostname to IP Addr (WORKAROUND)
hostname: name={{ openshift_bind_ip }}
+ when: openshift_hostname_workaround
- name: Configure local facts file
file: path=/etc/ansible/facts.d/ state=directory mode=0750
diff --git a/roles/openshift_master/tasks/main.yml b/roles/openshift_master/tasks/main.yml
index 0b3842856..ef915d63b 100644
--- a/roles/openshift_master/tasks/main.yml
+++ b/roles/openshift_master/tasks/main.yml
@@ -16,8 +16,8 @@
lineinfile:
dest: /etc/sysconfig/openshift-master
regexp: '^OPTIONS='
- line: "OPTIONS=\"--public-master={{ openshift_public_ip }} --nodes={{ openshift_node_ips
- | join(',') }} --loglevel={{ openshift_master_debug_level }}\""
+ line: "OPTIONS=\"--public-master={{ openshift_hostname }} --nodes={{ openshift_node_ips
+ | join(',') }} --loglevel={{ openshift_master_debug_level }}\""
notify:
- restart openshift-master
diff --git a/roles/openshift_node/library/openshift_register_node.py b/roles/openshift_node/library/openshift_register_node.py
new file mode 100644
index 000000000..87290c209
--- /dev/null
+++ b/roles/openshift_node/library/openshift_register_node.py
@@ -0,0 +1,150 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import os
+import multiprocessing
+import socket
+from subprocess import check_output, Popen
+
+DOCUMENTATION = '''
+---
+module: openshift_register_node
+short_description: This module registers an openshift-node with an openshift-master
+author: Jason DeTiberus
+requirements: [ openshift-node ]
+notes: Node resources can be specified using either the resources option or the following options: cpu, memory
+options:
+ name:
+ description:
+ - id for this node (usually the node fqdn)
+ required: true
+ hostIP:
+ description:
+ - ip address for this node
+ required: false
+ cpu:
+ description:
+ - number of CPUs for this node
+ required: false
+ default: number of logical CPUs detected
+ memory:
+ description:
+ - Memory available for this node in bytes
+ required: false
+ default: 80% MemTotal
+ resources:
+ description:
+ - A json string representing Node resources
+ required: false
+'''
+EXAMPLES = '''
+# Minimal node registration
+- openshift_register_node: name=ose3.node.example.com
+
+# Node registration with all options (using cpu and memory options)
+- openshift_register_node:
+ name: ose3.node.example.com
+ hostIP: 192.168.1.1
+ apiVersion: v1beta1
+ cpu: 1
+ memory: 1073741824
+
+# Node registration with all options (using resources option)
+- openshift_register_node:
+ name: ose3.node.example.com
+ hostIP: 192.168.1.1
+ apiVersion: v1beta1
+ resources:
+ capacity:
+ cpu: 1
+ memory: 1073741824
+'''
+
+def main():
+ default_config='/var/lib/openshift/openshift.local.certificates/admin/.kubeconfig'
+
+ module = AnsibleModule(
+ argument_spec = dict(
+ name = dict(required = True),
+ hostIP = dict(),
+ apiVersion = dict(),
+ cpu = dict(),
+ memory = dict(),
+ resources = dict(),
+ client_config = dict(default = default_config)
+ ),
+ supports_check_mode=True
+ )
+
+ if module.params['resources'] and (module.params['cpu'] or module.params['memory']):
+ module.fail_json(msg="Error: argument resources cannot be specified with the following arguments: cpu, memory")
+
+ client_env = os.environ.copy()
+ client_env['KUBECONFIG'] = module.params['client_config']
+
+ node_def = dict(
+ metadata = dict(
+ name = module.params['name']
+ ),
+ kind = 'Node',
+ resources = dict(
+ capacity = dict()
+ )
+ )
+
+ for key, value in module.params.iteritems():
+ if key in ['cpu', 'memory']:
+ node_def['resources']['capacity'][key] = value
+ elif key == 'name':
+ node_def['id'] = value
+ elif key != 'client_config':
+ if value:
+ node_def[key] = value
+
+ if not node_def['resources']['capacity']['cpu']:
+ node_def['resources']['capacity']['cpu'] = multiprocessing.cpu_count()
+
+ if not node_def['resources']['capacity']['memory']:
+ with open('/proc/meminfo', 'r') as mem:
+ for line in mem:
+ entries = line.split()
+ if str(entries.pop(0)) == 'MemTotal:':
+ mem_free_kb = int(entries.pop(0))
+ mem_capacity = int(mem_free_kb * 1024 * .80)
+ node_def['resources']['capacity']['memory'] = mem_capacity
+ break
+
+ try:
+ output = check_output("osc get nodes", shell=True, env=client_env,
+ stderr=subprocess.STDOUT)
+ except subprocess.CalledProcessError as e:
+ module.fail_json(msg="Failed to get node list", command=e.cmd,
+ returncode=e.returncode, output=e.output)
+
+ if module.check_mode:
+ if re.search(module.params['name'], output, re.MULTILINE):
+ module.exit_json(changed=False, node_def=node_def)
+ else:
+ module.exit_json(changed=True, node_def=node_def)
+
+ p = Popen("osc create node -f -", shell=True, stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True,
+ env=client_env)
+ (out, err) = p.communicate(module.jsonify(node_def))
+ ret = p.returncode
+
+ if ret != 0:
+ if re.search("minion \"%s\" already exists" % module.params['name'],
+ err):
+ module.exit_json(changed=False,
+ msg="node definition already exists", node_def=node_def)
+ else:
+ module.fail_json(msg="Node creation failed.", ret=ret, out=out,
+ err=err, node_def=node_def)
+
+ module.exit_json(changed=True, out=out, err=err, ret=ret,
+ node_def=node_def)
+
+# import module snippets
+from ansible.module_utils.basic import *
+main()
diff --git a/roles/openshift_node/tasks/main.yml b/roles/openshift_node/tasks/main.yml
index b908e325b..e458f651b 100644
--- a/roles/openshift_node/tasks/main.yml
+++ b/roles/openshift_node/tasks/main.yml
@@ -55,3 +55,9 @@
- name: Disable openshift-node if openshift-node is managed externally
service: name=openshift-node enabled=false
when: openshift_node_manage_service_externally
+
+# TODO: expose openshift_register_node options to allow for overriding the
+# defaults.
+- name: Register node (if not already registered)
+ openshift_register_node:
+ name: "{{ openshift_hostname }}"