Назад | Перейти на главную страницу

Плагины для обслуживания марионеток поверх nginx выдают ошибку 404

Я перенес свою настройку мастера марионетки для работы в тонком режиме с файлами, обслуживаемыми из nginx.

Файлы модулей обслуживаются отлично, но файлы подключаемых модулей не работают. Журналы думают, что агенты запрашивают URL-адреса, например /production/file_content/plugins/puppet/provider/exec/powershell.rb и поэтому nginx выдает ошибку 404, потому что такого пути не существует. Это отлично работает на WEBrick.

Теоретически это должен быть простой случай написания правила перезаписи, аналогичного приведенному ниже правилу модулей. Однако многие из этих провайдеров находятся внутри модулей, поэтому этот конкретный провайдер находится в /etc/puppet/modules/powershell/lib/puppet/provider/exec/powershell.rb.

Как мне сопоставить URL-адрес запроса с фактическим плагином, когда они могут быть разбросаны по различным каталогам модулей?

Моя конфигурация nginx выглядит так:

upstream puppetmaster-thin {                                                                                                                                                          
    server  unix:/var/run/puppet/puppetmasterd.0.sock;                                                                                                                                
    server  unix:/var/run/puppet/puppetmasterd.1.sock;                                                                                                                                
    server  unix:/var/run/puppet/puppetmasterd.2.sock;                                                                                                                                
}                                                                                                                                                                                     

server {                                                                                                                                                                              
    listen  8140;                                                                                                                                                                     
    root    /etc/puppet/rack;                                                                                                                                                         

    ssl                     on;                                                                                                                                                       
    ssl_session_timeout     5m;                                                                                                                                                       
    ssl_certificate         /var/lib/puppet/ssl/certs/gcspuppet01.pem;                                                                                                                
    ssl_certificate_key     /var/lib/puppet/ssl/private_keys/gcspuppet01.pem;                                                                                                         
    ssl_client_certificate  /var/lib/puppet/ssl/ca/ca_crt.pem;                                                                                                                        
    ssl_crl                 /var/lib/puppet/ssl/ca/ca_crl.pem;                                                                                                                        
    ssl_verify_client       optional;                                                                                                                                                 
    ssl_ciphers             SSLv2:-LOW:-EXPORT:RC4+RSA;                                                                                                                               

    proxy_read_timeout  120;                                                                                                                                                          
    proxy_redirect      off;                                                                                                                                                          

    proxy_set_header   Host             $host;                                                                                                                                        
    proxy_set_header   X-Real-IP        $remote_addr;                                                                                                                                 
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;                                                                                                                   
    proxy_set_header   X-Client-Verify  $ssl_client_verify;                                                                                                                           
    proxy_set_header   X-Client_DN      $ssl_client_s_dn;                                                                                                                             
    proxy_set_header   X-SSL-Subject    $ssl_client_s_dn;                                                                                                                             
    proxy_set_header   X-SSL-Issuer     $ssl_client_i_dn;                                                                                                                             


    location /production/file_content/ {                                                                                                                                              
    location /production/file_content/extra_files/ {                                                                                                                              
        alias /etc/puppet/files/;                                                                                                                                                 
    }                                                                                                                                                                             
    rewrite ^/production/file_content/modules/([^/]+)/(.*) /$1/files/$2;                                                                                                          
    break;                                                                                                                                                                        
    root /etc/puppet/modules/;                                                                                                                                                    
    }                                                                                                                                                                                 
    location / {                                                                                                                                                                      
    proxy_pass          http://puppetmaster-thin;                                                                                                                                 
    }                                                                                                                                                                                 
}         

Я понял. Проблема заключалась в том, что nginx эффективно пытался обрабатывать статический любой запрос к /production/file_content/. Проблема в том, что, хотя это полезно для обслуживания файлов из модулей под /production/file_content/modules/, он угоняет /production/file_content/plugins.

Поскольку пути к плагинам являются «волшебными», их должен обрабатывать демон-мастер марионеток, а не nginx. Решение состоит в том, чтобы написать лучший конфигурационный файл nginx:

location /production/file_content/extra_files/ {                                                                                                                                  
    alias /etc/puppet/files/;                                                                                                                                                     
}                                                                                                                                                                                 
location /production/file_content/modules/ {                                                                                                                                      
    rewrite ^/production/file_content/modules/([^/]+)/(.*) /$1/files/$2;                                                                                                          
    break;                                                                                                                                                                        
    root /etc/puppet/modules/;                                                                                                                                                    
}