shell - 如何使用 Ansible 自动化一次性任务?

标签 shell path ansible

我正在使用 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/

相关文章:

error-handling - Ansible区 block : Re-raising errors in `rescue` block

ansible - var_prompt 可以包含在角色中吗?

linux - 从 Groovy 将 telnet 作为 shell 命令调用

linux - 列出按大小降序排列的所有目录

linux - 如何在 shell 脚本中只运行一次命令

android - 如何从 URI 获取完整的文件路径

svg - 如何重用不同维度的<defs>标签中定义的<marker>?

macos - OS X/Linux : pipe into two processes?

windows - 如何解决Powershell启动cmd路径错误?

ssh - Ansible ssh 授予权限被拒绝错误