【问题标题】:How to loop over variables in an ansible playbook如何在 ansible playbook 中循环变量
【发布时间】:2017-02-27 17:14:25
【问题描述】:

我有以下剧本,可以打印出安装在三个 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 playbooks 中的循环和变量——但我似乎在绕圈子。这是我目前所拥有的:

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

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

【问题讨论】:

标签: ansible


【解决方案1】:

如果您的值以{{ 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/'

【讨论】:

  • 感谢您的帮助,解决了问题。我赞成你的解决方案。
  • 我的主机文件有 6 个服务器 - 每个都与一个 URL 对齐。然而,看起来它正在运行每个服务器的每个 URL,而不仅仅是与主机对齐的一个 URL。这意味着它不是打印出 6 个插件列表,而是打印出 36 个。你知道是什么原因造成的吗?
  • @Joe.hail 你还不能用你的声望等级来支持我的答案,但是你可以通过旁边的复选标记来接受它。如果您还有其他问题,请随时在 Stack Overflow 上发布。
  • 我发布了另一个问题 - 类似于这个主题:stackoverflow.com/questions/42493579/…
猜你喜欢
  • 2015-06-20
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多