内容


动态自定义云映像实例的参数

学习在 IBM 云环境中参数化 Linux 映像的相关概念与说明

Comments

有两种创建自定义映像的方式:静态与动态。静态方式包括创建实例、进行自定义、以及从该自定义实例获取映像。静态方式是最简单的任务。

所需的自定义映像的一些特征,只能依据在创建实例时所掌握的信息来确定;在本例中,需要动态地将信息传递给实例创建进程,来创建最终的自定义实例。

本文解释了如何对映像进行参数化,该流程处于概念级别,并逐步介绍如何执行每个子任务。一旦对映像进行了参数化,就可通过 IBM® 云门户或者 API 将参数发送给实例创建进程。

这是 IBM 智慧业务开发与测试云非常重要的特性,因为这允许您在运行时创建量身定制的实例。

在本文中,我们将创建已配置了 VNC-access 和已有用户的新映像。相关参数为:

  • VNC 密码。
  • 用户名。
  • 用户密码。

目的在于能够通过 IBM 云门户来请求创建基于参数化的映像的实例;我将向您展示我能够通过 VNC,利用特定的用户/密码来提供参数并对服务器进行访问。

我们首先来讨论一下参数化及整个流程背后的概念。

参数化概念

通常,参数 是那些在使用时需要填入的真实值或类型的占位符。参数化(Parameterization)(通常也用 parametrization/parameterisation/parametrisation)是为一个完整的或者相关的规格确定或定义必要参数的流程。

变量任务 需要有参数,因此最好对其进行参数化。本文中的例子包括了设置 VNC 密码或者创建用户。

非变量任务 不需要参数(比如请求操作系统实例);这可通过简单的静态方式来完成。

参数化流程

整个流程的工作大概是这样的:

  1. 确定哪些是变量任务,哪些是非变量任务。
  2. 创建实例并实现非变量任务。这包括:
    1. 请求实例。
    2. 编辑 /etc/xinetd.d/vnc 文件。
    3. 增加 xstartup 文件。
    4. 设置防火墙。
  3. 将实例作为映像保存在私有目录中。这包括:
    1. 保存实例。
    2. 下载相应的 Rational Asset Manager 资产。
  4. 创建变量属性。
  5. 实施变量任务。这包括:
    1. 增加 VNC 密码。
    2. 创建用户并设置密码。
  6. 调用实施的任务。
  7. 描述应当在哪里加载实施的任务。
  8. 利用脚本更新 Rational Asset Manager。
  9. 基于新的自定义映像创建实例。

IBM 云提供参数化映像的方法。映像存储在 Rational® Asset Manager (RAM) 中。通过在 Rational Asset Manager 资产中发布代表映像的文件,您可以与实例创建进程互操作。

文件之一是 parameters.xml 文件。为该文件增加 XML 标记,来描述在实例请求过程中想要捕获的字段。该字段标记的示例之一是:

<field name="userID" label="User ID" type="string"/>

您可通过 IBM 云门户,在支持文档中找到更多标记信息。

文件 parameters.xml 复制到位于 /etc/cloud 目录的实例中,该文件可被读取来提取需要在实例请求过程中输入的字段值。

在 Rational Asset Manager 中,您还可以在实例引导过程的早期阶段发布一些文件来加载到实例中。称为 scripts.txt 的文件用于描述从 Rational Asset Manager 导出的文件,其在实例中的最终位置。例如:

cloud-startup5.sh=/etc/init.d/cloud-startup5.sh
addvncpassword.txt=/etc/cloud/addvncpassword.sh
createUser.txt=/etc/cloud/createUser.sh
replace.txt=/etc/cloud/replace.pl

当实例以 GUI 模式(级别 init 5)启动时,采用 cloud-startup5.shcloud-startup3.sh 在启动级别 3 中启动的是 文本模式。在此处 GUI 模式采用的实例意味着您必须更新 cloud-startup5.sh 文件。

另一个文件,在 Linux® 映像中默认提供的,是用于从 XML 文件中检索特定标记值的 Perl 脚本文件。其在实例创建过程中位于 /usr/bin/extract-parameters.xml,来在实例请求过程中提取参数集。

现在,让我们看一下映像参数化的说明。

第 1 步.识别变量或非变量任务

环境设置的任务包括:

  1. 请求一个 OS 实例。
  2. 编辑 /etc/xinetd.d/vnc 文件。
  3. 设置 VNC 密码
  4. 增加 xstartup 文件。
  5. 设置防火墙。
  6. 创建用户。
  7. 为用户设置密码。

接下来,确定任务是变量还是非变量任务。如果任务需要参数,那么任务是变量任务:

  1. 请求一个 OS 实例。
    非变量;将基于这一 OS 完成自定义。
  2. 编辑 /etc/xinetd.d/vnc 文件。
    非变量;由于设置此文件不需要参数,因此可对变更进行硬编码。
  3. 设置 VNC 密码。
    变量;密码是参数之一。
  4. 增加 xstartup 文件。
    非变量;该文件不需要任何参数。
  5. 设置防火墙。
    非变量;访问 VNC 的端口是静态的。
  6. 创建用户。
    变量;用户名是参数之一。
  7. 为用户设置密码。
    变量;密码是参数之一。

第 2 步. 创建实例并实现非变量任务

要创建实例并实现非变量任务:

  1. 请求一个实例。基于 SuSE 11 操作系统来请求一个实例,照常输入一个名字,一个密钥对...等等。
  2. 编辑 /etc/xinetd.d/vnc 文件。 依照可从 IBM 云门户 Support 选项卡访问的 IBM Cloud User Guide 说明。
  3. 增加 xstartup 文件。依照可从 IBM 云门户 Support 选项卡访问的 IBM Cloud User Guide 说明。
  4. 设置防火墙。依照可从 IBM 云门户 Support 选项卡访问的 IBM Cloud User Guide 说明。(见图 1) 正如您所看到的, IBM Cloud User Guide 包含关于这一步骤的重要细节。
图 1. 设置防火墙
设置防火墙
设置防火墙

第 3 步. 将实例作为映像保存在您的私有目录中

由于执行了所有这些非变量任务,所以您可将此映像保存到您的私有目录中。用于从该映像重新生成实例的参数作为资产存储在 Rational Asset Manager 中。您可下载该资产,并按需对其进行修改。

将实例作为映像保存在您的私有目录中的两个步骤是:

  1. 保存实例。您可使用常规方法将实例保存为映像。为该映像提供一个名字及描述。
    图 2. 配置私有映像
    配置私有映像
    配置私有映像
  2. 下载在 Rational Asset Catalog 中与您的映像相对应的 Rational Asset Manager 资产:
    1. 在 IBM 云门户的控制面板上,单击 View Assets Catalog。您将被重定位到 Rational Asset Manager。
      图 3. Rational Assets Catalog
      Rational Assets Catalog
      Rational Assets Catalog
    2. 单击 My Dashboard
    3. 单击您的资产。
      图e 4. My Dashboard
      My Dashboard
      My Dashboard
    4. 下载资产并保存到您的环境中。
      图 5. 下载资产
      下载资产
      下载资产
    5. 选择内容。
      图 6. 内容清单
      选择内容
      选择内容

您会看到大量文件,包括 parameters.xml。

第 4 步. 创建变量属性

要创建变量属性:

  1. 在您本地环境中打开 parameters.xml 文件。
  2. 您会看到一些防火墙规则。
  3. 在最终的 parameters.xml 文件中增加字段标记(清单 1):
    清单 1. 最终的 parameters.xml 文件
    <?xml version="1.0" encoding="UTF-8"?>
    <parameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation=
     "platform:/resource/com.ibm.ccl.devcloud.client/schema/parameters.xsd">
    	<firewall>
    		<rule>
    			<source>0.0.0.0/0</source>
    			<minport>1</minport>
    			<maxport>65535</maxport>
    		</rule>
    	</firewall>
    	<field name="userID" label="User ID" type="string"/>
    	<field name="userPassword" label="User Password" type="password"
            pattern="^\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w*$"
            patternErrorMessage="Invalid Password. Must contain at least 1 number, 
           at least 1 lower case letter, and at least 1 upper case letter.">
    	</field>
    	<field name="vncPassword" label="VNC Password" type="password"
            pattern="^\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w*$"
            patternErrorMessage="Invalid Password. Must contain at least 1 number, 
           at least 1 lower case letter, and at least 1 upper case letter.">
    	</field>
    </parameters>
  4. 注意:最终的文件不能包含任何回车/换行(CR/LF);只允许包含 LF 。利用 dos2unix 之类的 DOS 编辑命令,将 CR/LF 转换为 LF。这对于所有想要加载到 Rational Asset Manager 资产的文件都有效。

    此外,不要将任何 LF 放到标记的中间。

  5. 将 parameters.xml 文件加载到资产中,单击 pencil 来编辑资产。浏览您的新 parameters.xml 文件。
    图 7. 编辑资产
    编辑资产
    编辑资产
  6. 单击位于页面底部的 Update 并提供一个注释。
  7. 返回到门户并从私有目录中选择您的映像。
    图 8. 选择您的映像
    选择您的映像
    选择您的映像
  8. 单击位于弹出窗口底部的 Next
  9. 照常提供名字并单击 Next。您将会看到新的,包含您在 parameters.xml 文件中定义的不同参数的弹出窗口。如果不是,那可能是浏览器缓存了映像规范。尝试移除所有与门户相关的 cookies(www-147.ibm.com)然后再试试。应该能解决问题。
    图 9. 增加实例
    增加实例窗口
    增加实例窗口
  10. 单击 Cancel

第 5 步. 实施变量任务

总之,您需要:

  • 一个脚本来增加 VNC 密码。
  • 另一个脚本来创建用户。

这些脚本从 cloud-startup5.sh 中调用。第三个脚本描述在资产中加载的其他脚本的位置。

我习惯于将所有自定义脚本发布到 /etc/cloud 目录中,这样找起来很方便。所有脚本都位于 Rational Asset Manager 资产中 activation_scripts 目录下面。

您可在您的实例中运行脚本来进行测试。

第 5.1. 步 增加 VNC 密码

以下是增加 VNC 密码的脚本;提供了文件 addvncpassword.txt。

mkdir /root/.vnc
echo "vncPassword" | vncpasswd -f > /root/.vnc/passwd
chmod 777 /var/lib/gdm

基于 SuSE 11-based 映像问题而增加了最后一行。如果不在脚本中增加此行,将会导致在采用 VNC 连接实例时出现弹出错误。脚本的第一行和最后一行也将采用静态方法执行,而不作为脚本的一部分来执行。

第 5.2. 步 创建用户并设置密码

以下是用于创建用户的脚本;提供了 createUser.txt 文件。

useradd -m userID
echo "userPassword" | passwd --stdin userID

出于安全考虑,您可设置密码过期,来强制用户在首次登录时提供新密码。

第 6 步. 调用实施的任务

所实施的项目可通过 cloud-startup5.sh 调用,这在 init 5(表示 SuSE OS、多用户、基于 GUI)过程中启动。

如清单 2 一样改变 cloud-startup5.sh

清单 2. 改变了 shell cloud-startup5.sh 来调用实施的任务
# Required-Stop:
# Should-Stop:
# Default-Start:     3
# Default-Stop:
# Short-Description: Cloud startup
# Description:       Extract and set user password
### END INIT INFO

case "$1" in
    start)
        echo "== Cloud Starting"
        if [ ! -e /etc/cloud/idcuser_pw_randomized ]; then
            echo "Randomizing idcuser password"
            echo idcuser:`< /dev/urandom tr -dc _A-Z-a-z-0-9 |head -c16` |
              /usr/sbin/chpasswd
            touch /etc/cloud/idcuser_pw_randomized
        fi
        if [ ! -e /etc/cloud/parameters.xml.done ]; then
            echo "VNC Create password"
            perl /etc/cloud/replace.pl /etc/cloud/addvncpassword.sh vncPassword
            . /etc/cloud/addvncpassword.sh
            echo "Create user"
            perl /etc/cloud/replace.pl /etc/cloud/createUser.sh userID
            perl /etc/cloud/replace.pl /etc/cloud/createUser.sh userPassword
            . /etc/cloud/createUser.sh
            cp /etc/cloud/parameters.xml /etc/cloud/parameters.xml.done
        fi
        ;;
    stop)

        echo "== Cloud Stopping"

        ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
        ;;
esac

在添加的行中:

        if [ ! -e /etc/cloud/parameters.xml.done ]; then
            echo "VNC Create password"
            perl /etc/cloud/replace.pl /etc/cloud/addvncpassword.sh vncPassword
            . /etc/cloud/addvncpassword.sh
            echo "Create user"
            perl /etc/cloud/replace.pl /etc/cloud/createUser.sh userID
            perl /etc/cloud/replace.pl /etc/cloud/createUser.sh userPassword
            . /etc/cloud/createUser.sh
            cp /etc/cloud/parameters.xml /etc/cloud/parameters.xml.done
        fi

我利用文件 /etc/cloud/parameters.xml.done 作为信号,来仅在服务器首次启动时运行这些行。

我利用 Perl 脚本,replace.pl,利用在 parameters.xml 中找到的相应的值来替换所给文件中的关键字。您可使用任何其他方法来激活相同的结果。

第一个 Perl 命令用 parameters.xml 文件中描述该关键字的值替换了 addvncpassword.sh 文件中的关键字 vncPassword

然后调用 addvncpassword.sh 文件。addvncpassword.txt 文件被加载到 /etc/cloud 中,其所采用的机制会在后面进行解释。

第二个 Perl 脚本替换 userID 关键字;第三个 Perl 脚本利用在 parameters.xml 中找到的信息替换文件 createUser.sh 中的 userPassword 关键字。

然后调用了 createUser.sh

最终 parameters.xml 文件拷贝到 parameters.xml.done 来避免多次运行这些行。

出于安全目的,您可向脚本中增加一些行,来从 parameters.xml 中清除密码值。

第 7 步. 描述可以在哪里加载已执行的任务

在实例创建期间,应当将这些任务/脚本加载到正确的位置。IBM Cloud 包含创建主要用于描述应当在哪里加载每个文件的文件(称为 scripts.txt)的机制。

这是 scripts.txt 文件:

cloud-startup5.sh=/etc/init.d/cloud-startup5.sh
addvncpassword.txt=/etc/cloud/addvncpassword.sh
createUser.txt=/etc/cloud/createUser.sh
replace.txt=/etc/cloud/replace.pl

在本例中,cloud-startup5.sh 被加载到 /etc/init.d/cloud-startup5.sh 位置等等。

第 8 步. 利用脚本升级 RAM

您已经加载了 parameters.xml,现在加载位于资产 activation_scripts 目录中的以下脚本

  • addvncpassword.txt
  • cloud-startup5.sh
  • createUser.txt
  • replace.txt
  • scripts.txt

要加载脚本:

  1. 编辑您的资产并单击 More options
    图 10. More options
    More options
    More options
  2. 单击 activation_scripts。如果 activation_scripts 不存在,通过 “Create a folder” 选项来进行创建。
    图 11. activation_scripts
    activation scripts
    activation scripts
  3. 单击 AddAjouter)并浏览您的文件。
    图 12. 增加文件
    选择文件来增加
    选择文件来增加
  4. 单击 Update
    图 13. Update
    Update
    Update
  5. 提供了注释后,再次单击 Update。在本例中,增加注释 “Upload scripts."
    图 14. 更新注释
    更新注释
    更新注释
  6. 现在可以测试了。

第 9 步. 基于新自定义映像创建实例

要基于新自定义映像创建实例:

  1. 进入您的私有目录并选择您的自定义映像。
    图 15. 选择映像
    选择映像
    选择映像
  2. 单击 Next
  3. 输入 Request Name 然后单击 Next
    图 16. 配置映像
    配置映像
    配置映像
  4. 输入 VNC 用户和密码。
    图 17. 配置附加参数
    配置附加参数
    配置附加参数
  5. 单击 Next 然后提交信息。
  6. 现在您可利用新的实例 IP 地址来连接所使用的 VNCViewer。
    图 18. VNCViewer 连接细节
    VNCViewer
    VNCViewer
  7. 注意 IP 地址后面的 :1。单击 OK
  8. 输入 VNC 密码并单击 OK
    图 19. VNCViewer 认证
    VNCViewer 认证
    VNCViewer 认证
  9. 输入 “用户” 和 “密码”,然后您会看到图 20。
    图 20. 登录窗口
    登录窗口
    登录窗口
  10. 成功!

    图 21. 成功!
    成功!
    成功!

Bonus

您可改变 GetStarted.html 文件,来在您的资产中提供更多信息。一旦您修改个这个文件,可通过 RAM 来加载。当您选择新的实例时,您将会在 IBM 云门户控制面板的底部见到 GetStarted.html。

就是这样了。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing, Rational
ArticleID=627358
ArticleTitle=动态自定义云映像实例的参数
publish-date=02172011