自动化运维工具
有Ansible, Fabric, puppet 等,其中我选择了Fabric ,因为我觉得这个工具够简单。
这里有个支持Python3的fabric模块:https://github.com/mathiasertl/fabric
但是通过 fab.exe task 这样的命令行,感觉不好交互,如果有API的话,就可以很方便的跟其他项目集成在一起。
不知道fabric本身有没有提供,自己研究了一下安装好后的源码:
1)看文件名应该是从main.py 着手:
if remainder_command:
r = '<remainder>'
#remainder_command 包含了要执行的命令
#api.run 定义在operations.py文件,是一个用@needs_host装饰了的函数
state.commands[r] = lambda: api.run(remainder_command)
commands_to_run.append((r, [], {}, [], [], []))
# Ditto for a default, if found
if not commands_to_run and default:
commands_to_run.append((default.name, [], {}, [], [], []))
# Initial password prompt, if requested
if options.initial_password_prompt:
prompt = "Initial value for env.password: "
state.env.password = getpass.getpass(prompt)
# Ditto sudo_password
if options.initial_sudo_password_prompt:
prompt = "Initial value for env.sudo_password: "
state.env.sudo_password = getpass.getpass(prompt)
if state.output.debug:
names = ", ".join(x[0] for x in commands_to_run)
print("Commands to run: %s" % names)
# At this point all commands must exist, so execute them in order.
#除了name之外,其他参数几乎都是空,没用上
#print打印,发现更多信息都是包含在state.env 这个字典上面
for name, args, kwargs, arg_hosts, arg_roles, arg_exclude_hosts in commands_to_run:
#execute 能返回一个字典,里面包含了执行结果,这正是我需要的。
execute(
name,
hosts=arg_hosts,
roles=arg_roles,
exclude_hosts=arg_exclude_hosts,
*args, **kwargs
)
# If we got here, no errors occurred, so print a final note.
if state.output.status:
2)
我自己加了一个py文件:Python36\Lib\site-packages\fabric\simple_task.py
内容如下:
from fabric import api, state
from fabric.tasks import execute
def simple_execute(host, port, user, password, shell):
r = '<remainder>'
state.env.hosts = host
state.env.port = port
state.env.user = user
state.env.password = password
state.commands[r] = lambda: api.run(shell)
return execute(r)
3)结果如下:
嗯,正好大概是我需要的效果!后面根据需要慢慢修改了,谢谢分享