Rundeck这个产品很早就知道了,不过一直没有时间尝试,当时也没有相关的应用场景,最近cron job是越来越多,管理起来很是麻烦,忽然记起来还有Rundeck这么一个工具,决定先具体调研一番,看看是否能完全解决我的问题。


    rundeck是一款开源的可以帮助你在数据中心或者云环境自动运行日常程序的软件,rundeck提供了一些特性来缓解费事繁琐的工作,并且很容易让你扩展自己的自动化成果。rundeck允许你在web界面或者命令行上指定在任何节点运行任务。rundeck也包含了其他特性来容易的扩展的你的自动化成果,例如:访问控制、工作流构建、调度、日志等等。


    rundeck的特性如下:



  •     提供web api
  •     分布式命令执行
  •     可插拔的系统插件
  •     多步骤工作流构建
  •     以守护进程执行job或者调度运行
  •     图形化web控制台来控制job执行
  •     基于规则的访问控制,支持LDAP/AD
  •     历史及构建日志查看
  •     可以集成到外部工具
  •     命令行控制工具

先看看一些概念和术语:

    role-based access control policies

        rundeck的访问控制策略,授权用户和用户组以授权的权限来操作rundeck的资源,例如:project、job、nodes、commands、api。

    projects

        project是一个管理各个项目的地方,rundeck的活动都是在各自的project范围内进行活动,可以在一个rundeck server上设置多个project,多个project可以同一台rundeck server上进行操作维护。

     jobs

        job是一个封装的操作步骤序列,job选择节点和执行的步骤。

    nodes

        rundeck server可以访问的物理机或者虚拟机实例,资源以node模式在一个project中表示

    commands

        在node上可执行的单个字符串命令,rundeck通过node executor调用nodes上的commands。

    executions

        表示已经完成或者正在运行的command或者job,这些数据可以用来监控job的执行状态

    plugins

        rundeck 支持的第三方插件



下面我们看看rundeck的一些详细介绍:


    rundeck是一个服务端的应用,是一个由你控制的中央管理控制系统。在内部,rundeck存储job的定义和执行结果在一个关系数据库中,command和job执行结果的输出则保存在磁盘上,你也可以把这些结果重定向到远程存储上,例如:S3、logstash。rundeck分发分布式执行命令是通过可插拔的执行插件来分发的,默认是使用SSH,但是你也可以使用其他插件,例如:salt,或者你自定义的方法。rundeck服务端也可以配置在远程服务器上以哪个用户执行命令。

    rundeck是一个基于java的应用,需要jdk1.7的版本,该应用包括一个图形接口和一个网络接口,访问rundeck需要经过用户认证。运行rundeck不需要root或者管理员权限,我们建议使用一个单独的用户运行rundeck。rundeck启动后一般监听两个端口:http(4440)、https(4443)。保证客户端的22端口是被SSH监听的,因为rundeck默认使用ssh public-key来连接客户端。由于rundeck是基于java的,因此你在启动的时候可以修改一些默认配置,比如web端口之类的,格式如下:-Dproperty=value,加在java启动参数中即可,可以设置以下内容:

server.http.port The HTTP port to use for the server, default "4440"
    server.https.port The HTTPS port to use or the server, default "4443"
    server.http.host Address/hostname to listen on, default is all addresses "0.0.0.0"
    server.hostname Hostname to use for the server, default is the system hostname
    server.web.context Web context path to use, such as "/rundeck". Default is "/".
    rdeck.base Rundeck Basedir to use, default is the directory containing the launcher jar
    server.datastore.path Path to server datastore dir
    default.user.name Username for default user account to create
    default.user.password Password for default user account to create
    rundeck.jaaslogin "true/false" - if true, enable JAAS login. If false, use the realm.properties file for login information.
    loginmodule.name Custom JAAS loginmodule name to use
    loginmodule.conf.name Name of a custom JAAS config file, located in the server's config dir.
    rundeck.config.name Name of a custom rundeck config file, located in the server's config dir.
    rundeck.ssl.config Path to the SSL config properties file to enable SSL. If not set, SSL is not enabled.
    rundeck.jetty.connector.forwarded true/false. Set to true to enable support for "X-forwarded-*" headers which may be sent by a front-end proxy to the rundeck server. See Using an SSL Terminated Proxy.
    rundeck.jetty.connector.ssl.excludedProtocols Comma-separated list of SSL protocols to disable. Default: 'SSLv3'. See Disabling SSL Protocols.
    rundeck.jetty.connector.ssl.includedProtocols Comma-separated list of SSL protocols to include. Default is based on available protocols. See Disabling SSL Protocols.
    rundeck.jetty.connector.ssl.excludedCipherSuites Comma-separated list of Cipher suites to disable. No default. See Disabling SSL Protocols.
    rundeck.jetty.connector.ssl.includedCipherSuites Comma-separated list of Cipher suites to enable. Default is based on available cipher suites. See Disabling SSL Protocols.

    rundeck支持多用户配置,安装完毕后,会自动创建两个用户:user 是用来执行job和command的,密码是user。admin 是管理员用户,属于admin group,密码是admin。在浏览机器中访问即可,第一次登录rundeck时会让你创建一个project,project name可以包含数字以及字母,但是不能包含空格和特殊字符。

安装启动rundeck

    rundeck官方提供rpm和deb包,选择符合你操作系统的软件包即可,当然官方也提供编译好的tar包。我选择的是deb包:rundeck-2.5.2-1-GA.deb。安装完成后直接启动:/etc/init.d/rundeckd start

    如果你选择的已经编译好的tar包,则这样启动:$RDECK_BASE/server/sbin/rundeckd start


下面介绍一下rundeck的各个组件

project


    一个project就是一个管理独立活动的地方,rundeck的所有活动都发生在它自己的project范围内。多个project可以在一个rundeck server上进行维护,各个project之间是互相独立的,因此你可以像在一台单独的rundeck server上组织他们,你可以管理不同的基础设施、环境、应用。所以,在刚部署完毕的rundeck之后,第一件事就是创建project



    在rundeck 2.4以及之前,所project的定义和配置文件是存储在本地文件系统上的,自从rundeck 2.5开始,你可以设置把定义和配置文件存储在数据库上。需要在rundeck-config.properties配置文件中增加:rundeck.projectsStorageType=db或者filesystem,如果你以及使用了一个基于filesystem的存储系统,当你修改为db,重启rundeck之后,project会自动的加载进数据库中。这里的数据库不是mysql之类的关系数据库,是rundeck自己的Storage Facility数据库。

    当你使用基于fileststem的配置存储系统,每个project都有一个配置文件,叫做project.properties,位置在:/var/rundeck/projects/project-name/etc/project.properties。

    配置解释:http://rundeck.org/docs/administration/configuration-file-reference.html#project.properties

    我们可以通过web管理截面创建project,也可以通过rd-project命令行创建project。project的名称由字母数字构成,但是不能包含空格和特殊字符。输入project名称创建,rundeck会自动初始化,并跳转到job页面。


    如果创建了一个project,又希望时间久了还能记住该project的作用,你可以创建一个readme.md文件,来简单的介绍一个该project的作用,readme.md文件可以是markdown格式、甚至可以可以包含图片,这个readme.md文件默认是不自带的,你可以自建后,放置于/var/rundeck/projects/project-name/readme.md,然后在总的project管理截面会看到相关project的readme.md内容。


node

    Resource Model就是设置一组nodes,rundeck可以分发commands到这些nodes上。每个project都有自己的Resource Model。project创建完毕后,会有一个初始化的resource model文件包含一些rundeck server的信息,而且只能在本地运行command,你可以在nodes界面浏览这些信息。node的resource会包含一些基础的属性,例如hostname,但也有一些有用的属性,例如tags,tag就是你给该node的标签,一个node可以有多个标签,你可以通过标签对node进行分组。

    在project初始化之后,project会创建一个resource model source文件,project.properties文件中有resource model文件的配置路径(project.resources.file),一般在/var/rundeck/projects/project-name/etc/resources.xml。也可以为一个project配置多个Resource Model Sources,刚才说来Resource Model就是定义一组nodes,因此在一个Resource Model Sources文件中你可以定义多个node。Resource Model Sources文件目前支持两种格式:XML和YAML,默认是XML。

logging

    rundeck安装完毕后,在log目录下会有多个日志文件产生,默认日志路径是:/var/log/rundeck,会有以下日志文件:

command.log: Shell tools log their activity to the command.log
    rundeck.audit.log: Authorization messages pertaining to aclpolicy
    rundeck.job.log: Log of all job definition changes
    rundeck.options.log: Logs remote HTTP requests for Options JSON data
    rundeck.log: General Rundeck application messages
    service.log: Standard input and output generated during runtime

command

    command可以设置在node上执行你配置的命令,rundeck的图形截面提供了设置command的截面,设置完成后,rundeck通过ssh或者通过dispatch工具来执行命令。注意:你能够查看的节点以及能够执行哪些命令,是受ACL策略限制的。


后端使用RDB Database


    rundeck默认使用文件来存储数据,你也可以配置rundeck使用RDB来存储数据,比如:mysql。需要修改rundeck-config.properties文件的dataSource配置项。如下:

dataSource.url = jdbc:mysql://myserver/rundeckdb?autoReconnect=true
dataSource.username = dbuser
dataSource.password = dbpass
dataSource.driverClassName=com.mysql.jdbc.Driver


    使用jdbc连接mysql,rundeck默认已经自带了mysql的jdbc驱动,不需要你另外安装。