2015-03-19 77 views
1

我正在使用Ansible将一个框架(Git克隆,运行安装脚本)部署到服务器。安装步骤,用于运行install.sh这样的脚本:如何确定脚本是否以前使用Ansible运行?

- name: Install Foo Framework 
    shell: ./install.sh 
    args: 
    chdir: ~/foo 

如何确定我是否已执行在Ansible上次运行这一步呢?我想为此步骤添加一个when条件,该条件仅在install.sh脚本以前未运行时才会执行。

install.sh脚本会执行一些操作(替换用户主目录中的某些文件),但是脚本以前是否只是查看这些文件并不明显。 ~/foo.sh文件可能之前已存在,尚不清楚它是由安装脚本替换还是之前存在。

Ansible中有一种方法可以在服务器上存储一个值,让我确定此特定任务是否已被执行过?或者,我应该在用户的主目录中创建一个标记文件(例如~/foo-installed),以便稍后调用这本playbook?

+0

做了一些进一步的研究,它看起来像'touch'和'creates'选项的组合应该做的伎俩,类似于这里的答案︰http://stackoverflow.com/questions/26409164/ansible-ignore-运行一次配置任务 – nwinkler 2015-03-19 12:54:56

回答

3

下面是我最终解决问题的方法。指针使用creates选项帮助:

- name: Install Foo Framework 
    shell: ./install.sh && touch ~/foo_installed 
    args: 
    chdir: ~/foo 
    creates: ~/foo_installed 

使用这种方法,当安装脚本完成没有一个错误的~/foo_installed文件只创建。

2

我建议使用script模块来代替。该模块有一个creates参数:

一个文件名,当它已经存在时,这一步将不会运行。 (在Ansible 1.5中添加)

因此,您的脚本可以简单地touch一个文件,它会阻止在后续调用中执行脚本。

+0

“〜/ .ansible”文件夹是放置该标记文件的好位置吗?或者我应该避开这个? – nwinkler 2015-03-19 12:20:24

+0

也许这不是最好的想法,因为Ansible人可以随时决定擦掉它,在即将到来的更新Ansible 2.0。我更喜欢你控制的文件夹,比如你的home文件夹或者误用'/ var/log'('/ var/lock'听起来更适合这个,但是在重新启动时会被擦掉) – udondan 2015-03-19 12:32:34

+1

BTW:我刚刚注意到'shell'模块也有'created'参数:http://docs.ansible.com/shell_module.html – nwinkler 2015-03-19 12:53:52

相关问题