Ansible为每个环境创建目录

时间:2015-06-19 06:47:08

标签: ansible ansible-playbook

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

最终,文件夹应该像

一样创建
/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

Playbook文件:

---
- 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 }}"

乏/ 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

1 个答案:

答案 0 :(得分:1)

正如错误消息所示,with_subelements需要一个字符串,而不是第二个元素的var。该字符串必须是第一个dict / list的每个元素中的属性。但更有问题的是,不支持第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似乎有更新的代码。