如何在Ansible中创建一个idempontent shell

Rob*_*ert 4 ansible ansible-playbook

我正在使用Ansible,我试图使幂等幂执行shell时遇到一些问题.我做的第一个是安装python-apt包,因为我需要它来使用apt模块来安装其他包.但每次我运行我的playbook时,shell任务总是运行,我想让它成为幂等的.这是我的shell任务:

- name: install pyton-apt
  shell: apt-get install -y python-apt
Run Code Online (Sandbox Code Playgroud)

这是输出,始终运行上述任务:

$ ansible-playbook -i hosts site.yml 

PLAY [docker] ***************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [10.0.3.240]

TASK: [docker | install pyton-apt] ******************************************** 
changed: [10.0.3.240]

TASK: [docker | install unzip] ************************************************ 
ok: [10.0.3.240]

PLAY RECAP ******************************************************************** 
10.0.3.240                 : ok=3    changed=1    unreachable=0    failed=0 
Run Code Online (Sandbox Code Playgroud)

Woo*_*ham 11

您应该使用ansible apt模块进行安装python-apt,这将是开箱即用的幂等:http://docs.ansible.com/apt_module.html

例如

- name: install python-apt
  apt: name=python-apt state=present
Run Code Online (Sandbox Code Playgroud)

(注意使用apt模块应该自动安装python-apt在远程主机上,所以我不确定为什么你需要手动安装它,请参阅https://github.com/ansible/ansible/issues/4079)

编辑:如果由于某种原因你不能使用内置apt模块安装python apt,shell模块提供creates参数来帮助使其成为幂等的.

- name: install python-apt
  shell: apt-get install -y python-apt >> /home/x/output.log creates=/home/x/output.log
Run Code Online (Sandbox Code Playgroud)

这意味着shell模块如果/home/x/output.log已经存在则不会运行.