[英]Modify a YAML playbook in a Jenkins pipeline
我有一個 Delivery.yaml 被 Ansible 用來部署數據:
---
- name: Deploy to Filer on host
hosts: host
tasks:
- name: Copy files
copy: src={{ item.src }} dest={{ item.dest }} mode=0775
with_items:
- { src: 'data1.xml', dest: '' }
- { src: 'data2.so', dest: '' }
- { src: 'data3.exe', dest: '' }
- { src: 'data4.lib', dest: '' }
我需要根據數據擴展完成“dest”值:
xml files => target1
so files => target2
exe files => target3
lib files => target4
怎么寫? 我不使用 groovy 語言。 目前,我寫了這個,但它不起作用:
stage('YAML test'){
steps{
script{
yamlData = readYaml file: 'delivery.yaml'
yamlData.tasks.with_items.find{it.src.endsWith("xml")}.dest="target1"
writeYaml file: 'delivery_temp.yaml', data: yamlData
sh "cat delivery_temp.yaml"
}
}
}
我收到了這個錯誤:
hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: java.util.ArrayList.endsWith() is applicable for argument types: (java.lang.String) values: [xml]
這里的問題是,您最外層的數據類型已經是一個列表。 所以 Groovy 將使用隱式擴展運算符。 這里暗示的是:
yamlData*.tasks*.with_items.find{ it*.src.endWith ... }
所以你實際上想要對最外層的每個元素進行轉換:
yamlData.each{ it.tasks.each { task -> task.with_items.find{it.src.endsWith("xml")}.dest="target1" } }
這里的find
是否正確取決於數據(這只會找到第一個,如果沒有就會失敗)。 很可能您想要findAll
(這會導致所有結果的列表,並且.dest
分配由於隱式傳播運算符仍然有效)。
為了擺脫對所有四種類型(或有多少種)執行此操作的復制和粘貼代碼,最好將轉換提取為數據(例如,從后綴到目標的 map)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.