从0开始实现自动化运维工具(一)

完整代码已经在github开源:github.com/CTC-maxiao/…linux

项目背景

在使用ansible构建咱们团队的自动化运维体系时,咱们遇到了一些没法解决的问题:git

  • 只有一台windows堡垒机可以访问到全部的linux主机,其余全部linux机器网络没法互通。而ansible控制端只能安装在linux平台上。
  • 咱们linux机器为了安全,没法经过root用户ssh到机器上。只能经过我的帐号ssh到机器上后使用我的密码切换到root用户,也就是说咱们不知道root用户的密码。因此咱们也没法使用ansible的become功能来切换用户。
  • ansible在一个task中切换用户成功后,在下一个task还须要再次切换,没法维持一个登陆session。

因此我决定重复造一次轮子,写一个简单的类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的参数
}
复制代码

yaml文件格式的设计

参考ansible playbook的设计。json

config文件格式的设计

设计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程序。运行task程序ssh登陆到远程主机,执行become参数设置的用户切换后,执行action参数设置的操做。而后将结果输出到register设置的变量中,返回到主程序。bash

相关文章
相关标签/搜索