Ansible在不同的主机中执行每个角色

Ansible在不同的主机中执行每个角色,ansible,ansible-playbook,Ansible,Ansible Playbook,我的意图是在不同的主机中执行每个角色。我正在做一个简单的任务,在每个主机上下载文件。我有一个主机文件,看起来是这样的 [groupa] 10.0.1.20 [groupb] 10.0.1.21 下面是我的主_file.yml文件 --- - hosts: local connection: local gather_facts: no roles: - oracle - apache 我的角色结构 main_file.yml roles

我的意图是在不同的主机中执行每个角色。我正在做一个简单的任务,在每个主机上下载文件。我有一个主机文件,看起来是这样的

[groupa]
10.0.1.20

[groupb]
10.0.1.21
下面是我的主_file.yml文件

---
  - hosts: local
    connection: local
    gather_facts: no
    roles:
      - oracle
      - apache
我的角色结构

main_file.yml
roles
|-- oracle
|   |-- tasks
|       |-- main.yml
|       |-- download_file.yml
|-- apache
|   |-- tasks
|       |-- main.yml
|       |-- download_file.yml
oracle/main.yml

---
- name: downloading a file in groupa
  hosts: groupa
  tasks:
    - include: tasks/download_file.yml
oracle/download_file.yml

---
- name: download file
  shell: wget http://dummyurl.com/random.sh
除了“groupb”之外,Apache角色遵循相同的步骤。但是当我执行main_file.yml时,我得到以下错误

ERROR! no action detected in task. This often indicates a misspelled module name, or incorrect module path.

The error appears to have been in '/etc/ansible/roles/oracle/tasks/main.yml': line 2, column 3, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

---
- name: downloading a file
  ^ here

ansible中有两个级别,一个是剧本级别,另一个是任务级别。在playbook级别上,您可以指定要在哪些主机上运行任务,但在tasks级别下,这将不再可能,因为已经指定了主机。角色包含在任务级别,因此其中不能包含主机声明

您应该从main.yml中删除主机,并且只包含:

---
- name: downloading a file in groupa
  include: download_file.yml
由于角色基本上是特定主机的模板,如果您希望它们在特定主机上运行,只需将它们相应地包含在您的剧本中即可。例如,在
main_文件.yml
中,您可以编写以下内容:

---
- hosts: groupa
  roles:
    - oracle

- hosts: groupb
  roles:
    - apache

- hosts: local
  connection: local
  tasks:
    - { debug: { msg: "Tasks to run locally" } }

我不确定在不同于剧本中指定的主机上执行角色,但您可以在不同的主机上执行任务

举个例子。 playbook指定在app_服务器组主机上执行任务。 但是,内部任务在db_servers组上执行



main.yml没有如图所示的调试语句。你能把全部内容都包括进去吗?即使我只是在oracle/main.yml中执行调试任务而没有添加任何主机,我也会遇到同样的错误。谢谢你,这很有效。但是我希望每个角色在不同的主机上运行,这是可能的吗?@使用这个ANTILE的SZTPY将把前两个主机部分看作是重复的,只使用最后定义的值。
- name: play 1
  hosts: app_servers

  tasks:
     - name: task 1
       mysql_db:
          name:  rails
          state: present
       delegate_to: db_servers