我的目的是在不同的主机中执行每个角色。我正在做一个简单的任务,在每个主机上下载文件。我有一个看起来像这样的主机文件
[groupa]
10.0.1.20
[groupb]
10.0.1.21
下面的是我的main_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
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
答案 0 :(得分:7)
在ansible中有两个级别,一个是playbook级别,另一个是任务级别。在playbook级别,您可以指定要在其上运行任务的主机,但在任务级别下,这已不再可能,因为已经指定了主机。角色包含在任务级别,因此您不能在其中包含主机声明。
您应该从main.yml中删除主机,并且只包含include:
---
- name: downloading a file in groupa
include: download_file.yml
由于角色基本上是特定主机的模板,如果您希望它们在特定主机上运行,请相应地将它们包含在您的Playbook中。例如,在main_file.yml
中,您可以编写以下内容:
---
- hosts: groupa
roles:
- oracle
- hosts: groupb
roles:
- apache
- hosts: local
connection: local
tasks:
- { debug: { msg: "Tasks to run locally" } }
答案 1 :(得分:0)
我不确定在不同于剧本中指定的主机上执行角色,但您可以在不同的主机上执行任务
一个例子。 该剧本指定在 app_servers 组主机上执行任务。 但是里面的任务是在db_servers组上执行的
- name: play 1
hosts: app_servers
tasks:
- name: task 1
mysql_db:
name: rails
state: present
delegate_to: db_servers