2017-08-01 64 views
0

我覺得這應該是非常直截了當的,但我一直在傾訴這些無用的文檔和其他答案,而且我被卡住了。循環作曲家需要完成任務

我想要做的是設置一個數組或作曲家包列表,用於使用作曲家對象在composer require語句中使用。

所以,我已經有了一個set fact像這樣來定義模塊:

- name: Define modules to be required 
    set_fact: 
    modules: 
     - vendor1/package1 
     - vendor2/package2 
     - vendorN/packageN 

我已經把這個在我ansible項目,所以它的方便和編輯的頂部(它會是甜想知道如何簡單地將yaml文件中的包定義爲變量,然後在劇本中使用set_fact,但我會堅持在這裏展示範圍)

考慮到這一點,我在項目中有一個角色與作曲家任務,我想要求每個這些:

- name: "Require packages" 
    composer: 
    command: require 
    arguments: {{ modules_to_be_required }} 
    working_dir: "{{ app['directory'] }}" 

本來,我這樣做是使用with_items像這樣:

- name: "Require packages" 
    composer: 
    command: require 
    arguments: "{{ item }}" 
    working_dir: "{{ app['directory'] }}" 
    with_items 
    - vendor1/package1 
    - vendor2/package2 
    - vendorN/packageN 

這並不工作;然而,它會導致composer update運行,每次迭代with_items需要很長時間。對我來說,將需要的軟件包列表轉換爲由空格分隔的字符串,然後將其作爲參數傳遞是更有意義的。

在我的研究,我發現,我可以列表轉換與join過濾字符串,所以我嘗試這樣做:

- name: "Require packages" 
    composer: 
    command: require 
    arguments: {{ modules | join(" ") }} 
    working_dir: "{{ app['directory'] }}" 

但是,這給了我一個YAML語法錯誤:

The offending line appears to be: 
command: require 
arguments: {{ modules | join(" ") }} 
      ^here 

我試過包裝"{{ modules | join(" ") }}",但我在大括號中的引號大吼大叫。

我以正確的方式接近這個想法,或者我需要問什麼問題才能得到答案?任何指導表示讚賞。

回答

1

您的加入過濾器可以使用單引號

arguments: "{{ modules | join(' ') }}" 

,或者你可以逃脫雙引號

arguments: "{{ modules | join(\" \") }}" 

,或者您可以使用單引號的變量和雙爲加入

arguments: '{{ modules | join(" ") }}' 
+0

這很好,謝謝你的詳細解釋 - 非常感謝。 –