[英]File_exists vs suppressed include, which is the faster way to fail in PHP
[英]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 個任務:
check_file
變量,該變量將在第二個任務中讀取以執行操作。“包含”是一項任務,用於包含戲劇,角色或更多任務,而不是數據文件。 另外,任務必須單獨執行(-塊)。 如上所述,您需要使用“ vars_files”來包含帶有變量的文件,以供在播放中使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.