1

背景

我正在尝试使用 Ansible (1.9.4) 角色,并试图掌握角色依赖关系。

我创建了以下角色:

  1. 安装 Oracle JDK (ansible-java8) 的角色
  2. 一个安装Tomcat的角色(ansible-tomcat7)

第二个角色将第一个角色定义为/ansible-tomcat7/meta/main.yml

dependencies:
  - { role: java8 }

我还包含了一个 requirements.yml 文件,其中包含以下内容:

- name: java8
  src: 'https://github.com/gregwhitaker/ansible-java8'

我已将以下配置添加到我的配置中,/etc/ansible/ansible.cfg以将我的角色路径配置到我的主目录中的某个位置:

roles_path  = ~/ansible/roles

然后我使用以下命令安装了ansible-java8角色:java8

ansible-galaxy install -r requirements.yml

运行命令后,我可以在 ~/ansible/roles 目录中看到 java8 角色。

但是,当我运行一个调用 tomcat7 角色的剧本时,只会执行该角色。java8 角色不会在 tomcat7 角色之前执行。

PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [default]

TASK: [Install Tomcat7 (Ubuntu)] **********************************************
changed: [default] => (item=tomcat7,libtcnative-1,libapr1)

TASK: [Install Tomcat7 (Debian)] **********************************************
skipping: [default]

TASK: [Install Tomcat7 (Amazon Linux)] ****************************************
skipping: [default]

PLAY RECAP ********************************************************************
default

问题

  1. 这是定义依赖角色的正确方法还是我完全错过了什么?
  2. 我是否认为因为我将 tomcat7 角色标记为依赖于 java8,所以我认为 java8 角色应该从角色路径中找到并首先运行?
  3. 我犯了什么错误导致 java8 角色无法在 tomcat7 角色之前运行?
4

1 回答 1

1

结果证明这是我如何测试角色的问题。

我告诉 Vagrant 使用以下 site.yml 文件配置我的测试框:

- hosts: all
  sudo: yes
  tasks: 
     - include: tasks/main.yml

这显然导致 Ansible 只运行 Tomcat 任务,而没有考虑到这实际上是一个角色,而不仅仅是一个包含一些任务的剧本。

我用于测试的 site.yml 剧本位于存储库的根目录,因此一旦我将其更改为引用存储库作为角色,一切都开始工作了。

- hosts: all
  sudo: yes
  roles:
    - { role: '../ansible-tomcat7' }
于 2015-12-31T23:10:53.803 回答