在Fabric中,如何检查是否存在Debian或Ubuntu软件包,如果不存在则安装它?

时间:2013-02-15 22:38:14

标签: python ubuntu debian fabric

我要求它快速安装memcached作为Fabric脚本设置测试服务器的一部分。想我会在这里记录下来以供将来参考。

3 个答案:

答案 0 :(得分:10)

将此superuser comment和此stackoverflow answer拼凑在一起。 (注意:我的运行时间为root,而非使用sudo):

def package_installed(pkg_name):
    """ref: http:superuser.com/questions/427318/#comment490784_427339"""
    cmd_f = 'dpkg-query -l "%s" | grep -q ^.i'
    cmd = cmd_f % (pkg_name)
    with settings(warn_only=True):
        result = run(cmd)
    return result.succeeded

def yes_install(pkg_name):
    """ref: https://stackoverflow.com/a/10439058/1093087"""
    run('apt-get --force-yes --yes install %s' % (pkg_name))

def make_sure_memcached_is_installed_and_running():
    if not package_installed('memcached'):
        yes_install('memcached')
    with settings(warn_only=True):
        run('/etc/init.d/memcached restart', pty=False)

答案 1 :(得分:1)

Fabtools是一个非常有用的Python模块,我将其添加到我的所有Fabric项目中。

它有一个方法deb.is_installed,用于检查是否安装了Debian软件包。在我的所有项目中使用这种标准方法很不错,Fabtools还提供了一些您可能喜欢的其他有用的包管理助手。

答案 2 :(得分:0)

检查是否已安装软件包(在本地运行以进行测试)

import re

def is_package_installed(pkgname):
    output = local('dpkg -s {}'.format(pkgname), capture=True)
    match = re.search(r'Status: (\w+.)*', output)
    if match and 'installed' in match.group(0).lower():
        return True
    return False