2017-02-27 88 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上。 –