Ansible:如何从另一个playbook中调用一个playbook?

33
我已经写了一个简单的playbook来打印Java进程ID和该PID的其他信息。

我已经写了一个简单的playbook来打印Java进程ID和该PID的其他信息

[root@server thebigone]# cat check_java_pid.yaml
---
- hosts: all
  gather_facts: no

  tasks:
    - name: Check PID of existing Java process
      shell: "ps -ef | grep [j]ava"
      register: java_status

    - debug: var=java_status.stdout

当我使用ansible-playbook check_java_pid.yaml命令时,它可以正常工作。

现在,我正在尝试从另一个playbook中仅针对特定主机调用上述playbook。因此,我编写了以下第二个playbook:

    [root@server thebigone]# cat instance_restart.yaml
    ---
    - hosts: instance_1
      gather_facts: no

      tasks:
        - include: check_java_pid.yaml

然而,当我尝试执行ansible-playbook instance_restart.yaml时,我遇到了以下错误。

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

    The error appears to have been in 
    '/home/root/ansible/thebigone/check_java_pid.yaml': line 2, column 3, but 
    may be elsewhere in the file depending on the exact syntax problem.

    The offending line appears to be:

     ---
     - hosts: all
       ^ here


      The error appears to have been in 
      '/home/root/ansible/thebigone/check_java_pid.yaml': line 2, column 3, 
      but may be elsewhere in the file depending on the exact syntax problem.

     The offending line appears to be:

      ---
      - hosts: all
        ^ here

它显示语法错误,但据我所知并没有实际错误,因为我已经成功执行了 Playbook check_java_pid.yaml

请求您的帮助理解此问题。

2个回答

31

这里有官方文档中的示例。

https://docs.ansible.com/ansible/2.4/playbooks_reuse_includes.html

在应用批准的答案后,我遇到了与你相同的错误。我通过创建像这样的主要playbook解决了问题:

---
- import_playbook: master-okd.yml
- import_playbook: infra-okd.yml
- import_playbook: compute-okd.yml

这是一个很好的解决方法,但我想为每个导入覆盖一些变量。那可行吗? - Rino Bino

30
使用include在任务级别时,Ansible期望的是一个仅包含任务的文件,而不是完整的playbook。但是你提供了一个完整的playbook作为参数。
你可以在play级别上使用include,但它不能让你达到想要的效果。
定义了hosts: all的play将始终针对所有目标运行(除非在命令调用或清单中限制)。
此外,你将难以从其他playbook中访问java_status值(如果这是你的目标)。
你需要重新考虑你的结构,例如,你可以将任务从两个游戏中提取并包含它们。

my_tasks.yml

- name: Check PID of existing Java process
  shell: "ps -ef | grep [j]ava"
  register: java_status

  - debug: var=java_status.stdout

check_java_pid.yml

---
- hosts: all
  gather_facts: no

  tasks:
    - include my_tasks.yml

instance_restart.yml

---
- hosts: instance_1
  gather_facts: no

  tasks:
    - include: my_tasks.yml

谢谢再次查看。现在有意义了。一旦我尝试过,我会更新您。 - Raja G
工作正常,现在我明白了,再次感谢你。 - Raja G
这不是对OP的答案。 - Aurélio Antonio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接