我使用Ansible为我们的一些构建环境(例如,设置PATH
和代理环境变量,安装全局Node.js工具等。这很好,而且很容易在多个主机上自动执行常见的设置任务。所有的任务都被分成Ansible roles
以分离责任和额外的可重用性。如何使用Ansible自动执行一次性任务?
现在我遇到了以下情况:安装新软件包后,我需要更改PATH
环境变量 - 它不再需要我以前作为Ansible安装程序的一部分添加的条目。
因此,自然我继续并更新了用于为新环境设置PATH变量的Ansible任务,并删除了自定义条目(我使用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
项)?或者这太复杂了?
我想到了(终于做)的另一件事情是创建一个一次性的剧本,更新在所有环境中的PATH
变量:
lineinfile:
dest: ~/.profile
backrefs: yes
regexp: "^export PATH=(.*)/opt/foo/bar/baz/bin[\\:]*(.*)"
line: "export PATH=\\1\\2"
这是一个常见的场景 - 为单创建剧本关闭任务?好处是,剧本可以在所有主机上运行并避免手动工作。除此之外,可重用性很小,因为我只希望这样做一次。
这是正确的方式去解决这个问题,还是有更好,更聪明的方式来完成这样的任务?
谢谢!我是个白痴 - 不知道我做错了什么。你是对的,它按预期工作。我回顾了我的真实代码(上面是一个例子),做了一些修改,并开始工作。 – nwinkler