完整代码已经在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设置的变量中,返回到主程序。