簡體   English   中英

使用 jinja2 創建 ansible 列表變量

[英]Create ansible list variable with jinja2

以下代碼位於角色的 defaults/main.yml 文件中:

  file_env: "{% if cf_env is equalto 'cf10_dev' %}\
  dev\
  {% elif cf_env is equalto 'cf10_stg' %}\
  stg\
  {% elif (cf_env is equalto 'cf10_prd') or (cf_env is equalto 'cf10_prd_ext') %}\
  prd\
  {% elif cf_env is equalto 'cf11' %}\
  [dev, prd]
  {% endif %}"

前 3 個條件語句工作正常,其中file_env var 設置為單個值,但是當嘗試將file_env var 設置為列表(最后一個 elif 語句)時,它不起作用:

failed: [server-new.xxx.com] (item=[dev, prd] ) => {"ansible_loop_var": "item", "changed": false, "item": "[dev, prd] ", "msg": "Destination /opt/coldfusion11/[dev, prd] 01/bin/jvm.config does not exist !", "rc": 257}

這是產生上述錯誤的任務:

- name: Update jvm.config for coldfusion11 server
  lineinfile:
    path: /opt/coldfusion11/{{ item }}01/bin/jvm.config
    regexp: '^java.home'
    line: 'java.home=/usr/lib/jvm/jre-openjdk'
  loop:
    - "{{ file_env }}"
  notify:
    - handler_create_script_list
    - handler_restart_coldfusion10
  when:
    - cf_env == "cf11"

如何將file_env var 設置為列表?

我相信你的問題是它將變量解釋為一個字符串,字面意思是'[dev, prd] ' (最后有一個空格,根據錯誤消息判斷)。

我認為您想嘗試https://serverfault.com/a/913936/512181中建議的不同格式

  1. 如果您要遍歷您的 var,則應始終返回一個列表(需要時帶有單個元素)以避免可能的棘手錯誤。 您只需將loop表達式修改為以下內容:

     loop: "{{ file_env }}"
  2. 您的模板表達式沒有使用空格控件,當它們不應該出現時,它們最終會在 output 中出現新行。

  3. 你的變量定義很難讀(這讓我覺得你有更深層次的項目架構問題,但那是另一回事了)。 考慮到上面的第 1 點,我建議您使用 dict 中的鍵/值映射並在最終 var 中獲取相應的值,重構為以下更具可讀性、可持續性和工作性的形式

    files_by_env cf10_dev: - dev cf10_stg: - stg cf10_prd: - prd cf10_prd_ext: - prd cf11: - dev - prd file_env: "{{ files_by_env[cf_env] }}"

    或者,您可以反轉 dict 中的定義(即每個文件的列表環境),這稍微不那么冗長,但會導致更復雜的表達式來獲得結果

    env_by_file: dev: - cf10_dev - cf11 stg: - cf10_stg prd: - cf10_prd - cf10_prd_ext - cf11 file_env: "{{ env_by_file | dict2items | selectattr('value', 'contains', cf_env) | map(attribute='key') | list }}"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM