Ansible 劇本 - 條件中的變數連接

Ansible 劇本 - 條件中的變數連接

我有一個工作任務是遷移(複製)我的主目錄的特定部分(倒數第二行是重要的一行):

- name: "Migrate my-pc module home files"
  copy:
    src: "{{ migration_source_path }}{{ item }}"
    dest: "{{ migration_destination_path }}{{ item }}"
  loop: "{{ migration_paths_my_pc }}"
  when:
    - not is_migrating_all
    - "'{{ migration_source_path }}{{ item }}' is exists"
    - m_my_pc | bool

這兩個..._path變數總是以正斜線 ( /) 結尾。

解釋:它獲取檔案路徑列表並將migration_paths_my_pc其複製migration_source_pathmigration_destination_path)。只有在以下情況下才會發生這種情況: 此模組的標誌已設定 ( m_my_pc);且路徑存在於源頭;而且我還沒有從 homedir 遷移所有檔案 ( is_migrating_all)。

我目前的工作解決方案(上面)給了我警告:

[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: '{{ migration_source_path }}{{ item }}' is exists

我明白我應該消除大括號 {{來自when:部分,因為條件有默示無論如何,它們周圍都有花括號。問題是我不知道如何讓它工作。許多中的一些不成功嘗試是:

    - vars["" + migrate_source_path + item] is exists
    - vars[migrate_source_path + item] is exists
    - vars[migrate_source_path ~ item] is exists
    - vars[migrate_source_path]vars[item] is exists
    - '' + migrate_source_path + item is exists
    - lookup('/home/k/test/test2/' + item) is exists
    - "{{ lookup('vars', 'migrate_source_path' + 'item') is exists }}"
    - "{{ lookup('vars', 'migrate_source_path') + lookup('vars', 'item') is exists }}"
    - lookup('vars', 'migrate_source_path')lookup('vars', 'item') is exists

背景:

出於實際原因,我正在自動化個人 PC 設置,並了解有關 Ansible 和 Ansible-playbooks 的更多資訊。

也歡迎任何其他建議或建議(我想在評論中)。

更新:

我的遷移設計目標(功能願望)是:

  • 我希望保持較低的維護成本,但如果需要,我希望獲得複製了哪些路徑以及跳過了哪些路徑的資訊。所以我認為腳本應該複製來源中存在的路徑,而不會在路徑丟失來源的情況下停止或拋出錯誤。警告或其他簡單的訊息就很好了。我當前的腳本可以接受這一點。
  • 如果能夠輕鬆切換哪些路徑進行複製嘗試,哪些路徑不進行複製嘗試(例如,與遷移相關的某些內容可能會發生變化),那就太好了。這樣做project/vars/似乎很直觀,因此可能是比在任務中切換它們更好的設計。其他更有可能被註解掉或更改的變數project/vars/也是如此。在大多數文字編輯器和 IDE 中,註解掉某些內容或取消註解某些內容是一個熱鍵。所以相當方便。

答案1

您的嘗試過於複雜。 Jinja 分隔符號不應在條件中使用,因為您已經處於被解釋為 Jinja 表達式的內容中,因此只需將它們替換為提供所需結果的內容即可。

在本例中,您要建立一個由兩個變數串聯而成的字串,因此您應該將其替換為串聯:

    - (migration_source_path ~ item) is exists

您在範例中同時使用了migrate_source_path和,因此我任意選擇了正確的。migration_source_pathmigration_source_path

您與以下人士關係密切:

    - '' + migration_source_path + item is exists

但是您有一個 YAML 解析器不喜歡的不必要的前導空字串,一旦您通過正確引用它或刪除不必要的字串來糾正它:

    - "'' + migration_source_path + item is exists"
    - migration_source_path + item is exists

它會嘗試新增migration_source_pathand item is exists,因為您沒有用括號強制執行正確的順序。

答案2

嘗試稍微不同地重寫它。不要使用 循環遍歷數組,而是在 a或loop中指定要複製的目錄。如果您確實想要一份要從一個目的地複製到另一個目的地的文件列表,您可以在該部分中寫入該列表。該模組將測試原始檔案是否存在並顯示錯誤,在這種情況下這是一件好事,否則您的遷移將會有缺陷。withwith_fileglobwith

請記住,我們用來when告訴 Ansible 何時執行或不執行某些任務,而不是控制任務本身或其行為。為了實現這一點,我們使用處理程序、暫存器和其他資源。

此致。

相關內容