簡體   English   中英

ansible include_if_exists

[英]ansible include_if_exists

如果文件存在,我正在尋找一種有條件地將文件包含在 Ansible 播放中的方法。 不幸的是,如果文件不存在,使用“include”會引發致命錯誤。 我正在遍歷一堆包並安裝它們,我想檢查每個包的可選配置文件。 請參閱下面的簡化示例:

---
- name: Basic setup of an Ubuntu box
  hosts: all
  vars:
    packages:
      - ack-grep
      - vim
      - zsh
      - htop
      - openssh-server
      - cowsay
  tasks:
    - name: Run package configuration
      action: apt name=$item
      include: "packages/${item}.yml"
      with_items: $packages

一旦腳本嘗試包含不存在的文件,它就會停止並顯示錯誤。 我確定我只是想以錯誤的方式做某事,但我已經在這工作了幾個小時並嘗試了我能想到的一切,但沒有結果。

您不應該這樣做,如https://github.com/ansible/ansible/issues/2726所述。請特別看一下此評論:

是的,include + with_items不是人們應該使用的東西。

我們不應該記錄它。

雖然我知道您的變量中現在已經具有特定的結構,但最好在任務中使用with_items。

它不適用於庫存變量,因此這就是為什么要在任務/角色中放入循環的原因。

Ansible 1.5甚至不支持它。 如果嘗試運行它,將出現以下錯誤:

錯誤:[不推薦使用]:include + with_items是已刪除的不推薦使用的功能。 請更新您的劇本。 Ansible無法成功完成。 任何錯誤輸出都應該在上面可見。 請更正這些錯誤,然后重試。

最好的使用方法包括在劇本上使用其他變量和任務,即使用角色。 看看http://docs.ansible.com/playbooks_roles.html#task-include-files-and-encouraging-reuse

我個人使用

- include: ...
  when: condition

因此,您可以基於某個變量是true還是false或set等來調整包含。甚至可以在清單文件中設置這些var。

我使用的是 Ansible 版本 2.9.20

---
- name: Basic setup of an Ubuntu box
  hosts: all
  vars:
    packages:
      - ack-grep
      - vim
      - zsh
      - htop
      - openssh-server
      - cowsay
  tasks:
    - name: check if file exists
      local_action: stat path=packages/{{ item }}.yml
      with_items: "{{ packages }}"
      register: check_file

    - name: Run package configuration
      action: apt name={{ item.item }}
      with_items: "{{ check_file.results }}"
      when: item.stat.exists

在這里,我在一本劇本中創建了 2 個任務:

  • 任務 1 將檢查文件是否存在,並將輸出提供給check_file變量,該變量將在第二個任務中讀取以執行操作。
  • 任務 2 將根據文件狀態執行操作,即,如果文件存在,則執行該操作,否則不執行。

“包含”是一項任務,用於包含戲劇,角色或更多任務,而不是數據文件。 另外,任務必須單獨執行(-塊)。 如上所述,您需要使用“ vars_files”來包含帶有變量的文件,以供在播放中使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM