Ansible playbook - 条件变量连接

Ansible playbook - 条件变量连接

我有一个工作任务,要迁移(复制)我的主目录的特定部分(倒数第二行是重要的):

- name: "Migrate my-pc module home files"
  copy:
    src: "{{ migration_source_path }}{{ item }}"
    dest: "{{ migration_destination_path }}{{ item }}"
  loop: "{{ migration_paths_my_pc }}"
  when:
    - not is_migrating_all
    - "'{{ migration_source_path }}{{ item }}' is exists"
    - m_my_pc | bool

两个..._path变量始终以正斜杠 ( /) 结尾。

解释:它从 获取文件路径列表migration_paths_my_pc并将它们从 复制migration_source_pathmigration_destination_path)。这只会在以下情况下发生:已设置该模块的标志(m_my_pc);并且路径在源中存在;而且我还没有从主目录迁移所有文件(is_migrating_all)。

我当前的工作解决方案(以上)给出了警告:

[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: '{{ migration_source_path }}{{ item }}' is exists

我明白我应该消除大括号 {{来自when:部分,因为条件有默示无论如何,我都无法用花括号括起来。问题是我不知道如何让它工作。许多不成功尝试如下:

    - vars["" + migrate_source_path + item] is exists
    - vars[migrate_source_path + item] is exists
    - vars[migrate_source_path ~ item] is exists
    - vars[migrate_source_path]vars[item] is exists
    - '' + migrate_source_path + item is exists
    - lookup('/home/k/test/test2/' + item) is exists
    - "{{ lookup('vars', 'migrate_source_path' + 'item') is exists }}"
    - "{{ lookup('vars', 'migrate_source_path') + lookup('vars', 'item') is exists }}"
    - lookup('vars', 'migrate_source_path')lookup('vars', 'item') is exists

背景:

我正在自动化个人电脑设置,出于实际原因,也为了了解有关 Ansible 和 Ansible-playbooks 的更多信息。

也欢迎任何其他建议或意见(我想是在评论中)。

更新:

我对迁移的设计目标(功能愿望)是:

  • 我想保持较低的维护成本,但如果需要的话,我希望知道哪些路径被复制了,哪些路径被跳过了。所以我认为脚本应该复制源中存在的路径,而不会在路径缺少源的情况下停止或抛出错误。警告或其他简单的消息会很好。我当前的脚本可以接受这一点。
  • 如果能够轻松切换哪些路径可以尝试复制哪些路径不尝试复制,那就太好了(例如,某些内容可能会因迁移而发生变化)。在 中执行此操作project/vars/似乎很直观,因此可能比在任务中切换更好。其他更可能被注释掉或更改的变量也是如此project/vars/。在大多数文本编辑器和 IDE 中,注释掉某些内容或取消注释某些内容是一个热键。非常方便。

答案1

您的尝试过于复杂。Jinja 分隔符不应在条件中使用,因为您已经处于被解释为 Jinja 表达式的某些内容中,因此只需将它们替换为提供所需结果的内容即可。

在这种情况下,您正在创建一个由两个变量连接而成的字符串,因此您应该将其替换为连接:

    - (migration_source_path ~ item) is exists

您在示例中使用了和,因此我任意选择了migrate_source_path一个作为正确的。migration_source_pathmigration_source_path

你与以下人关系很亲密:

    - '' + migration_source_path + item is exists

但是您有一个不必要的前导空字符串,YAML 解析器不会喜欢它,并且一旦您通过正确引用它或删除不必要的字符串来更正它:

    - "'' + migration_source_path + item is exists"
    - migration_source_path + item is exists

它会尝试添加migration_source_pathitem is exists,因为您没有用括号强制正确的顺序。

答案2

尝试稍微改写一下。不要使用 循环遍历数组,而是在或loop中指定要复制的目录。如果您确实想要一个要从一个目标复制到另一个目标的文件列表,则可以在 部分中写入列表。模块将测试源文件是否存在并显示错误,在这种情况下这是好事,否则您的迁移将存在缺陷。withwith_fileglobwith

请记住,我们用来when告诉 Ansible 何时运行或停止某个任务,而不是控制任务本身或其行为。为了实现这一点,我们使用处理程序、寄存器和其他资源。

此致。

相关内容