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
|
例子
1
:
#!/usr/bin/python
import
json
from
collections
import
namedtuple
from
ansible.parsing.dataloader
import
DataLoader
from
ansible.
vars
.manager
import
VariableManager
from
ansible.inventory.manager
import
InventoryManager
from
ansible.playbook.play
import
Play
from
ansible.executor.task_queue_manager
import
TaskQueueManager
from
ansible.executor.task_result
import
TaskResult
from
ansible.plugins.callback
import
CallbackBase
class
ResultCallback(CallbackBase):
def
v2_runner_on_ok(
self
, result,
*
*
kwargs):
host
=
result._host
print
(json.dumps({host.name: result._result}, indent
=
4
))
Options
=
namedtuple(
'Options'
, [
'connection'
,
'module_path'
,
'forks'
,
'become'
,
'become_method'
,
'become_user'
,
'check'
,
'diff'
])
loader
=
DataLoader()
options
=
Options(connection
=
'smart'
, module_path
=
None
, forks
=
2
, become
=
None
, become_method
=
None
, become_user
=
None
, check
=
False
, diff
=
False
)
#connection参数,如果执行本地节点用'local', 远端节点用'smart'
#passwords = dict(vault_pass='xxxxx') #密钥方式取消这步
results_callback
=
ResultCallback()
inventory
=
InventoryManager(loader
=
loader, sources
=
[
'hosts'
])
variable_manager
=
VariableManager(loader
=
loader, inventory
=
inventory)
#variable_manager.set_inventory(inventory)
play_source
=
dict
(
name
=
"Ansible Play"
,
hosts
=
'webserver'
,
gather_facts
=
'no'
,
tasks
=
[
dict
(action
=
dict
(module
=
'shell'
, args
=
'df -Th'
), register
=
'shell_out'
),
]
)
play
=
Play().load(play_source, variable_manager
=
variable_manager, loader
=
loader)
tqm
=
None
try
:
tqm
=
TaskQueueManager(
inventory
=
inventory,
variable_manager
=
variable_manager,
loader
=
loader,
options
=
options,
passwords
=
None
,
stdout_callback
=
results_callback,
)
result
=
tqm.run(play)
print
(result)
finally
:
if
tqm
is
not
None
:
tqm.cleanup()
自定义模块
例子
2
:
play.yml
-
-
-
-
hosts: webserver
tasks:
-
name: Test that my module works
github_repo:
register: result
-
debug: var
=
result
模块github_repo.py 放在
/
usr
/
local
/
lib
/
python3.
6
/
site
-
packages
/
ansible
/
modules,
ansible模块路径
#!/usr/bin/python
from
ansible.module_utils.basic
import
*
def
main():
module
=
AnsibleModule(argument_spec
=
{})
response
=
{
"hello"
:
"world"
}
module.exit_json(changed
=
False
, meta
=
response)
if
__name__
=
=
'__main__'
:
main()
注:
main() 是你的程序入口
#!/usr/bin/python is 这个是必须的,就和些shell脚本一样
AnsibleModule 是从 ansible.module_utils.basic 总导入的,
import
*
必须是导入全部的
*
AnsibleModule 有一些已经写好的方法让我们调用,例如exit_json
使用模块
# ansible-playbook play.yml
注:
在使用ansible
-
playbook 执行yml文件时,handlers只有在前面动作触发的情况下才能执行
例如,当copy文件时,只有copy后的文件和copy之前不一样才会触发handlers
tasks
/
main.yml
# copy配置文件到节点服务器 当copy到远程服务器的文件和远程服务器自身的文件相同时,并不会触发notify
-
name: copy
file
copy: src
=
/
data
/
docker_conf
/
{{ service_dir }}
/
dest
=
/
data
/
docker_conf
/
{{ service_dir }}
/
backup
=
no owner
=
root group
=
root mode
=
0644
notify:
-
exec
script
# 修改文件并启动服务
handlers
/
main.yml
-
name:
exec
script
shell:
/
bin
/
bash
/
data
/
scripts
/
startup.sh
# 执行远程脚本
|
本文转自小白的希望 51CTO博客,原文链接:http://blog.51cto.com/haoyonghui/1982517
,如需转载请自行联系原作者