2015-06-19 59 views
0

使用下面的代碼片段,我試圖根據存儲在vars/main.yml中的變量創建多個子目錄。Ansible爲每個環境創建目錄

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

瓦爾/主:所以我們的目標是爲每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 

劇本文件創建.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: 
    - [] 

但是,在執行劇本後,我得到了一條線nge錯誤。我相信上面的代碼中有什麼錯,但我無法進一步移動。不勝感激,如果一些專家可以拋出一些輕

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

隨着錯誤消息告訴,with_subelements需要一個字符串,而不是第二個元素的變種。該字符串必須是第一個字典/列表的每個元素中的一個屬性。但更有問題的是,第三個元素不被支持。

最好的可能將僅環比用戶和他們的目錄,使環境靜態的,因爲目前還沒有解決嵌套循環:

- 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_items以及include語句,可能會產生嵌套循環。然後,你就可以做這樣的事情:

- 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有更近代碼。

+0

謝謝udondan。我會試一試,讓你知道。然而,它是有點痛苦,因爲我需要創造幾乎15環境的循環,它可以成長..螺母像你說我可以重新訪問ansible2.0時發佈 – thunderbird

+0

感謝udondan,它的工作就像一個魅力..但是,我結束了爲20個不同的環境創建20個動作..我希望有更好的解決方案。我需要完成更多的工作。 – thunderbird

+0

這並沒有什麼大的改進,但是你可以在一個單獨的文件中有1個任務,然後用一個參數包含它20次。 – udondan