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,如需转载请自行联系原作者