2017-02-16 42 views
0

我無法理解pip如何在特定環境中工作。問題是我正在嘗試使用OpenStack安裝部署方法來安裝OpenStack。它提供了劇本以準備完整的環境並安裝所有組件。在應該從私人倉庫安裝python模塊(在之前的部署步驟中構建它)的情況下,部署失敗。這個回購沒有別的作爲nginx服務器通過http協議暴露python輪子目錄。當OpenStack節點爲了安裝軟件包而用pip訪問這個回購站時,他們似乎沒有找到任何滿足約束條件的軟件包(我沒有使用需求文件發佈整個命令,但需要的版本在那裏)。每個節點也同樣期待HOME /./ PIP/pip.conf:使用回購其他pipi與pip

[global] 
    no-index = true 
    pre = True 
    timeout = 120 
    trusted-host = 
      172.21.51.152 

    [install] 
    upgrade = True 
    find-links = 
      http://172.21.51.152:8181/os-releases/14.0.7/ 

其中172.21.51.152是應該更換的PyPI是回購。

時應安裝軟件包劇本任務運行時都失敗,類似的錯誤:

根@控制1 - 加萊拉容器-434df170:〜#畫中畫安裝MySQL-python的 收集的MySQL-python的 找不到一個滿足要求的版本MySQL-python(從版本:) 沒有找到與MySQL-python匹配的發佈版

即使文件在那裏,我可以從文件所在的URL中獲取它。

ls /var/www/repo/os-releases/14.0.7/ | grep -i mysql_python 
    mysql_python-1.2.5-cp27-cp27mu-linux_x86_64.whl 

我使用tcpdump檢查了使用「pip install」命令時發送的請求pip的發送類型。它發送一個GET獲取到http://172.21.51.152:8181/os-releases/14.0.7/所有輪子文件。服務器與index.html文件回覆:

<html>\r\n 
    <head><title>Index of /</title></head>\r\n 
    <body bgcolor="white">\r\n 
    <h1>Index of /</h1><hr><pre><a href="../">../</a>\r\n 
    <a href="links/">links/</a>            
    <a href="openstackgit/">openstackgit/</a>          
    <a href="os-releases/">os-releases/</a>          
    <a href="pkg-cache/">pkg-cache/</a>           
    <a href="pools/">pools/</a>            
    <a href="venvs/">venvs/</a>            
    </pre><hr></body>\r\n 
    </html>\r\n 

得到這個答覆後,PIP似乎對結果滿足並決定它需要的軟件包是不存在。我正在試圖弄清楚這是否是預期的行爲,並且該回購存在問題,或者如果使用配置不足而無法執行搜索的pip啓動。

我試圖完全刪除pip.conf,pip正常工作只是從PyPI下載文件。我在這裏錯過了什麼,爲了使它從私人存儲庫工作?

感謝您的幫助!

+0

如果你正在使用'pip'運行到這個問題一直更適合,我見沒有理由將問題標記爲Ansible(或OpenStack)。使用Ansible模塊時有什麼區別嗎? – techraf

+0

從我的觀點來看,將此問題標記爲Ansible也是有意義的,因爲這可能引起熟悉OpenStack項目的人的注意。至少這是我對問題標記目的的理解。 –

回答

0

在OpenStack運營商郵件列表中解決了這個問題。是一個nginx服務器的問題,不工作autoindex。修復autoindes後,完整的目錄索引開始顯示哪些使pip能夠下載和安裝軟件包。

+0

爲了完整起見,以下是Danil提到的ML文章:http://lists.openstack.org/pipermail/openstack-operators/2017-February/012695.html –

0

FWIW,我不得不DANIL描述的非常相同的症狀:

[email protected]ra-container-434df170:~# pip install MySQL-python 
Collecting MySQL-python Could not find a version that satisfies the requirement MySQL-python (from versions:) 
No matching distribution found for MySQL-python 

在我的情況的根本原因是的077一個(限制性的)umask設置。

# [email protected] 
$ umask # octal 
0077 
$ umask -S # symbolic 
u=rwx,g=,o= 

默認似乎是022(符號:u=rwx,g=rx,o=rx),在https://en.wikipedia.org/wiki/Umask

細節的077本的umask影響nginx的配置文件(其中,例如,設置 '自動索引' 行爲,需要服務蟒蛇輪):

# [email protected] 
$ cd /etc/nginx/sites-available/ 
$ ll openstack-slushee.vhost 
-rw------- 1 root root [...] openstack-slushee.vhost 

如果也影響了Python包:

# [email protected] 
$ cd /var/www/repo/pools/ubuntu-16.04-x86_64/mysql_python/ 
$ ll mysql_python-1.2.5-cp27-cp27mu-linux_x86_64.whl 
-rw------- 1 nginx root [...] mysql_python-1.2.5-cp27-cp27mu-linux_x86_64.whl 

而且這些Python包也會從其他容器中的OpenStack的-ansible設置要求:

# [email protected] 
$ cat .pip/pip.conf 
[...] 
[install] 
upgrade = True 
find-links = 
    http://172.29.236.11:8181/os-releases/15.1.2/ubuntu-16.04-x86_64/ 

最終,它會影響它指定了Python包版本的文件:

# [email protected] 
$ cd /var/www/repo/os-releases/15.1.2/ubuntu-16.04-x86_64/ 
$ ll requirements_absolute_requirements.txt 
-rw------- 1 root root [...] requirements_absolute_requirements.txt 

你會注意到nginx在錯誤日誌中抱怨很多:

# [email protected] 
$ grep -i error /var/log/nginx/openstack-slushee.error.log | grep -i mysql 
2017/07/03 10:30:34 [error] 17458\#17458: *642 open() 
"/var/www/repo/os-releases/15.1.2/ubuntu-16.04-x86_64/ 
mysql_python-1.2.5-cp27-cp27mu-linux_x86_64.whl" failed 
(13: Permission denied), client: 172.29.236.11, 
server: openstack-slushee, 
request: "GET /os-releases/15.1.2/ubuntu-16.04-x86_64/ 
mysql_python-1.2.5-cp27-cp27mu-linux_x86_64.whl HTTP/1.1", 
host: "172.29.236.11:8181" 

長話短說,設置umask設置爲一個限制較少的模式開始的OpenStack-ansible前:

$ umask 0022 

旁註:

相關問題