Python版“facter”?

时间:2011-03-01 02:28:17

标签: python facter

我正在考虑收集服务器数据,并且在这些服务器中预安装Python 2.6。 现在我想知道是否有Python库对应Ruby的“facter”,而不是Python的“绑定”for facter。

我用Google搜索但却找不到任何内容。有没有人对此有任何想法?

4 个答案:

答案 0 :(得分:5)

我看不出为什么你不会只使用facter本身的任何理由。输出格式很容易从python脚本中获取。

import subprocess
import pprint

def facter2dict( lines ):
        res = {}
        for line in lines:
                k, v = line.split(' => ')
                res[k] = v
        return res

def facter():
        p = subprocess.Popen( ['facter'], stdout=subprocess.PIPE )
        p.wait()
        lines = p.stdout.readlines()
        return facter2dict( lines )

if __name__ == "__main__":
        pprint.pprint( facter() )

答案 1 :(得分:4)

Salt实现了一个名为Grains的替代品。

http://docs.saltstack.org/en/latest/ref/modules/index.html#grains-data

也有人试图这样做,称为Phacter

http://code.google.com/p/speed/wiki/Phacter

我没有尝试过,但我同意这个概念。有些人可能不希望/能够在他们的系统上安装Ruby,但需要类似的功能。

答案 2 :(得分:1)

有点新http://github.com/hihellobolke/sillyfacter/

使用

安装
  # Needs pip v1.5
  pip install --upgrade --allow-all-external --allow-unverified netifaces sillyfacter

您可能还需要升级pip

  # To upgrade pip
  pip install --ugrade pip

答案 3 :(得分:0)

这是@ AndrewWalker建议的压缩版本。它还确保'=> '在拆分之前存在并删除尾随的\ n:

import subprocess

p = subprocess.Popen( ['facter'], stdout=subprocess.PIPE )
p.wait()
facts = p.stdout.readlines()
# strip removes the trailing \n
facts = dict(k.split(' => ') for k in [s.strip() for s in facts if ' => ' in s])
print facts["architecture"]

我想我会选择facterpypip install facterpy,然后:

import facter

facts = facter.Facter()
print facts["architecture"]