zoukankan      html  css  js  c++  java
  • 【自动部署】服务器自动化操作 RunDeck

    RunDeck 是用 Java/Grails 写的开源工具,帮助用户在数据中心或者云环境中自动化各种操作和流程。通过命令行或者web界面,用户可以对任意数量的服务器进行操作,大大降低了对服务器自动化的门槛。

    RunDeck的作用:

    1. 在浏览器中执行服务器上任何非交互命令,比如ps, /etc/init.d/xxx restart,注意ssh之类的要在执行中输入密码的肯定不支持

    2. 对接服务器上的一键运维脚本,变成一个Job, 执行时只要点击按钮Run

    3. 自动记录命令操作记录和输出。

    预览一下官网的几张图片:

    Share Standard Operating Procedures
    输入图片说明

    Job Scheduler
    输入图片说明

    Automated Deployment After a Build
    输入图片说明

    Self-Service Test Environments
    输入图片说明

    Data Processing Jobs in the Cloud
    输入图片说明

    注意: 上面的几张部署图中的rundeck方块,如果替换成“命令行运维脚本”,照样能完成各自的目的,但是命令行相比RunDeck,缺少了两样Rundeck特有的特性:
    - 在浏览器上按钮操作
    - 记录命令的执行记录和输出结果

    再看看Rundeck执行Job时的屏幕截图:
    输入图片说明

    Rundeck与自动化工具Fabric的对比

    Fabric 是一个 Python (2.5 或更高) 库和命令行工具,用于连接到 SSH 服务器并执行命令。

    Rundeck服务运行的结点称为Server,Rundeck还可以添加其他结点叫node,只要设置自动登录所需的ssh帐号和密码,Rundeck就能涵盖Fabric的功能,但是不推荐这样使用,一旦Rundeck服务器无效,就连在命令行完成这些运维也不可能了。

    建议的使用方式是:所有运维脚本都存放在Rundeck服务器上,提供命令行调用和RunDeck调用两种方式,为命令行调用提供交互输入帐号和密码的功能,为Rundeck调用提供参数输入帐号和密码的功能。

    Rundeck的安全问题

    在浏览器中打开Rundeck服务器,并登录后,执行命令的帐号和权限,就是启动Rundeck服务的帐号和权限。
    所以如果以root启动Rundeck服务,那么在Rundeck中输入任何命令,都是以root执行,包括rm -rf /,init 0等危险操作都可执行。
    建议专门建立rundeck帐号启动Rundeck服务,并控制rundeck帐号的权限。

    RunDeck Web界面的登录帐号管理,默认管理员帐号是admin,密码admin,帐号和密码信息,只保存在配置文件中,可用的group是admin和user,可以设置user的权限,比如定义job,执行job等。更高级的权限得使用付费版的RunDeck Pro。

    RunDeck服务器的资源消耗

    RunDeck服务是一个standalone jar包,占用内存约500M。

    RunDeck服务器上已定义Job的执行方式

    1. Web界面上点击Run人工执行

    2. 通过RunDeck的命令行工具run执行

    3. RunDeck中设置为周期执行,就像cron一样。

    4. 通过Rest API,由其他http client执行,比如curl命令。

    上面第2种方式,用命令行工具run执行RunDeck job,好像有点多此一举,但正是此方式特别适用于手工或自动的服务器状态巡查。巡查必须要留下记录,不然只是巡查者的一面之辞。

    RunDeck服务器上Job的执行如何判断成功或失败

    很简单,执行后,如果rc是0,就是成功,否则就是失败。
    rc(Return Code),可以这样查看rc:

    shen@debian:~$ ls / 2>1 >/dev/null; echo $? 0 shen@debian:~$ ls /asdfsdf 2>1 >/dev/null; echo $? 2

    RunDeck安装与使用实例

    RunDeck,是我到现在为止,用过的Web服务器中,安装和使用最简单的。

    第1步:在准备安装Rundeck服务的Linux机器上安装jre,推荐OpenJDK

    Redhat/CentOS

    sudo yum install openjdk-7-jre


    Debian/Ubuntu 

    sudo apt-get install openjdk-7-jre

    下面是安装后的版本信息:

    shen@debian:~$ java -version
    java version "1.7.0_79" OpenJDK Runtime Environment (IcedTea 2.5.5) (7u79-2.5.5-1~deb7u1)
    OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)

    第2步:下载rundeck jar包,并启动服务器

    http://rundeck.org/downloads.html

    下载 rundeck-launcher-2.5.1.jar,官方说明如下:

    Put it in a directory named ~/rundeck
    Execute:
    java -jar rundeck-launcher-2.5.1.jar


    下载有点慢(晚上下载速度5KB/s,早上7点893KB/s),我已下载并放在百度云盘上: http://pan.baidu.com/s/1i3EMcNb

    我放在目录/home/shen/rundeck下运行:

    cd /home/shen/rundeck
    java -jar rundeck-launcher-2.5.1.jar

    输入图片说明

    最行一行输出的:Started表示已启动完成,:4440表示服务的端口为4440

    浏览器中输入网址: http://localhost:4440
    输入图片说明

    输入帐号admin,密码admin,登录:
    输入图片说明

    第3步:创建一个Project,比如adhoc,先体验一下在Web输入和执行命令。

    输入图片说明

    输入图片说明
    因为只在Rundeck服务器上运行本地命令,所以Resource Model Source删除yml文件,Default Node Executor选择Stub,Default Node File Copier也选择Stub。

    输入图片说明

    进入顶上Tab: Commands
    输入图片说明

    执行本地命令 pwd,应该输出:/home/shen/rundeck
    输入图片说明
    输入图片说明
    输入图片说明
    输入图片说明
    点击Run on 1 Node:
    输入图片说明
    pwd命令的输出:/home/shen/rundeck正是rundeck服务启动位置。

    执行 whoami,应该输出:shen
    输入图片说明

    上面两条命令返回状态都是绿色Successed,表示执行成功(rc=0),
    接下去尝试一个返回失败的命令ls /asdfsdf

    输入图片说明
    第3条命令返回状态都是红色Failed,表示执行失败(rc!=0),上图中输出的第1行是运行stderr输出,第2,3,4行是Rundeck额外输出,提示出错原因:**Return code was 2**

    接下去看看已经执行的3条命令的执行记录和输出,这里体现了Rundeck的最重要的特性。直接在Terminal下执行命令,是不可能事后找回命令输出的。

    点击网页第一行右上角的Activity:
    输入图片说明
    上图展示了3条已执行命令的执行编号,命令输入、执行时间、执行者,成功或失败状态。

    点击#3,进去查看第3条命令的执行详情:
    输入图片说明

    点击标签页(Summary | Report | Log Output | Definition)中的Log Output,可以看到执行的输出,包括stdout和stderr:
    输入图片说明

    点击View Options,可以设置某些选项:
    输入图片说明

    下面点击网页右上角的Run Again:
    输入图片说明

    更改命令为ls /asdfsdf /,并点击Run on 1 Node:
    输入图片说明
    上图中只显示了输出结果的最后20行,点击#4进去看执行详情:
    输入图片说明
    上图中列出了执行的所有stdout与stderr输出。

    第4步:创建另一个Project,比如jobs(乔布斯, ),体验job的定义和一键执行。

    输入图片说明

    点击“Create a new job”,或者点击右上角的Create Job > +New Job…
    输入图片说明

    按下图输入Job Name和Description
    输入图片说明

    输入图片说明
    在Add a Step中点击Execute an inline script
    输入图片说明
    如上图,Enter the entire script to execute中输入ls /abcd1234 /
    点击Save,保存Step定义,一个Job中可以有多个Step,我们的第一个Job是最简单的定义,只有一个步骤,该步骤中直接包含1个命令。

    输入图片说明
    点击Create完成Job定义:
    输入图片说明
    点击Run Job Now:
    输入图片说明
    查看Log Output:
    输入图片说明

    点击网页左上角的RUNDECK,回到首页:
    输入图片说明

    点击Project jobs的链接“1 Execution In the last day”:
    输入图片说明
    可以看到此Project的最近Job或Command的执行历史。

    点击网页第一行的Jobs可以看到该Project的Job列表:
    输入图片说明

    下面在添加一个Job: how,探索一下Rundeck是怎么执行Job的。
    输入图片说明

    Step定义为如下脚本:

    echo '`pwd` ->' pwd echo '$0 ->' echo $0 echo '`ps` ->' ps


    输入图片说明

    Job执行结果:
    输入图片说明
    Job执行时,创建了一个/tmp/下的临时脚本文件:
    /tmp/1-6-debian-dispatch-script.tmp.sh

    ps列出的是ps进程及它的祖先进程,其他java就是rundeck服务。 

    参考资料:

    http://www.oschina.net/p/rundeck/similar_projects?sort=view&lang=25

  • 相关阅读:
    简单的模板解析函数
    HTML通过事件传递参数到js 二 event
    HTML通过事件传递参数到js一
    通过this获取当前点击选项相关数据
    LeetCode 20. 有效的括号(Valid Parentheses)
    LeetCode 459. 重复的子字符串(Repeated Substring Pattern)
    LeetCode 14. 最长公共前缀(Longest Common Prefix)
    LeetCode 168. Excel表列名称(Excel Sheet Column Title)
    LeetCode 171. Excel表列序号(Excel Sheet Column Number) 22
    LeetCode 665. 非递减数列(Non-decreasing Array)
  • 原文地址:https://www.cnblogs.com/junneyang/p/5794603.html
Copyright © 2011-2022 走看看