红帽首席架构师Michael Solberg将为你提供一些实际操作的指导,告诉你在OpenStack上使用Ansible进行持续集成的具体方法。
据《OpenStack用户调查》显示,对工作流的持续集成(CI)是OpenStack云的主要使用案例。Ansible作为推动持续集成的主要工具之一,与OpenStack项目一直保持着顺畅沟通。在本文当中,我们将浏览部署一个新虚拟机,以及在OpenStack云上运行一个针对该虚拟机的Ansible playbook的整个流程。
Ansible中的配置管理是围绕着一个名为playbook(剧本)的结构创建的。最简单的形式是,playbook为一个定义在Ansible 目录中的YAML文件,它描述了一个针对一组主机的任务列表。Playbook由一个或多个“play”组成,它可以用于对任务进行分组。
以下是一个示例,这个简单的playbook只有一个play,此为《Ansible Playbook 介绍》中网络服务器示例的简化版。
这个playbook告诉Ansible作为远程用户的centos登录在其目录中被定义为“webservers”的主机清单,通过sudo成为root用户,然后执行两个任务。第一个任务是安装http包,第二个任务是确保httpd服务正处于运行当中。Ansible中的任务为幂等,当playbook处于运行状态时,它们将告诉你哪些任务需要对系统进行调整,哪些任务则不需要。
手动在你的 OpenStack 租户中启动一个 CentOS 镜像并为其分配一个浮动IP 来运行第一个 play。确保你可以使用 “centos” 用户密钥免密码登录到系统。然后创建一个下面这样简单的主机清单文件,将 192.168.0.10 替换为你自己的浮动IP:
运行以下示例playbook:
在这里“hosts”是你所创建的主机文件名称,“webserver.yml”是包括上述playbook的文件。关于Ansible主机文件的结构和格式的更多信息请参见《Ansible Inventory》文件(http://docs.ansible.com/ansible/intro_inventory.html)。
你应该看到任务被成功执行,Apache HTTP服务器被安装并在实例上运行。如果任务失败,检查你的SSH密钥配置是否正确,实例能否访问互联网并下载软件包,以及是否能够连接至实例等事项。
我们目前已经完成测试,证实我们能够运行一个针对预先配置的OpenStack实例的playbook。我们将编写一个可自动配置实例的新playbook。我们还将使用Ansible 1.9中提供的nova_compute 模块。从Ansible 2.0开始,该模块被弃用,以支持具有更大提升的os_server模块。
下列play展示了nova_compute模块的基本用法。
在这个示例当中有两件事需要注意。首先且极为重要的是,Ansible play中的每个任务需要在主机上运行。在这个示例中,我们详细规定了任务应该针对localhost运行,这意味着虚拟实例应该使用本地机器上的Python客户端启动。在Ansible中,我们会将这作为local action。虽然nova_compute任务通常为本地操作,但是也可以不是本地操作。无论你使用哪台机器运行任务都需要安装Python Nova Client 库(红帽发行版中的python-novaclient )。
第二件需要注意的事情是,我们将关闭fact采集(gather_facts = False)。这虽然不是必须的,但是可以提高执行速度。另一个提高执行速度的办法是,在ansible主机文件中通过下列命令详细规定与localhost的连接为“local”:
在启动实例前,这将让Ansible不用尝试SSH到你的本地机器上。
任务本身非常简单,包括了我们启动实例时需要的所有变量。对它们进行编辑以与你的环境相匹配,并使用下列命令运行playbook。由于我们仅运行针对localhost的任务,因此我们不再需要通过“-i”指定主机清单文件:
假设你指定了正确的网络ID、镜像名称、键名等,你应该查看下列输出,并让名为webserver的实例在你的租户上运行。
正如我上面提到的,Ansible任务通常被设计成为幂等。nova_compute模块也必须要这么设计——多次运行这一playbook不会启动多个实例。另外,可以通过将 “state” 属性由 “present” 修改为 “absent” ,并重新运行 playbook 来停止 nova 实例。
现在我们已经能够通过一个play启动OpenStack中的实例。最后一个步骤是通过之前提到的play对其进行配置。首先,我们使用 add_host 模块把启动的实例添加到 Ansible inventory 中。add_host 模块可以动态的把主机添加到内存中的 inventory 中,这些主机是在前一个任务中启动的。有两个play的示例playbook可进行以下整合。
再次修改 nova_compute任务中的属性,以与你的环境相匹配。这些任务与我们在之前示例的任务相同。此外我们对任务的结果进行注册,以便我们能够将实例的浮动IP地址作为一个变量访问。在OpenStack上部署play中,第二个任务是我们动态地将主机添加至目录中,并将其加入至webservers群组中。
Playbook中的最后一个play与我们在该辅导之初提到的play相同。它们会在webservers 群组的系统中安装并启动apache,其中包括我们在OpenStack上配置的实例。以相同方式运行这一示例:
你会获得与下列相似的结果。
注意,现在在 play recap 中已经有两台主机了,启动实例的任务在 localhost 本地运行,配置 webserver 的任务在新启动的实例上运行。可以在浏览器中访问浮动 IP 来进行测试,你应该可以看到 Apaache HTTP Server 测试页面。
Ansible和OpenStack之间的简单交互可以被用作CI程序中复杂工作的起始点。理想的程序将具有以下优势:
Ansible还有许多针对负载均衡器等组件的模块。在通过自动化测试后,工作流能够按照变更“金丝雀部署“(Canary Deployments)的代码发布流程进行构建。关于Ansible和可用模块列表的更多信息请参见 http://docs.ansible.com中的Ansible文档。
编者注:本文编译自superuser.openstack.org,作者为红帽首席架构师Michael Solberg,编译者Frank Chan。