理解SaltStack(8) – Python

我知道我们之前有说过使用Salt不需要会写Python和其它代码,这当然是真的。不过会读Python代码在许多情况下会有所帮助,或者至少会读Python函数文档。
本文介绍Python基础知识,帮助你更好地了解salt的工作原理。

模块

Salt中,每个子系统插件是一个Python模块。你可以认为salt模块是一组函数(又称命令)组成,用来管理应用(mysql.docker),系统组件(硬盘,文件)或与外部系统(gitfs)交互。
你需要了解几点:

  • 所有的模块都在源文件夹的salt目录。每个子系统是一个单独的目录,每个模块是一个单独的python文件
  • 模块以salt.subsystem.module格式命名。此命令空间在文档中可找到,所以你可以快速识别目前在看哪个子系统模块。唯一一个令人困惑的是:执行模块以salt.module开头,是由于这个模块是初始版本中的第一个模块并且只有这个模块可用。
  • 模块包含了我们需要的多个或少量的函数。由于文件管理需要做的事情非常多,所以文件执行模块(salt.modules.file)包含了非常多的函数。而uwsgi统计服务器执行模块(salt.modules.uwsgi)只有一个函数。
  • 函数

    所以你理解了以上的模块,函数应该就更简单了。你可以认为函数是在模块中指定的命令,能调用来管理和配置文件。例如,salt.modules.pkg.install, salt.modules.network.interfaces和salt.modules.user.add都是常见的执行模块函数。函数相当于salt的动词,你通常可以打开模块文档并查看函数名称来决定使用哪个函数。

    参数

    参数有一点复杂,特别是如果是对关键词参数不是很熟悉,参数很可能是你准备入门salt遇到问题的地方。
    远程执行和状态之间的参数不太一样,我们来分别讨论。

    执行函数参数

    当在命令行调用salt时,执行参数作为附加值传递过去,或者作为一个值,或者作为argument = value。必需值通常以空格分隔并以指定顺序传递,带默认值的可选参数以argument=value格式传递。
    例如,我们来看下salt.modules.useradd.add函数:

    1. salt.modules.useradd.add(name, uid=None, gid=None, groups=None, home=None,
    2. shell=None, unique=True, system=False, fullname=”, roomnumber=”,
    3. workphone=”, homephone=”, createhome=True, loginclass=None)

    当调用这个模块,参数name是必需的,你可以看到它没有默认值。其余的参数会使用列出的值,除非你传一个不同的值来覆盖。下面的例子是创建一个用户名为Fred并设置一个不同的默认shell:

    1. salt ‘*’ user.add fred shell=/bin/zsh

    更多的例子
    常规参数和关键字参数(通常缩写为args和kwargs)是你将遇到的最常见的类型。下面的例子传递一个arg和3个kwargs:

    1. salt ‘*’ network.connect google-public-dns-a.google.com port=53 proto=udp timeout=3

    传递两个args和一个kwarg:

    1. salt ‘*’ cp.get_file salt://vimrc /etc/vimrc gzip=5

    一些执行模块接收列表值:

    1. `salt ns1 pkg.install pkgs=[‘bind9′,’bind9-docs’,’bind-utils’]`

    一些甚至可以传字典类型:

    1. `salt ‘*’ pkg.install sources='[{"foo": "salt://foo.deb"},{"bar": "salt://bar.deb"}]’`

    state函数参数

    State函数在state文件中使用YAML语法调用。YAML语法非常适合表示数据类型,所以你会发现调用具有复杂数据类型的函数在state中更容易。为了弄清楚在state中如何添加用户,我们来看下salt.states.user.present函数:

    1. salt.states.user.present(name, uid=None, gid=None, gid_from_name=False,
    2. groups=None, optional_groups=None, remove_groups=True, home=None,
    3. createhome=True, password=None, hash_password=False, enforce_password=True,
    4. empty_password=False, shell=None, unique=True, system=False, fullname=None,
    5. roomnumber=None, workphone=None, homephone=None, loginclass=None, date=None,
    6. mindays=None, maxdays=None, inactdays=None, warndays=None, expire=None,
    7. win_homedrive=None, win_profile=None, win_logonscript=None,
    8. win_description=None)

    即使这个函数有许多参数,在YAML中调用带关键词参数的函数很容易:

    1. a state example that calls user.present:
    2. user.present:
    3.     – name: fred
    4.     – shell: /bin/zsh

    list类型在YAML中也很容易定义:

    1. install bind packages:
    2.   pkg.installed:
    3.     – pkgs:
    4.       – bind9
    5.       – bind9-docs
    6.       – bind-utils

    定义字典也比在命令行中容易:

    1. Install some packages using other sources:
    2.   pkg.installed:
    3.     – name: mypkgs
    4.     – sources:
    5.       – foo: salt://foo.deb
    6.       – bar: http://somesite.org/bar.deb