Ansible中sed命令的$(<file) Shell展开失效问题求助
问题分析与解决
问题根源
你在Ansible中执行sed替换命令时,$(<replace_file)没有被Shell解析为文件内容,而是直接作为字符串写入目标文件。这是因为Ansible默认的command模块不支持Shell元字符(如命令替换$()、管道等),不会调用系统Shell去解析命令;而直接在Ubuntu终端执行时,命令会被Bash处理,$(<replace_file)会被正确展开为replace_file的内容。
解决方案
方案1:使用Shell模块执行命令
改用Ansible的shell模块,它会调用系统Shell解析命令,支持$()这类语法:
- name: 用sed替换foo为replace_file内容 shell: sed -i "s/foo/$(<replace_file)/g" some_file
方案2:给Command模块开启Shell解析
如果坚持使用command模块,可通过shell: true参数启用Shell解析:
- name: 用sed替换foo为replace_file内容 command: sed -i "s/foo/$(<replace_file)/g" some_file args: shell: true
方案3:使用Ansible原生Replace模块(推荐)
避免直接调用外部命令,用Ansible自带的replace模块实现,更符合Ansible最佳实践,也无需处理Shell转义问题:
- name: 用Ansible模块替换foo为replace_file内容 replace: path: some_file regexp: 'foo' replace: "{{ lookup('file', 'replace_file') }}"
内容的提问来源于stack exchange,提问作者Sir Blaze
相关产品推荐
相关产品推荐

