尝试在 AnsibleWorks Galaxy 上注册角色

由于我对投稿内容一筹莫展,恰好 AnsibleWorks Galaxy 正式发布了β版本,所以我决定趁机尝试使用它。

AnsibleWorks Galaxy 是什么?

当您尝试访问AnsibleWorks Galaxy(以下简称为Galaxy)时,

“寻找、重用和分享最佳 Ansible 内容的中心。”

据报道,简单来说,这似乎是用作Ansible处理单元的角色共享服务。以前,我们时不时会看到这个需求,现在似乎终于满足了。

然而,当你实际地在日常生活中写角色时,你会感觉到,写得通用到可以与不特定多数人共享是相当困难的,所以我觉得不如将其作为一个展示窗口,大家轻松地登记,就像大家一起分享一样。

准备使用Galaxy

由于Ansible本身进行了升级并添加了一个名为ansible-galaxy的CLI工具,所以无论如何我们都需要进行更新。我是通过pip来安装Ansible的,所以

$ sudo pip install -U ansible

我已更新至最新版本。

说明一下,要在Galaxy上注册,需要在GitHub上拥有与角色单独相关的存储库。因此,我在此次注册的角色中,切出了一个设置fluentd(或td-agent)的角色,这个角色在实际使用中可能并不完全通用。请原谅角色实现中存在的一些缺陷。

就我个人而言,我希望Ansible作为一款使用Python开发的产品能够支持Bitbucket。还有,如果README也能使用rst格式就好了。

创建角色

既然准备好了,我们现在来创建一个可以实际在Galaxy上注册的角色。根据这里的信息,看起来可以使用一个叫做”ansible-galaxy init”的CLI来生成脚手架,我们试试看吧。它会在指定的目录下(默认为”.”)创建一个以参数名命名的目录。

在文档中似乎解释了需要先从 Git 克隆已创建的存储库,然后进入该存储库的目录并执行 ansible-galaxy init 命令。但是这样会导致目录中创建了两个重复的文件夹,所以我对这个问题在文档中是否是错误并不确定。相反,我更倾向于直接在已克隆的存储库目录中执行 ansible-galaxy init 命令,这样就可以避免重复创建文件夹的问题。

$ git clone https://github.com/xica/ansible-role-td-agent.git
$ ansible-galaxy init ansible-role-td-agent
The directory %s already exists.

You can use --force to re-initialize this directory,
however it will reset any main.yml files that may have
been modified there already.

如果尝试在已经存在的目录上执行,会受到警告。已经立即提交了拉取请求以解决错误消息。

我对ansible-galaxy init所做的工作很感兴趣,所以我尝试用一个随便起的名字试了一下。结果发现它会在role目录下创建一个空的yml文件,并为我生成meta/main.yml的模板。

$ ansible-galaxy init galaxy-init-test
galaxy-init-test was created successfully
$ ls galaxy-init-test
defaults files handlers meta tasks templates vars

查看meta/main.yml文件,其中包含了必要信息的模板,用于在Galaxy上注册。您可以填写或取消注释来修改为合适的内容。不过,在末尾的”dependencies”中却写着这样不祥的事情。

dependencies:
  # List your role dependencies here, one per line. Only
  # dependencies available via galaxy should be listed here.

为何不吉呢?因为在ansible-role-td-agent中,为了根据操作系统进行分支处理,已经写了以下这样的依赖项。

dependencies:
  - { role: succhiello.td_agent/RedHat, when: "ansible_os_family == 'RedHat'" }
  - { role: succhiello.td_agent/Ubuntu, when: "ansible_distribution == 'Ubuntu' and ansible_distribution_release in ['lucid', 'precise', 'raring']" }

暂且放一放,无论如何我会先试着继续前进。

除了将meta/main.yml修改为适用于Galaxy的格式外,创建role的步骤应该与平常一样,没有问题。由于本次已经创建了role的内容,所以我将尝试将其推送并注册到仓库中。先暂时忽略README文件。

顺便提一下,我认为大部分Ansible用户都会实现类似于自己的ansible-galaxy init的功能的实用工具。我也尝试实现了一个用于创建角色的yeoman generator,但在这次更新中完全变得毫无用处。

角色的注册

在冒頭所提到的Galaxy网站上进行角色注册。虽然需要用户注册,但我已经通过GitHub连接完成了。注册并登录后,从头部菜单栏的”添加角色”选项开始输入信息。

因为我想要确保存储库名称明确表示为Ansible角色,所以我尝试了一种明确设置存储库名称而不是默认行为将其用作注册名称的方法。正如依赖项中已经指定的那样,我输入了希望它以succhiello.td_agent的名称进行注册。

galaxyAddRole.png

最终,无事失败了……就Galaxy的介绍而言,能提供错误案例倒也是好事,我就将其视为“功德圆满”。

galaxyFailed.png

看到错误消息,似乎在meta/main.yml中存在错误。可以看出在读取时进行了一定的验证。出现错误意味着在提取原本正常运行的角色内容时,顺便进行了一些修改但没有进行测试就尝试进行注册,这一点显而易见。但不论如何,如果查看meta/main.yml的开头部分,可以看到

---
galaxy_info:
  author: "EBIHARA Satoshi"
  description: 
  company: xica
  license: BSD
  min_ansible_version: 1.4

暂时空着描述然后偷懒似乎不太好。就在输出模板时,请确保没有不正当的地方,可能希望设置””以保证这一点。

我删除了描述本身,并修正了其他一些无关紧要的错误后,将其推送并重新导入了之前的”My Roles”。在我的环境中,”导入状态”一直没有变化为”运行中”,但是刷新后成功地转变为”正常”。

角色的安装

我将尝试安装已注册的角色是否能够成功。首先,请准备以下环境。请根据需要适当更改inventories/hosts文件的内容。

$ tree
.
├── inventories
│   └── hosts
├── roles
└── site.yml
- hosts: test_hosts
  connection: ssh
  sudo: yes
  roles:
    - succhiello.td_agent
[test_hosts]
# ********************

尽管我对先前提到的依赖问题有些担忧,但我会先简单地尝试执行ansible-galaxy install命令。因为没有”–roles-path”选项,它将会根据ansible.cfg的设置路径或者安装到/etc/ansible/roles目录中,所以我会明确指定路径进行安装。

$ ansible-galaxy install --roles-path ./roles succhiello.td_agent
no version specified, installing master
 - downloading role from https://github.com/xica/ansible-role-td-agent/archive/master.tar.gz
 - extracting succhiello.td_agent to roles/succhiello.td_agent
succhiello.td_agent was installed successfully

看起來安裝順利無誤。查看roles以下,確實有succhiello.td_agent存在。對於查看dependencies,擔心會出現類似”succhiello.td_agent / 沒有註冊為RedHat等角色”的錯誤,但看來是杞人擔憂了。

我研究了一下ansible-galaxy,也查看了从Galaxy的web API获取的角色的元数据,但发现依赖是空的。可能是因为在查看meta/main.yml的描述时,会跳过一些不适合的内容(如{ role:**, when: ** }之类的)。

我尝试在我的DigitalOcean环境中实际运行ansible-playbook。

$ ansible-playbook -K -i inventories/hosts site.yml

虽然不具体说明工作量,但是运行无问题!

尽管我本来还想尝试对角色进行版本控制等操作,但是由于内容已经相当冗长了,而且现在已经是20号,并且已经进入了关键时期,所以我想就到这里为止了。我希望能够好好编写README,并且由于角色本身还有一些通用性,所以我之后想进行更新。

各位如果你们实现了其他用户可能会觉得有用或参考的角色,请务必尝试在Galaxy上注册一下!

广告
将在 10 秒后关闭
bannerAds