如何在ansible剧本中循环变量

如何在ansible剧本中循环变量,ansible,Ansible,我有以下剧本,其中列出了安装在三台jenkins服务器上的插件列表: --- - hosts: all remote_user: user tasks: - name: Obtaining a list of Jenkins Plugins jenkins_script: script: 'println(Jenkins.instance.pluginManager.plugins)' url: 'http://serv

我有以下剧本,其中列出了安装在三台jenkins服务器上的插件列表:

---
- 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'
然而,这显然不是最有效的方法。我研究了ansible剧本中的循环和变量——但我似乎在兜圈子。以下是我到目前为止的情况:

- 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"}

我确信这是一个简单的错误,但是有人知道我错在哪里了吗?

如果你用一个变量开始你的值,比如
{{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/'

如果以变量(如
{{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/'

请更正示例中的缩进,并发布Ansible给您的错误消息,这应该会有帮助。@KonstantinSuvorov进行了更改,您应该有
语法错误
,其中未加引号的
{item}
。但是这个确切的消息是由错误的
和\u项引起的:
缩进–应该与模块名称处于同一级别。可能的重复请更正示例中的缩进,并发布Ansible给您的错误消息,这应该会有帮助。@KonstantinSuvorov进行了更改,您应该有
语法错误
,其中未加引号的
{{item}
。但是这个确切的消息是由错误的
和\u项引起的:
缩进–应该与模块名称处于同一级别。感谢您的帮助,这可能会重复,从而解决了问题。我升级了你的解决方案。我的主机文件有6个服务器,每个服务器都与一个URL对齐。但是,它看起来似乎正在运行每个服务器的每个URL,而不仅仅是与主机对齐的一个URL。这意味着它没有打印出6个插件列表,而是打印出36个。你知道这可能是什么原因吗。@Joe.hail你还不能用你的声誉水平来提升我的答案,但你可以用旁边的复选标记来接受它。如果您还有其他问题,请随时在Stack Overflow上发布。我发布了另一个问题-类似于此主题:感谢您的帮助,解决了问题。我升级了你的解决方案。我的主机文件有6个服务器,每个服务器都与一个URL对齐。但是,它看起来似乎正在运行每个服务器的每个URL,而不仅仅是与主机对齐的一个URL。这意味着它没有打印出6个插件列表,而是打印出36个。你知道这可能是什么原因吗。@Joe.hail你还不能用你的声誉水平来提升我的答案,但你可以用旁边的复选标记来接受它。如果您还有其他问题,请随时在Stack Overflow上发布。我发布了另一个问题-类似于此主题: