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

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

项目背景

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

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

所以我决定重复造一次轮子,写一个简单的类ansible的自动化运维工具,并且能够解决上面这些问题。

构造执行字典

通过观察ansible的playbook格式和ansible.cfg,我猜测ansible最终是把输入的yaml文件中的信息和ansible.cfg中的信息组合成一个最终的执行字典,作为程序的输入。每一个task都构造出一个执行字典来。我根据我的需求,构造出以下的字典格式:

{
    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的设计。

config文件格式的设计

设计config文件为json格式,方便读取和后续操作:

{
   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设置的变量中,返回到主程序。

转载于:https://juejin.im/post/5cf7409cf265da1bd04ece34

你可能感兴趣的:(从0开始实现自动化运维工具(一))