2017-02-27 86 views
1

我有以下的劇本打印出已安裝在三個詹金斯服務器的插件列表:如何循環變量在ansible劇本

--- 
- hosts: all 
    remote_user: user 
    tasks: 
     - name: Obtaining a list of Jenkins Plugins 
     jenkins_script: 
      script: 'println(Jenkins.instance.pluginManager.plugins)' 
      url: 'http://server1.usa.com:8080/' 
      user: 'admin' 
      password: 'password' 

     - name: Obtaining a list of Jenkins Plugins 
     jenkins_script: 
      script: 'println(Jenkins.instance.pluginManager.plugins)' 
      url: 'http://server2.usa.com:8080/' 
      user: 'admin' 
      password: 'password' 

     - name: Obtaining a list of Jenkins Plugins 
     jenkins_script: 
      script: 'println(Jenkins.instance.pluginManager.plugins)' 
      url: 'http://server3.usa.com:8080/' 
      user: 'admin' 
      password: 'password' 

但是,這顯然不是最有效的方法去做這個。我研究了可靠的劇本中的循環和變量 - 但我似乎在圈圈。以下是我迄今爲止:

- name: Obtaining a list of Jenkins Plugins 
    jenkins_script: 
    script: 'println(Jenkins.instance.pluginManager.plugins)' 
    url: {{ item }} 
    with_items: 
     - 'http://server1.usa.com:8080/' 
     - 'http://server2.usa.com:8080/' 
     - 'http://server3.usa.com:8080/' 
    user: 'admin' 
    password: 'password' 

以下是錯誤消息:

fatal: [server]: FAILED! => {"failed": true, "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'item' is undefined\n\nThe error appears to have been in '/home/user/varspb.yml': line 5, column 9, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n tasks:\n  - name: Obtaining a list of Jenkins Plugins\n  ^here\n"} 

我敢肯定,這是一個簡單的錯誤,但沒有人看到我錯了?

+0

請更正您的示例中的縮進併發布Ansible給出的錯誤消息,這應該是有幫助的。 –

+0

@KonstantinSuvorov進行了更改 –

+0

奇怪的是,您應該通過未加引號的'{{item}}''語法錯誤''。但是,這個確切的消息是由錯誤的'with_items:'indentation引起的 - 應該與模塊名稱在同一級別。 –

回答

0

如果您使用變量(如{{ item }})開始您的值,則需要引用它以插入變量"{{ item }}"。此外,你在yaml和任務塊中有各種格式問題。我設法解決您的任務:

- name: Obtaining a list of Jenkins Plugins 
    jenkins_script: 
    script: 'println(Jenkins.instance.pluginManager.plugins)' 
    url: "{{ item }}" 
    user: 'admin' 
    password: 'password' 
    with_items: 
    - 'http://server1.usa.com:8080/' 
    - 'http://server2.usa.com:8080/' 
    - 'http://server3.usa.com:8080/' 
+0

感謝您的幫助,解決了這個問題。我提高了你的解決方案。 –

+0

我的主機文件有6個服務器 - 每個服務器都對應一個URL。但是,它看起來像是貫穿每個服務器的每個URL,而不僅僅是與主機對齊的一個URL。這意味着不是打印出6個插件列表,而是打印出36個。你知道這可能是什麼原因造成的。 –

+0

@ Joe.hail你不能用你的聲望等級來提高我的回答,但你可以用旁邊的複選標記來接受它。如果您有其他問題,請隨時將其發佈到Stack Overflow上。 –