Projet

Général

Profil

Scénario #16278

Mis à jour par Daniel Dehennin il y a plus de 4 ans

h3. Problème

Actuellement les services OpenNebula ne sont pas accessibles de façon simple et homogène :

* L’interface web *@Sunstone@* écoute sur l’IP de la *@première interface réseau@* sur le port *@9000@* (le port part défaut est *@9869@*)
* Le service XMLRPC *@oned@* n’est accessible que sur *@127.0.0.1@* sur le port *@2633@* (port par défault)
* Le service *@OneFlow@* n’est accessible que sur *@127.0.0.1@* sur le port *@2474@* (port par défault)

h3. Propositions

Livraison pour EOLE *@2.7.2@*

# Permettre le paramétrage de l’IP et du port d’écoute du service XMLRPC avec les variables *@oned_xmlrpc_ip@* et *@oned_xmlrpc_port@*:
** Elles sont déclarées obligatoire en mode expert avec l’IP forcé à *@127.0.0.1@* par project:eole-one-master (non visible où tourne le service *@oned@*, *@oned_xmlrpc_port@* *@oned_xmlrpc_port remplace la variable inutilisée *@xmlrpc_port_sunstone@* définie dans project:eole-one-frontend)
** Elles sont déclares obligatoire en mode basic avec *@exists='False'@* par les projets necessitant d’y accéder (pour l’instant project:eole-one-frontend et project:eole-one-flow) :
*** L’IP n’est pas renseignée
*** Le port est prédéfinie à *@443@* pour pointer sur le reverse proxy du service
# Permettre le paramétrage de l’IP et du port d’écoute du service *@OneFlow@* avec les variables *@one_flow_ip@* et *@one_flow_port@* (ou conserver *@ip_oneflow@* et *@port_oneflow@*)
** Elles sont déclarées obligatoire en mode expert avec l’IP forcé à *@127.0.0.1@* par project:eole-one-flow (non visible où tourne le service *@opennebula-flow@*)
** Elles sont déclares obligatoire en mode basic avec *@exists='False'@* par les projets necessitant d’y accéder (pour l’instant project:eole-one-frontend) :
*** L’IP n’est pas renseignée
*** Le port est prédéfinie à *@443@* pour pointer sur le reverse proxy du service
# Permettre le paramétrage de l’IP et du port d’écoute du service
*@Sunstone@* avec les variables *@one_sunstone_ip@* et *@one_sunstone_port@* (ou conserver *@ip_sunstone@* et *@port_sunstone@*)
** Elles sont déclarées obligatoire en mode expert avec l’IP forcé à *@127.0.0.1@* par project:eole-one-frontend
# Permettre le paramétrage de la taille maximale des requêtes HTTP avec la variable *@one_nginx_max_body_size@*
** Elle est déclarée optionelle en mode expert par project:eole-one-frontend
# Renommer *@activer_onesinglenode@* en *@activer_oned@*
** Elle est déclarée obligatoire avec la valeur forcée à *@oui@* par project:eole-one-master (non modifiable, c’est pour faire des *@%if@* dans les templates)
# Permettre le paramétrage de l’IP et du port d’écoute du service *@noVNC@*
** Ajouter la variable *@one_sunstone_vnc_proxy_ip@*, obligatoire en mode expert avec l’IP forcée *@127.0.0.1@*
**
Renommer *@vnc_proxy_port_sunstone@* en *@one_sunstone_vnc_proxy_port@* (c’est plus facile pour faire des grep ;-))
# Fournir un template nginx devant être utilisé par project:eole-one-master et project:eole-one-frontend, en s’inspirant du modèle suivant project:eole-one-frontend
<pre>
# Opennebula
upstream oned {
server %%oned_xmlrpc_ip:%%oned_xmlrpc_port;
}

%if %%getVar('activer_onefrontend', 'non') == 'oui'
upstream sunstone {
server %%one_sunstone_ip:%%one_sunstone_port;
}

# Will be useable when https://dev.opennebula.org/issues/3538
# Usable with https://github.com/OpenNebula/one/issues/2781
upstream websocketproxy {

#
server %%one_sunstone_vnc_proxy_ip:%%one_sunstone_vnc_proxy_port; %%one_sunstone_ip:%%one_sunstone_vnc_proxy_port;
# }
%end if

%if %%getVar('activer_oneflow', 'non') == 'oui'
upstream one-flow {
server 127.0.0.1:2474; %%one_flow_ip:%%one_flow_port;
}
%end if

# Port 80 redirected to SSL
server {
listen 80;
server_name %%nom_domaine_machine;

### Permanent redirect to HTTPS
return 301 https://$server_name:443;
}

# SSL reverse-proxy
server {
listen 443 default_server;
listen [::]:443 default_server ipv6only=on;

ssl on;
ssl_certificate %%server_pem;
ssl_certificate_key %%server_key;

%if %%getVar('activer_onefrontend', 'non') == 'oui'
# Make sure static files can be accessed directly by location /
root /usr/lib/one/sunstone/public;
index index.html index.htm;
%end if

server_name %%nom_domaine_machine;

access_log /var/log/nginx/opennebula-access.log;
error_log /var/log/nginx/opennebula-error.log;

%if %%getVar('one_nginx_max_body_size', 'non') != 'non'
client_max_body_size %%one_nginx_max_body_size;
%end if

%if %%getVar('activer_onefrontend', 'non') == 'oui'
location / {
try_files $uri @sunstone;
}



#
location /websockify {

#
proxy_pass http://websocketproxy;

#
proxy_http_version 1.1;

#
proxy_set_header Upgrade $http_upgrade;

#
proxy_set_header Connection "upgrade";


# Wait 15 minutes before closing the connexion
# if nothing move on the VNC screen
proxy_send_timeout 15m;
proxy_read_timeout 15m;
}

location @sunstone {
include proxy_params;
proxy_pass_request_headers on;
proxy_pass http://sunstone;
}
%end if

%if %%getVar('activer_oned', 'non') == 'oui'
location /RPC2 {
include proxy_params;
proxy_pass http://oned;
}
%end if
}
</pre>

h3. Usages

* Lorsque un service est installé conjointement avec un autres, les variables sont bien renseignées comme il faut :

# Modifier ** Le dico du service fourni la configuration du proxy *@noVNC@* variable qui est utilisé par les autres (les IP sont *@127.0.0.1@*)
** Pour qu’il écoute sur 127.0.0.1
<pre><code class="diff">
--- a/tmpl/sunstone-server.conf
+++ b/tmpl/sunstone-server.conf
@@ -124,7 +124,7 @@
# :vnc_request_password: true | false
# Request VNC password for external windows, by default it will not be requested
#
-:vnc_proxy_port: %%vnc_proxy_port_sunstone
+:vnc_proxy_port: %%one_sunstone_vnc_proxy_ip:%%one_sunstone_vnc_proxy_port
:vnc_proxy_support_wss: yes
:vnc_proxy_cert: /etc/one/ssl/certs/novnc.crt
:vnc_proxy_key: /etc/one/ssl/private/novnc.key
</code></pre>
** Pour que
Le Nginx expose les clients utilise services exposables à travers le port HTTPS avec le contournement https://github.com/OpenNebula/one/issues/2781 *@443@* en SSL
<pre><code class="diff"> * Lorsque qu’un service est installé de façon isolé, les variables utilisés sont obligatoire en mode basique :
--- a/tmpl/sunstone-server.conf
+++ b/tmpl/sunstone-server.conf
@@ -130,6 +130,7 @@
:vnc_proxy_key: /etc/one/ssl/private/novnc.key
:vnc_proxy_ipv6: false
:vnc_request_password: false
+:vnc_client_port: 443/websockify

# Login Session Length in seconds, defaults to 1 hour.
#:session_expire_time: 3600
</code></pre>
** Pour ne plus Il faut renseigner l’IP du reverse proxy exposant les différents services à utiliser TLS sur 127.0.0.1
<pre><code class="diff">
--- a/tmpl/sunstone-server.conf
+++ b/tmpl/sunstone-server.conf
@@ -125,9 +125,9 @@
# Request VNC password for external windows, by default it will not be requested
#
:vnc_proxy_port: %%one_sunstone_vnc_proxy_ip:%%one_sunstone_vnc_proxy_port
-:vnc_proxy_support_wss: yes
-:vnc_proxy_cert: /etc/one/ssl/certs/novnc.crt
-:vnc_proxy_key: /etc/one/ssl/private/novnc.key
+:vnc_proxy_support_wss: no
+:vnc_proxy_cert:
+:vnc_proxy_key:
:vnc_proxy_ipv6: false
:vnc_request_password: false
:vnc_client_port: 443/websockify
</code></pre>
** Le port des services exposés par le reverse proxy est prédéfinie à *@443@*

h3. À ne pas oublier

En mode *@HA@* le service Les scripts partent du principe que l’interface est accessible en XMLRPC écoute sur le port *@2633@* *@127.0.0.1@*.

Il faudrait :

* Un fichier
de toutes configuration pour définir les IPs pour qu’un slave puisse communiquer avec le maître, nous voyons deux possibilités :
* Concerver le mode
"paramètres":http://docs.opennebula.org/5.0/operation/users_groups_management/manage_users.html#shell-environment *@ONE_AUTH@*, *@ONE_XMLRPC@* ainsi que les variables utilisés par les scripts afin de fonctionnement actuel (accès direct sur le port *@2633@*) minimiser les appels à *@creoled@*
* Obliger Modifier les slaves à passer par le HTTPS scripts pour utiliser ce qui nécessite un déploiment fichier de la CA du maître (ce qui est faisable par la commande d’enrôlement) configuration (à exporter dans l’environnement)

h3. Améliorations possibles

* Certains scripts peuvent sûrement être raccourcis en les réécrivant en ruby avec l’"API OpenNebula":http://docs.opennebula.org/5.0/integration/system_interfaces/ruby.html:
**


*
Le script shell de 468 lignes eole-one-master:source:postservice/30-one-mng@776da48
** * Le script python de 361 lignes eole-one-master:source:postservice/31-one-netmng@776da48
** * Le script shell de 148 lignes eole-one-master:source:postservice/99-init-hapy-master@776da48
* Un fichier de configuration pour définir les "paramètres":http://docs.opennebula.org/5.0/operation/users_groups_management/manage_users.html#shell-environment *@ONE_AUTH@*, *@ONE_XMLRPC@* ainsi que les variables utilisés par les scripts afin de minimiser les appels à *@creoled@*

Retour