我有一个角色,必须创建一个目录列表。列表中最终的哪些目录取决于在运行时评估的几个条件。
当我使用file
模块时,如图所示,这非常慢。创建甚至检查每个目录的存在大约需要半秒钟,这在我遇到的场景中很容易总计几分钟。
流水线已启用。
- name: Create directories
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ dirs }}"
when:
- dirs is defined
有一个类似的问题被问到here,但是正如那里建议的那样使用synchronize
或unarchive
,对于事先不知道的目录来说似乎很尴尬,因为要同步的目录结构,首先必须在本地主机上创建。
是否有其他替代方案可以解决这个问题,我可能错过了?
编辑:我知道shell
和command
和mkdir -p
碰巧是幂等的。仍然我更喜欢一种方式,其中ansible管理目录的状态。
一个选项是使用“命令创建”构造。
- name: Create directories
command: mkdir -p "{{ item }}"
args:
creates: "{{ item }}"
loop: "{{ dirs }}"
幂等性,命令模块和“工具无政策”。
在对这个答案的评论中以及在问题中提到的thread中,都讨论了命令模块的幂等性,并且对ansible模块的本地幂等性进行了讨论。
“我知道shell和命令,mkdir -p恰好是幂等的。我仍然喜欢一种方式,其中ansible管理目录的状态。”
“你应该提到使用本机文件模块的这种松散的幂等特性。”
命令创建构造是幂等的。仅当项目不存在时才执行该命令。此外,在我看来,这种结构在类似情况下应该是首选,因为它完全符合所需要的,快速且易于理解。这符合可持续发展所必需的norms of minimalist, modular software development。