我正在使用 Ansible 为我们的一些构建环境(例如,设置 PATH 和代理环境变量,安装全局 Node.js 工具等。这非常有效,并且可以轻松地在多个主机上自动执行常见的设置任务。所有任务都通过 Ansible 角色
进行拆分,以分离职责并提高可重用性。
现在我遇到了以下问题:安装了新软件包后,我需要更改 PATH
环境变量 - 它不再需要我之前作为 Ansible 设置的一部分添加的条目.
因此,我很自然地继续更新了 Ansible 任务,用于为新环境设置 PATH 变量,并删除了自定义条目(我使用 lineinfile
任务来创建 PATH 条目)。
lineinfile:
dest: ~/.profile
regexp: "^export {{ item.regexp }}"
line: "export {{ item.line }}"
create: yes
with_items:
- { regexp: 'PATH', line: 'PATH=:~/bin:~/node_modules/.bin:$PATH' }
我从该项目的上述 line
部分中删除了一项。如您所见,lineinfile
任务仅检查条目 export PATH
是否存在于文件中,如果不存在,则会使用 export 创建它PATH=:~/bin:~/node_modules/.bin:$PATH
.
现在我的问题是:由于 lineinfile 任务仅验证条目是否存在,但不检查完整值,因此我需要确保更新所有现有环境。我该怎么办?
有没有办法使 lineinfile
语句足够智能来验证该行的内容,即确保存在我想要的确切行(同时避免重复PATH
条目)?还是这太复杂了?
我想到(最终做到了)的另一件事是创建一个一次性的 playbook,在所有环境中更新 PATH
变量:
lineinfile:
dest: ~/.profile
backrefs: yes
regexp: "^export PATH=(.*)/opt/foo/bar/baz/bin[\\:]*(.*)"
line: "export PATH=\\1\\2"
这是一种常见的场景 - 为一次性任务创建剧本吗?好处是该剧本可以在所有主机上运行并避免手动工作。除此之外的可重用性很小,因为我只希望这样做一次。
这是解决此问题的正确方法吗?还是有更好、更智能的方法来完成此类任务?
最佳答案
您使用的是哪个版本的 Ansible?由于您所描述的内容看起来像是一个错误,因为 lineinfile
模块应该检测到该行已更改并更新它。我刚刚复制粘贴了您的第一个任务(只是更改了文件的路径),一切正常。
这是第一次运行:
➜ ~ % ansible-playbook test.yml
PLAY [all] ********************************************************************
TASK: [lineinfile ] ***********************************************************
changed: [localhost] => (item={'regexp': 'PATH', 'line': 'PATH=:~/bin:~/node_modules/.bin:$PATH'})
PLAY RECAP ********************************************************************
localhost : ok=1 changed=1 unreachable=0 failed=0
然后我从路径中删除了 ~/bin
并再次运行整个过程:
➜ ~ % ansible-playbook test.yml
PLAY [all] ********************************************************************
TASK: [lineinfile ] ***********************************************************
changed: [localhost] => (item={'regexp': 'PATH', 'line': 'PATH=:~/node_modules/.bin:$PATH'})
PLAY RECAP ********************************************************************
localhost : ok=1 changed=1 unreachable=0 failed=0
正如您所看到的,模块检测到我更改了变量并更新了文件。所以一切都按其应有的方式进行。
关于shell - 如何使用 Ansible 自动化一次性任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29912130/