Func 常用模块及 API

Func 提供了非常丰富的功能模块,包括 CommandModule(执行命令)、CopyFileModule(拷贝文件)、CpuModule(CPU信息)、DiskModule(磁盘信息)、FileTrackerModule(文件跟踪)、IPtablesModule(iptables管理)、MountModule(Mount挂载)、NagiosServerModule(Nagios管理)、NetworkTest(网络测试)、ProcessModule(进程管理)、SysctlModule(sysctl管理)、SNMPModule(SNMP信息),等等,更多模块介绍见官网模块介绍: https://fedorahosted.org/func/wiki/ModulesList 。命令行调用模块格式:

func <目标主机> call <module_name(模块名)><method_name(方法名)> <module_args(模块参数)>

模块命令行执行结果都以 Python 的元组字符串返回(API 以字典形式返回),这对后续进行结果集的解析工作非常有利,例如,远程运行 “df -m” 命令的运行结果如图11-2所示。

image 2023 12 09 12 32 50 468
Figure 1. 图11-2 返回主机内存使用信息

在所有模块中,CommandModule 模块最常用,可以在目标被控主机执行任意命令。笔者建议使用 API 方式对应用场景的逻辑进行封装,将权限放到一个预先定制好的方框中,实现收敛操作。下面对 Func 常用的模块一一进行讲解。

选择目标主机

Func 选择目标主机操作对象支持 “*” 与 “?” 方式匹配,其中 “*” 代表任意多个字符,“?” 代表单个任意字符,例如:

# func "SN2013-*-02?" call command run "uptime"

“SN2013-*-02?” 在本文环境中将匹配到 SN2013-08-021、SN2013-08-022 两台主机,可以根据实际应用场景随意组合。例如,我们定义的多台Web业务服务器主机名分别为:web1、web2、web3、…、webn.webapp.com,要查看所有 Web 应用的 uptime 信息可以运行:

# func "web*.webapp.com" call command run "uptime"

多个目标主机名使用分号分隔,如:

# func "web.example.org;mailserver.example.org;db.example.org" call command run "df -m"

常用模块详解

  1. 执行命令模块

    (1) 功能

    CommandModule 实现 Linux 远程命令调用执行。

    (2) 命令行模式

    # func "*" call command run "ulimit -a"
    # func "SN2013-08-022" call command run "free -m"

    (3) API模式

    import func.overlord.client as func
    client = func.Client("SN2013-08-022")
    print client.command.run("free -m")
  2. 文件拷贝模块

    (1) 功能

    CopyFileModule 实现主控端向目标主机拷贝文件,类似于 scp 的功能。

    (2) 命令行模式

    # func "SN2013-08-022" copyfile -f /etc/sysctl.conf --remotepath /etc/sysctl.conf

    (3) API模式

    import func.overlord.client as func
    client = func.Client("SN2013-08-022")
    client.local.copyfile.send("/etc/sysctl.conf","/tmp/sysctl.conf")
  3. CPU信息模块

    (1) 功能 CpuModule 获取远程主机 CPU 信息,支持按时间(秒)采样平均值,如下面示例中的参数“10”。

    (2) 命令行模式

    # func "SN2013-08-022" call cpu usage
    # func "SN2013-08-022" call cpu usage 10

    (3) API模式

    import func.overlord.client as func
    client = func.Client("SN2013-08-022")
    print client.cpu.usage(10)
  4. 磁盘信息模块

    (1) 功能 DiskModule 实现获取远程主机的磁盘分区信息,参数为分区标签,如 /data 分区。

    (2) 命令行模式

    # func "SN2013-08-022" call disk usage
    # func "SN2013-08-022" call disk usage /data

    (3) API模式

    import func.overlord.client as func
    client = func.Client("SN2013-08-022")
    print  client.disk.usage("/dev/sda3")
  5. 拷贝远程文件模块

    (1) 功能

    GetFileModule 实现拉取远程 Linux 主机指定文件到主控端目录,不支持命令行模式。

    (2) API 模式

    import func.overlord.client as func
    client = func.Client("SN2013-08-022")
    client.local.getfile.get("/etc/sysctl.conf","/tmp/")
  6. iptables 管理模块

    (1) 功能

    IPtablesModule 实现远程主机 iptables 配置。

    (2) 命令行模式

    # func "SN2013-08-022" call iptables.port drop_to 53192.168.0.0/24 udp src
    # func "SN2013-08-022" call iptables drop_from 192.168.0.10

    (3) API模式

    import func.overlord.client as func
    client = func.Client("SN2013-08-022")
    client.iptables.port.drop_to(8080, "192.168.0.10", "tcp", "dst")
  7. 系统硬件信息模块

    (1) 功能 HardwareModule 返回远程主机系统硬件信息。

    (2) 命令行模式

    # func "SN2013-08-022" call hardware info
    # func "SN2013-08-022" call hardware hal_info

    (3) API模式

    import func.overlord.client as func
    client = func.Client("SN2013-08-022")
    print client.hardware.info(with_devices=True)
    print client.hardware.hal_info()
  8. 系统Mount管理模块

    (1) 功能 MountModule 实现远程主机 Linux 系统挂载、卸载分区管理。

    (2) 命令行模式

    # func "SN2013-08-022" call mount list
    # func "SN2013-08-022" call mount mount /dev/sda3 /data
    #  func "SN2013-08-022" call mount umount "/data"

    (3) API模式

    import func.overlord.client as func
    client = func.Client("SN2013-08-022")
    print client.mount.list()
    print client.mount.umount("/data")
    print client.mount.mount("/dev/sda3","/data")
  9. 系统进程管理模块

    (1) 功能 ProcessModule 实现远程 Linux 主机进程管理。

    (2) 命令行模式

    # func "SN2013-08-022" call process info "aux"
    # func "SN2013-08-022" call process pkill nginx -9
    # func "SN2013-08-022" call process kill nginx SIGHUP

    (3) API模式

    import func.overlord.client as func
    client = func.Client("SN2013-08-022")
    print client.process.info("aux")
    print client.process.pkill("nginx", "-9")
    print client.process.kill("nginx", "SIGHUP")
  10. 系统服务管理模块

    (1) 功能 ServiceModule 实现远程 Linux 主机系统服务管理。

    (2) 命令行模式

    # func "SN2013-08-022" call service start nginx

    (3) API模式

    import func.overlord.client as func
    client = func.Client("SN2013-08-022")
    print client.service.start("nginx")
  11. 系统内核参数管理模块

    (1) 功能

    SysctlModule 实现远程 Linux 主机系统内核参数管理。

    (2) 命令行模式

    # func "SN2013-08-022" call sysctl list
    # func "SN2013-08-022" call sysctl get net.nf_conntrack_max
    # func "SN2013-08-022" call sysctl set net.nf_conntrack_max 15449

    (3) API模式

    import func.overlord.client as func
    client = func.Client("SN2013-08-022")
    print  client.sysctl.list()
    print  client.sysctl.get('net.ipv4.icmp_echo_ignore_broadcasts')
    print  client.sysctl.set('net.ipv4.tcp_syncookies', 1)

    func 命令功能参数举例:

    1) 查看所有主机 uptime,开启 5 个线程异步运行,超时时间为 3 秒,命令如下:

    # func -t 3 "*" call --forks="5" --async command run "/usr/bin/uptime"

    2) 格式化输出结果,默认格式为 Python 的元组,分别添加 --jsion 或 --xml 来输出 JSON 及 XML 格式,命令如下:

    # func -t 3 "*" call --forks="5" --json --async command run "/usr/bin/uptime"