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

shw*_*tha 3 ansible ansible-playbook

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

[groupa]
10.0.1.20

[groupb]
10.0.1.21
Run Code Online (Sandbox Code Playgroud)

下面是我的main_file.yml文件

---
  - hosts: local
    connection: local
    gather_facts: no
    roles:
      - oracle
      - apache
Run Code Online (Sandbox Code Playgroud)

我的角色结构

main_file.yml
roles
|-- oracle
|   |-- tasks
|       |-- main.yml
|       |-- download_file.yml
|-- apache
|   |-- tasks
|       |-- main.yml
|       |-- download_file.yml
Run Code Online (Sandbox Code Playgroud)

ORACLE/main.yml

---
- name: downloading a file in groupa
  hosts: groupa
  tasks:
    - include: tasks/download_file.yml
Run Code Online (Sandbox Code Playgroud)

ORACLE/download_file.yml

---
- name: download file
  shell: wget http://dummyurl.com/random.sh
Run Code Online (Sandbox Code Playgroud)

Apache角色遵循相同的步骤,但对于"groupb".但是当我执行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
Run Code Online (Sandbox Code Playgroud)

Szt*_*upY 8

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

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

---
- name: downloading a file in groupa
  include: download_file.yml
Run Code Online (Sandbox Code Playgroud)

由于角色基本上是特定主机的模板,如果您希望它们在特定主机上运行,​​请相应地将它们包含在您的剧本中.例如,您main_file.yml可以编写以下内容:

---
- hosts: groupa
  roles:
    - oracle

- hosts: groupb
  roles:
    - apache

- hosts: local
  connection: local
  tasks:
    - { debug: { msg: "Tasks to run locally" } }
Run Code Online (Sandbox Code Playgroud)