Projet

Général

Profil

Bac à idée #29095

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

h3. Problème

Actuellement les services frontend OpenNebula ne sont installables 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 conjointement au contrôleur. 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

Ce scénario nécessite le fonctionnement derrière un reverse-proxy (#16278)

# 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 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)
# 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
<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
# upstream websocketproxy {
# server %%one_sunstone_ip:%%one_sunstone_vnc_proxy_port;
# }
%end if

%if %%getVar('activer_oneflow', 'non') == 'oui'
upstream one-flow {
server %%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";
# }

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 les services frontends sont installés un service est installé conjointement avec le maître, un autres, les variables sont bien renseignées comme il faut :
** Le dico du service fourni la variable qui est utilisé par les autres (les IP sont *@127.0.0.1@*)
** Le Nginx expose les services exposables à travers le port *@443@* en SSL
* Lorsque les services frontends sont installés qu’un service est installé de façon isolé, les variables utilisés sont obligatoire en mode basique :
** Il faut renseigner l’IP du reverse proxy exposant les différents services à utiliser
** Le port des services exposés par le reverse proxy est prédéfinie à *@443@*

h3. À ne pas oublier

Les scripts partent du principe que l’interface est accessible en XMLRPC sur *@127.0.0.1@*.

Il faudrait :

* 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@*
* Modifier les scripts pour utiliser ce fichier de 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

Retour