Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

# (c) 2012-2014, Michael DeHaan <michael.dehaan@gmail.com> 

# (c) 2017 Ansible Project 

# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) 

 

from __future__ import (absolute_import, division, print_function) 

__metaclass__ = type 

 

DOCUMENTATION = ''' 

callback: default 

type: stdout 

short_description: default Ansible screen output 

version_added: historical 

description: 

- This is the default output callback for ansible-playbook. 

extends_documentation_fragment: 

- default_callback 

requirements: 

- set as stdout in configuration 

''' 

 

from ansible import constants as C 

from ansible.playbook.task_include import TaskInclude 

from ansible.plugins.callback import CallbackBase 

from ansible.utils.color import colorize, hostcolor 

 

 

class CallbackModule(CallbackBase): 

 

''' 

This is the default callback interface, which simply prints messages 

to stdout when new callback events are received. 

''' 

 

CALLBACK_VERSION = 2.0 

CALLBACK_TYPE = 'stdout' 

CALLBACK_NAME = 'default' 

 

def __init__(self): 

 

self._play = None 

self._last_task_banner = None 

super(CallbackModule, self).__init__() 

 

def v2_runner_on_failed(self, result, ignore_errors=False): 

 

delegated_vars = result._result.get('_ansible_delegated_vars', None) 

self._clean_results(result._result, result._task.action) 

 

49 ↛ 50line 49 didn't jump to line 50, because the condition on line 49 was never true if self._play.strategy == 'free' and self._last_task_banner != result._task._uuid: 

self._print_task_banner(result._task) 

 

self._handle_exception(result._result) 

self._handle_warnings(result._result) 

 

55 ↛ 56line 55 didn't jump to line 56, because the condition on line 55 was never true if result._task.loop and 'results' in result._result: 

self._process_items(result) 

 

else: 

59 ↛ 60line 59 didn't jump to line 60, because the condition on line 59 was never true if delegated_vars: 

self._display.display("fatal: [%s -> %s]: FAILED! => %s" % (result._host.get_name(), delegated_vars['ansible_host'], 

self._dump_results(result._result)), color=C.COLOR_ERROR) 

else: 

self._display.display("fatal: [%s]: FAILED! => %s" % (result._host.get_name(), self._dump_results(result._result)), color=C.COLOR_ERROR) 

 

65 ↛ exitline 65 didn't return from function 'v2_runner_on_failed', because the condition on line 65 was never false if ignore_errors: 

self._display.display("...ignoring", color=C.COLOR_SKIP) 

 

def v2_runner_on_ok(self, result): 

 

delegated_vars = result._result.get('_ansible_delegated_vars', None) 

 

72 ↛ 73line 72 didn't jump to line 73, because the condition on line 72 was never true if self._play.strategy == 'free' and self._last_task_banner != result._task._uuid: 

self._print_task_banner(result._task) 

 

if isinstance(result._task, TaskInclude): 

return 

elif result._result.get('changed', False): 

78 ↛ 79line 78 didn't jump to line 79, because the condition on line 78 was never true if delegated_vars: 

msg = "changed: [%s -> %s]" % (result._host.get_name(), delegated_vars['ansible_host']) 

else: 

msg = "changed: [%s]" % result._host.get_name() 

color = C.COLOR_CHANGED 

else: 

84 ↛ 85line 84 didn't jump to line 85, because the condition on line 84 was never true if delegated_vars: 

msg = "ok: [%s -> %s]" % (result._host.get_name(), delegated_vars['ansible_host']) 

else: 

msg = "ok: [%s]" % result._host.get_name() 

color = C.COLOR_OK 

 

self._handle_warnings(result._result) 

 

if result._task.loop and 'results' in result._result: 

self._process_items(result) 

else: 

self._clean_results(result._result, result._task.action) 

 

97 ↛ 99line 97 didn't jump to line 99, because the condition on line 97 was never false if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and '_ansible_verbose_override' not in result._result: 

msg += " => %s" % (self._dump_results(result._result),) 

self._display.display(msg, color=color) 

 

def v2_runner_on_skipped(self, result): 

102 ↛ exitline 102 didn't return from function 'v2_runner_on_skipped', because the condition on line 102 was never false if self._plugin_options.get('show_skipped_hosts', C.DISPLAY_SKIPPED_HOSTS): # fallback on constants for inherited plugins missing docs 

 

self._clean_results(result._result, result._task.action) 

 

106 ↛ 107line 106 didn't jump to line 107, because the condition on line 106 was never true if self._play.strategy == 'free' and self._last_task_banner != result._task._uuid: 

self._print_task_banner(result._task) 

 

109 ↛ 110line 109 didn't jump to line 110, because the condition on line 109 was never true if result._task.loop and 'results' in result._result: 

self._process_items(result) 

else: 

msg = "skipping: [%s]" % result._host.get_name() 

113 ↛ 115line 113 didn't jump to line 115, because the condition on line 113 was never false if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and '_ansible_verbose_override' not in result._result: 

msg += " => %s" % self._dump_results(result._result) 

self._display.display(msg, color=C.COLOR_SKIP) 

 

def v2_runner_on_unreachable(self, result): 

if self._play.strategy == 'free' and self._last_task_banner != result._task._uuid: 

self._print_task_banner(result._task) 

 

delegated_vars = result._result.get('_ansible_delegated_vars', None) 

if delegated_vars: 

self._display.display("fatal: [%s -> %s]: UNREACHABLE! => %s" % (result._host.get_name(), delegated_vars['ansible_host'], 

self._dump_results(result._result)), 

color=C.COLOR_UNREACHABLE) 

else: 

self._display.display("fatal: [%s]: UNREACHABLE! => %s" % (result._host.get_name(), self._dump_results(result._result)), color=C.COLOR_UNREACHABLE) 

 

def v2_playbook_on_no_hosts_matched(self): 

self._display.display("skipping: no hosts matched", color=C.COLOR_SKIP) 

 

def v2_playbook_on_no_hosts_remaining(self): 

self._display.banner("NO MORE HOSTS LEFT") 

 

def v2_playbook_on_task_start(self, task, is_conditional): 

 

137 ↛ exitline 137 didn't return from function 'v2_playbook_on_task_start', because the condition on line 137 was never false if self._play.strategy != 'free': 

self._print_task_banner(task) 

 

def _print_task_banner(self, task): 

# args can be specified as no_log in several places: in the task or in 

# the argument spec. We can check whether the task is no_log but the 

# argument spec can't be because that is only run on the target 

# machine and we haven't run it thereyet at this time. 

# 

# So we give people a config option to affect display of the args so 

# that they can secure this if they feel that their stdout is insecure 

# (shoulder surfing, logging stdout straight to a file, etc). 

args = '' 

150 ↛ 151line 150 didn't jump to line 151, because the condition on line 150 was never true if not task.no_log and C.DISPLAY_ARGS_TO_STDOUT: 

args = u', '.join(u'%s=%s' % a for a in task.args.items()) 

args = u' %s' % args 

 

self._display.banner(u"TASK [%s%s]" % (task.get_name().strip(), args)) 

155 ↛ 160line 155 didn't jump to line 160, because the condition on line 155 was never false if self._display.verbosity >= 2: 

path = task.get_path() 

157 ↛ 160line 157 didn't jump to line 160, because the condition on line 157 was never false if path: 

self._display.display(u"task path: %s" % path, color=C.COLOR_DEBUG) 

 

self._last_task_banner = task._uuid 

 

def v2_playbook_on_cleanup_task_start(self, task): 

self._display.banner("CLEANUP TASK [%s]" % task.get_name().strip()) 

 

def v2_playbook_on_handler_task_start(self, task): 

self._display.banner("RUNNING HANDLER [%s]" % task.get_name().strip()) 

 

def v2_playbook_on_play_start(self, play): 

name = play.get_name().strip() 

170 ↛ 171line 170 didn't jump to line 171, because the condition on line 170 was never true if not name: 

msg = u"PLAY" 

else: 

msg = u"PLAY [%s]" % name 

 

self._play = play 

 

self._display.banner(msg) 

 

def v2_on_file_diff(self, result): 

if result._task.loop and 'results' in result._result: 

for res in result._result['results']: 

if 'diff' in res and res['diff'] and res.get('changed', False): 

diff = self._get_diff(res['diff']) 

if diff: 

self._display.display(diff) 

elif 'diff' in result._result and result._result['diff'] and result._result.get('changed', False): 

diff = self._get_diff(result._result['diff']) 

if diff: 

self._display.display(diff) 

 

def v2_runner_item_on_ok(self, result): 

delegated_vars = result._result.get('_ansible_delegated_vars', None) 

self._clean_results(result._result, result._task.action) 

if isinstance(result._task, TaskInclude): 

return 

196 ↛ 200line 196 didn't jump to line 200, because the condition on line 196 was never false elif result._result.get('changed', False): 

msg = 'changed' 

color = C.COLOR_CHANGED 

else: 

msg = 'ok' 

color = C.COLOR_OK 

 

203 ↛ 204line 203 didn't jump to line 204, because the condition on line 203 was never true if delegated_vars: 

msg += ": [%s -> %s]" % (result._host.get_name(), delegated_vars['ansible_host']) 

else: 

msg += ": [%s]" % result._host.get_name() 

 

msg += " => (item=%s)" % (self._get_item(result._result),) 

 

210 ↛ 212line 210 didn't jump to line 212, because the condition on line 210 was never false if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and '_ansible_verbose_override' not in result._result: 

msg += " => %s" % self._dump_results(result._result) 

self._display.display(msg, color=color) 

 

def v2_runner_item_on_failed(self, result): 

 

delegated_vars = result._result.get('_ansible_delegated_vars', None) 

self._clean_results(result._result, result._task.action) 

self._handle_exception(result._result) 

 

msg = "failed: " 

if delegated_vars: 

msg += "[%s -> %s]" % (result._host.get_name(), delegated_vars['ansible_host']) 

else: 

msg += "[%s]" % (result._host.get_name()) 

 

self._handle_warnings(result._result) 

self._display.display(msg + " (item=%s) => %s" % (self._get_item(result._result), self._dump_results(result._result)), color=C.COLOR_ERROR) 

 

def v2_runner_item_on_skipped(self, result): 

if self._plugin_options.get('show_skipped_hosts', C.DISPLAY_SKIPPED_HOSTS): # fallback on constants for inherited plugins missing docs 

self._clean_results(result._result, result._task.action) 

msg = "skipping: [%s] => (item=%s) " % (result._host.get_name(), self._get_item(result._result)) 

if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and '_ansible_verbose_override' not in result._result: 

msg += " => %s" % self._dump_results(result._result) 

self._display.display(msg, color=C.COLOR_SKIP) 

 

def v2_playbook_on_include(self, included_file): 

msg = 'included: %s for %s' % (included_file._filename, ", ".join([h.name for h in included_file._hosts])) 

self._display.display(msg, color=C.COLOR_SKIP) 

 

def v2_playbook_on_stats(self, stats): 

self._display.banner("PLAY RECAP") 

 

hosts = sorted(stats.processed.keys()) 

for h in hosts: 

t = stats.summarize(h) 

 

self._display.display(u"%s : %s %s %s %s" % ( 

hostcolor(h, t), 

colorize(u'ok', t['ok'], C.COLOR_OK), 

colorize(u'changed', t['changed'], C.COLOR_CHANGED), 

colorize(u'unreachable', t['unreachable'], C.COLOR_UNREACHABLE), 

colorize(u'failed', t['failures'], C.COLOR_ERROR)), 

screen_only=True 

) 

 

self._display.display(u"%s : %s %s %s %s" % ( 

hostcolor(h, t, False), 

colorize(u'ok', t['ok'], None), 

colorize(u'changed', t['changed'], None), 

colorize(u'unreachable', t['unreachable'], None), 

colorize(u'failed', t['failures'], None)), 

log_only=True 

) 

 

self._display.display("", screen_only=True) 

 

# print custom stats 

269 ↛ 270line 269 didn't jump to line 270, because the condition on line 269 was never true if self._plugin_options.get('show_custom_stats', C.SHOW_CUSTOM_STATS) and stats.custom: # fallback on constants for inherited plugins missing docs 

self._display.banner("CUSTOM STATS: ") 

# per host 

# TODO: come up with 'pretty format' 

for k in sorted(stats.custom.keys()): 

if k == '_run': 

continue 

self._display.display('\t%s: %s' % (k, self._dump_results(stats.custom[k], indent=1).replace('\n', ''))) 

 

# print per run custom stats 

if '_run' in stats.custom: 

self._display.display("", screen_only=True) 

self._display.display('\tRUN: %s' % self._dump_results(stats.custom['_run'], indent=1).replace('\n', '')) 

self._display.display("", screen_only=True) 

 

def v2_playbook_on_start(self, playbook): 

285 ↛ 289line 285 didn't jump to line 289, because the condition on line 285 was never false if self._display.verbosity > 1: 

from os.path import basename 

self._display.banner("PLAYBOOK: %s" % basename(playbook._file_name)) 

 

289 ↛ exitline 289 didn't return from function 'v2_playbook_on_start', because the condition on line 289 was never false if self._display.verbosity > 3: 

# show CLI options 

291 ↛ 292line 291 didn't jump to line 292, because the condition on line 291 was never true if self._options is not None: 

for option in dir(self._options): 

if option.startswith('_') or option in ['read_file', 'ensure_value', 'read_module']: 

continue 

val = getattr(self._options, option) 

if val and self._display.verbosity > 3: 

self._display.display('%s: %s' % (option, val), color=C.COLOR_VERBOSE, screen_only=True) 

 

def v2_runner_retry(self, result): 

task_name = result.task_name or result._task 

msg = "FAILED - RETRYING: %s (%d retries left)." % (task_name, result._result['retries'] - result._result['attempts']) 

if (self._display.verbosity > 2 or '_ansible_verbose_always' in result._result) and '_ansible_verbose_override' not in result._result: 

msg += "Result was: %s" % self._dump_results(result._result) 

self._display.display(msg, color=C.COLOR_DEBUG) 

 

def v2_playbook_on_notify(self, handler, host): 

if self._display.verbosity > 1: 

self._display.display("NOTIFIED HANDLER %s for %s" % (handler.get_name(), host), color=C.COLOR_VERBOSE, screen_only=True)