【问题标题】:Ansible 1.6 include with_items deprecatedAnsible 1.6 包含 with_items 已弃用
【发布时间】:2014-07-08 06:59:21
【问题描述】:

所以看起来这个功能已被弃用,我真的不明白为什么,Ansible CTO 说我们应该使用 with_nested 但老实说我不知道​​该怎么做,

这是我的剧本:

- hosts: all
  user: root
  vars: 
   - sites:
     - site: site1.com
       repo: ssh://hg@bitbucket.org/orgname/reponame
       nginx_ssl: true;
       copy_init:
        - path1/file1.txt
        - path2/file2.php
        - path2/file3.php

     - site: site2.net
       repo: ssh://hg@bitbucket.org/orgname/reposite2

     - site: site4.com
       repo: ssh://hg@bitbucket.org/orgname/reposite3
       copy_init:
        - path2/file2.php

  tasks:
     - name: Bootstrap Sites
      include: bootstrap_site.yml site={{item}}

在 Ansible 1.6.6 中尝试执行此操作时的错误消息:

错误:[DEPRECATED]:include + with_items 是已移除的弃用功能。请更新您的剧本。

如何将此剧本转换为适用于此 ansible 版本的内容?

【问题讨论】:

  • 我错过了一些东西。 with_items 在哪里。 item 来自哪里?

标签: deprecated ansible ansible-playbook


【解决方案1】:

很遗憾,没有直接替代品。您可以做的一些事情:

  • 将列表传递给包含的文件并在那里迭代。在你的剧本中:

    vars:
        sites:
           - site1
           - site2
    tasks:
        - include: bootstrap_site.yml sites={{sites}}
    

    在 bootstrap_site.yml 中:

    - some_Task: ...
      with_items: sites
    
    - another_task: ...
      with_items: sites
    
    ...
    
  • 将 bootstrap_site 重写为 module(在 python、bash 等中),将其放在您的剧本旁边的 library 目录中。然后你可以这样做:

    - bootstrap_site: site={{item}}
      with_items: sites
    

更新: Ansible V2 已发布并带回了 include + with_items combo loop!

【讨论】:

  • 谢谢,实际上我已经尝试过使用您提出的第一个解决方案,但它太麻烦了,因为有些任务已经循环通过子项,并且嵌套循环过于复杂,我很乐意使用第二个解决方案尽管!看起来不错,但是..我不能在 ansible 本身中做到这一点吗?和..顺便说一句,任何关于为什么这已被弃用的见解?
  • 它已被弃用,因为supposedly 人们主要将它用于库存变量,并且出于实施原因,它们不能像那样使用。因此,为了避免混淆(为什么有些变量起作用而其他变量不起作用),他们只是删除了该功能。在您的情况下使用 with_nested 不实用吗?关于用 YAML 编写模块,恐怕不行。
  • 好的,谢谢,它非常令人沮丧,因为它似乎是一个非常简单的功能,考虑到你可以用 ansible 做的事情的数量,这看起来微不足道,但我想那是因为我不完全了解引擎盖下发生了什么。 with_nested 用于 3 或 4 级子数组要复杂得多,所以我最后选择了另一种解决方案,每个数组项执行 1 个包含任务,这不是最干净但有效...
  • 感谢您的更新。很高兴看到它回来了。删除这么多人使用的功能首先是一个大错误。
【解决方案2】:

我找到了一个答案来规避 blahblah-deprecated 消息...如原帖中所要求的那样。

我添加了一个文件 vars/filenames.yml:

  filenames:
  - file1
  - file2
  - file3

接下来我在剧本的开头阅读了这些名字:

  - name: read filenames
    include_vars: vars/filenames.yml

然后,我可以稍后使用它们:

  - name: Copy files 1
    copy: src=/filesrc1/{{ item }} dest=/filedest1/{{ item }} owner=me group=we
    with_items: filenames

等等……

问候, 汤姆

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    相关资源
    最近更新 更多