【问题标题】:Ansible create directories for each environmentAnsible 为每个环境创建目录
【发布时间】:2015-06-19 06:47:08
【问题描述】:

使用下面的 ansible 代码 sn-p,我正在尝试根据 vars/main.yml 中存储的变量创建多个子目录。所以目标是每个环境的每个用户,我正在尝试创建多个子文件夹

最终,文件夹应该像这样创建

/home/testuser1/subdir1
/home/testuser1/subdir2
/home/testuser2/subdir3/subdir4
/home/testuser2/subdir5/subdir6
/home/testuser3/subdir7
/home/testuser3/subdir8
/home/testuser4 - testuser4 will not have any subfolders, so i assume ansible will not take any action

剧本文件:

---
- hosts: all
user: test
sudo: yes
vars_files:
- defaults/main.yml

tasks:

  - name: Create directories for each env
  file: path="{{ home }}/{{ item.0 }}{{ item.1.name }}/{{item.0.subdir}}" owner="{{ item.0 }}{{ item.1.name }}" group="{{ item.0 }}{{ item.1.name }}" mode=755 state=directory
  with_subelements:
  - "{{ env }}"
  - "{{ userdir }}"
  - "{{ subdirs }}"

vars/main.yml

env:
- test
- qa

userdir:
- name: user1
  subdir:
  - subdir1
  - subdir2
- name: user2
  subdirs:
  - subdir3/subdir4
  - subdir5/subdir6
- name: user3
  subdirs:
  - subdir7
  - subdir8
- name: user4
  subdirs:
  - []

但是,在执行剧本后,我遇到了一个奇怪的错误。我确信上面的代码有问题,但我不能再进一步了。感谢一些专家是否可以提供一些启示

TASK: [Create directories for each env]         ****************************
fatal: [localhost] => subelements lookup expects a list of two items, first a dict or a list, and second a string

FATAL: all hosts have already failed -- aborting

【问题讨论】:

    标签: ansible ansible-playbook


    【解决方案1】:

    正如错误消息所说,with_subelements 需要一个字符串,而不是第二个元素的 var。该字符串必须是第一个字典/列表的每个元素中的一个属性。但更大的问题是,不支持第 3 个元素。

    最好的方法可能是只循环用户及其目录并使环境静态,因为目前没有嵌套循环的解决方案:

    - name: Create directories for test env
      file: path="{{ home }}/test{{ item.0.name }}/{{item.1}}" owner="test{{ item.0.name }}" group="test{{ item.0.name }}" mode=755 state=directory
      with_subelements:
      - userdir
      - subdirs
    
    - name: Create directories for qa env
      file: path="{{ home }}/qa{{ item.0.name }}/{{item.1}}" owner="qa{{ item.0.name }}" group="qa{{ item.0.name }}" mode=755 state=directory
      with_subelements:
      - userdir
      - subdirs
    

    在 Ansible 2.0 中,通过使用 with_itemsinclude 语句,将(再次)可以有嵌套循环。然后你就可以做这样的事情了:

    - include: create_directories.yml env={{ item }}
      with_items: env
    

    而在文件create_directories.yml 中则只有一项任务:

    - name: Create directories for {{ env }} env
      file: path="{{ home }}/{{ env }}{{ item.0.name }}/{{item.1}}" owner="{{ env }}{{ item.0.name }}" group="{{ env }}{{ item.0.name }}" mode=755 state=directory
      with_subelements:
      - userdir
      - subdirs
    

    我不知道 Ansible 2.0 何时发布,但您可以直接从 github 尝试代码。他们有一个v2_final branch,但似乎devel branch 有更新的代码。

    【讨论】:

    • 谢谢乌冬丹。我会试一试,让你知道。然而这并不痛苦,因为我需要为近 15 个环境创建循环并且它可以增长.. 像你说的坚果,当 ansible2.0 发布时我可以重新访问
    • 感谢 udondan,它就像一个魅力。但是我最终为 20 个不同的环境创建了 20 个动作。我希望有一个更好的解决方案。我需要做更多的事情..
    • 这没什么大的改进,但您可以将 1 个任务放在一个单独的文件中,然后使用参数将其包含 20 次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多