我正在运行这个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
首先继续执行其他任务。
答案 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"