Display

Ansible:從任務執行新劇本

  • April 21, 2022

假設如下:

主要劇本.yml

- name: Play-1
 hosts: localhost
 connection: local
 gather_facts: no
 roles:
   - role: my-role
     vars:
       newhost: 192.168.1.1

生成的劇本.yml

- name: Play-1
 hosts: newhost
 gather_facts: yes
 
 tasks:
 - name: Task1
 - name: Task2
 - name: Task3

角色的主要任務:

- name: "Role MAIN-1"
 add_host:
   name: newhost
   ansible_host: "{{newhost}}"

- include: generated_playbook.yml

錯誤:


ERROR! conflicting action statements: hosts, tasks

The error appears to be in 'generated_playbook.yml': line 1, column 3, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

- name: Generated Playbook
 ^ here

我創建了新角色並將此角色包含在主要劇本中。

在這個角色中,我將新主機添加到記憶體清單中,然後,我使用 j2 模板範例輸出生成了新的劇本 generate_playbook.yml

問題:

有沒有辦法只在新添加的主機上執行這個新生成的劇本而不向主劇本添加任何其他內容?

我試圖使用 import-playbook 或包含在角色中,但這失敗了

這是不可能的。引用ansible.builtin.import_playbook

帶有播放列表的文件只能包含在頂層。

範例明確顯示了這一點

- name: This DOES NOT WORK
 hosts: all
 tasks:
   - debug:
       msg: task1

   - name: This fails because I'm inside a play already
     import_playbook: stuff.yaml

筆記

  • 沒有include_playbook。查看可用的include_**和import_**模組。
shell> ansible-doc -t module -l | grep include_

include_role    Load and ...  
include_tasks   Dynamically inclu...
include_vars    Load variables from files, dynamically...
shell> ansible-doc -t module -l | grep import_

import_playbook Imp...        
import_role     Import a ro...
import_tasks    Impo...
  • 引用 import_module 的註釋

這是 Ansible 的核心特性,而不是模組,不能像模組一樣被覆蓋。

引用自:https://unix.stackexchange.com/questions/699828