完整代码已经在github开源:github.com/CTC-maxiao/…linux
在使用ansible构建咱们团队的自动化运维体系时,咱们遇到了一些没法解决的问题:git
因此我决定重复造一次轮子,写一个简单的类ansible的自动化运维工具,而且可以解决上面这些问题。github
经过观察ansible的playbook格式和ansible.cfg,我猜想ansible最终是把输入的yaml文件中的信息和ansible.cfg中的信息组合成一个最终的执行字典,做为程序的输入。每个task都构造出一个执行字典来。我根据个人需求,构造出如下的字典格式:shell
{
task_name: #task的名称
task_host: #执行task的机器,默认是playbook中设定的host,若是有设定delegate_to就覆盖这个参数
become: #是否切换用户(yes/no)
become_method: #切换用户方式
become_user: #切换为哪一个用户
become_pwd: #切换密码
ssh_user: #ssh到host的用户
ssh_pwd: #ssh到host的用户密码
ssh_port: #ssh的端口
register: #将运行结果保持到设定的变量中
action_type: #task要执行的操做类型,好比shell/copy/slack等
action: #具体的action或action的参数
}
复制代码
参考ansible playbook的设计。json
设计config文件为json格式,方便读取和后续操做:windows
{
ssh_port: 22
become: yes
become_method: su
become_user: root
become_pwd_same_as_ssh: no
}
复制代码
首先程序读取config文件中的设置填入字典,而后程序读取yaml文件中的设置修改字典,最后根据输入的密码填写密码字段。这样就成功构造出了task的执行字典。安全
将构造好的执行字典传入运行task程序。运行task程序ssh登陆到远程主机,执行become参数设置的用户切换后,执行action参数设置的操做。而后将结果输出到register设置的变量中,返回到主程序。bash