如何确保ansible playbook完全运行

时间:2015-08-31 07:12:53

标签: bash debian ansible ansible-playbook dpkg

我正在运行这个ansible playbook:

---
- hosts: localhost
  remote_user: root

  tasks:
   - name : update system
     apt : update_cache=yes    

   - name : install m4
     apt : name=m4 state=present

   - name : install build-essential
     apt : name=build-essential state=present 

   - name : install gcc
     apt : name=gcc state=present

   - name : install gfortran
     apt : name=gfortran state=present

   - name : install libssl-dev
     apt : name=libssl-dev state=present

   - name : install python-software-properties
     apt : name=python-software-properties state=present

   - name : add sage ppa repo
     apt_repository: repo='ppa:aims/sagemath'

   - name : update system
     apt : update_cache=yes

   - name : install dvipng
     apt : name=dvipng state=present

   - name : install sage binary
     apt : name=sagemath-upstream-binary state=present

   - name : invoke create_sagenb script
     command: /usr/bin/screen -d -m sudo /root/databases-and-datamining-iiith/python-scripts/create_sagenb -i -y

   - name : invoke start_sage script
     command: /usr/bin/screen -d -m sudo /root/databases-and-datamining-iiith/python-scripts/start_sage -i -y

这个剧本在任务“install build-essential”期间失败,并因错误要求运行dpkg --configure -a而停止。 如何通过运行命令

确保播放器在遇到此错误后再次运行
dpkg --configure -a

首先继续执行其他任务。

1 个答案:

答案 0 :(得分:4)

总的来说,Ansible是幂等的。这意味着您可以在解决问题后再次运行您的剧本而不会发生冲突。

这并非总是如此。如果你有一个更复杂的游戏和执行任务取决于另一个任务的结果,这可能很容易破坏,失败的任务然后会带你进入一个不容易用Ansible修复的状态。但是你所提供的任务并非如此。

如果您想加快速度并跳过所有未失败的任务和/或主机,您可以使用public class MessageSubscriptor:IMessageSubscriptorPool { Dictionary<Type, Action<dynamic>> Callbacks = new Dictionary<Type, Action<dynamic>>(); public void Subscribe<T>(Action<T> callback) where T :IMessage { Callbacks.Add(typeof(T), (obj) => callback(obj)); } } 和/或--limit

当剧本失败时,您可能会注意到Ansible会显示一条消息,其中包含一条命令,可让您将播放限制为失败的主机。因此,如果只有1个主机失败,则无需在所有主机上运行该手册:

--start-at-task

要从特定任务开始,您可以使用ansible-playbook ... --limit @/Users/your-username/name-of-playbook.retry 。因此,如果您的剧本在“安装构建必需”任务中失败,您可以在此任务中重新开始并跳过所有先前的任务:

--start-at-task

另外,apt模块已经过优化,可以处理循环。您可以通过将任务组合到一个单一的apt任务来加速您的游戏:

ansible-playbook ... --start-at-task="install build-essential"