我有一个工作任务,要迁移(复制)我的主目录的特定部分(倒数第二行是重要的):
- 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_path
到migration_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_path
migration_source_path
你与以下人关系很亲密:
- '' + migration_source_path + item is exists
但是您有一个不必要的前导空字符串,YAML 解析器不会喜欢它,并且一旦您通过正确引用它或删除不必要的字符串来更正它:
- "'' + migration_source_path + item is exists"
- migration_source_path + item is exists
它会尝试添加migration_source_path
和item is exists
,因为您没有用括号强制正确的顺序。
答案2
尝试稍微改写一下。不要使用 循环遍历数组,而是在或loop
中指定要复制的目录。如果您确实想要一个要从一个目标复制到另一个目标的文件列表,则可以在 部分中写入列表。模块将测试源文件是否存在并显示错误,在这种情况下这是好事,否则您的迁移将存在缺陷。with
with_fileglob
with
请记住,我们用来when
告诉 Ansible 何时运行或停止某个任务,而不是控制任务本身或其行为。为了实现这一点,我们使用处理程序、寄存器和其他资源。
此致。