在使用 Fabric 的过程中,如果大批量服务器处理的话,我们就需要针对配置主机的密码,每台主机的密码相同还好,不同的话,就需要针对不同的主机做配置了,以下有两种配置方式

注:本文主要参考官方文档 Password management 以及 grimnes 的文章 Using SSH keys with Fabric

env.password

Fabric 在某些场合下通过保持在内存中以及双重缓存来帮助你记录登录密码以及 sudo 密码。当多个系统的密码一样的时候,这可以避免让你重复乏味的输入密码。或者是一个远程系统的 sudo 配置文件没有缓存它自己的密码时候。

第一层是一个默认简单的或是备用的密码缓存。 env.password (它也可以通过命令行参数  --password 或是 --initial-password-prompt 来设定)。这个 env 变量存储单个密码,它会咋当前的  host string 没有指定的主机缓存条目的事件的时候尝试。

env.passwords (复数,表示多个密码),作为每一个主机用户的缓存,为唯一的 user/host/port 组合存储了最近输入的密码1。由于这个缓存,连接具有相同 session 的不同用户和主机,仅仅只要求单个的密码。

依赖于你的配置文件以及你 session 连接的主机的数目,你可能会发现设置这些 env 是非常有用的。尽管如此, Fabric 会在必要的时候自动填充他们,不需要你多余的配置。

特别说明,每次对用户提出的密码提示,这值都会被用于更新这默认的密码缓存以及 env.host_string 当前值的缓存值。

没代码说的球,上代码。NO CODE NO BB

  1. 所有主机密码一样的代码,下面代码的几台主机是用户名和密码一样的,主要做的事情是批量注释,批量停止应用,以及批量关机
#!/usr/bin/python env
# -*- coding: utf-8 -*-
from fabric.api import env
from fabric.api import cd
from fabric.api import run
from fabric.api import local
from fabric.api import get
from fabric.api import put env.user = 'username'
env.password = 'passwd'
env.hosts = ['192.168.1.1', '192.168.1.2', '192.168.1.3', '192.168.1.4'] def get_version():
local('cat /etc/issue')
run('cat /etc/issue')
#with cd('/root/'):
# put('/home/libaoyin/test.txt', 'test.txt', mode=0755)
# get('hello_world.txt')
run('ls') def get_host_name():
run('hostname') #kill all stockd'service
def kill_apps_stockd():
run('killall stockd') #discharge the crontab
def comment_crontabl():
put ('/home/apps/ykq/crontab.txt','crontab.txt')
run('crontab crontab.txt') # offline stockd's service
def offline_stockd():
kill_apps_stockd()
comment_crontabl() #shutdown all stockd server
def shutdown_stockd_server():
run('sudo poweroff')
  1. 所有主机的用户名一样,但密码不一样
    这里感谢@Kollin 的提示,修正下错误,并且以他的示例程序为例。
    不过感觉这个Fabric的这方面这样做的原因应该是“基于不同的用户名和不同的密码考虑的”
    没有考虑过相同用户名,不同密码的情况。如果要这样做,个人感觉可以修改源码,然后支持env.user 和 env.passwords拼接的方式。不然每个值都要输入 user@ 这样要多写很多代码

错误的示例程序。

env.user = 'username'
env.passwords = {'192.168.1.1':'passwd1','192.168.1.2':'passwd2','192.168.1.3':'passwd3'}
env.hosts = ['192.168.1.1', '192.168.1.2', '192.168.1.3']

正确的 @Kollin的示例程序

from fabric.api import *
env.hosts = [
'user@192.168.1.1',
'user@192.168.1.2',
] env.passwords = {
'user@192.168.1.1:22': 'password1',
'user@192.168.1.2:22': 'password2',
} @task
def echo():
run('echo "hello,world"')

注:后续会专门写一篇关于 Fabric 中角色的文章

SSH KEY

官方文档中建议,为了安全起见,最好是使用 SSH KEY 的方式来批量执行主机,操作方式如下:

  1. 登录服务器,生成 SSH Key
$ ssh-keygen -t rsa -b 4096

键入以上命令后,会出现一连串的提示,忽略它,一直按回车键即可。
执行完成后,将在用户的 ~/.ssh/ 目录生成以下两个文件:

~/.ssh/id_rsa  私钥

~/.ssh/id_rsa.pub 公钥
  1. 公钥填充

    把生成的公钥文件 ~/.ssh/id_rsa.pub里面的数据添加进远程服务器的 authorized_keys file 文件中

    注:如果远程服务器没有  .ssh 文件夹,需要创建

scp ~/.ssh/id_rsa.pub user@host:~/.ssh/
cat ~/.ssh/id_rsa.pub >> authorized_keys

然后准备我们的用我们的 SSH Key 代替我们的密码:

#!/usr/bin/python env
from fabric.api import *
from fabric.colors import *
from fabric.context_managers import *
env.hosts=['168.192.1.10','168.192.1.12']
# env.password='xxxxxx'
env.key_filename = "~/.ssh/id_rsa" def ls_path():
print(green("I'm local /home/apps/"))
with cd('/home/apps'):
run('ls -l')
def put_path():
print(green("I'm put local's test file to 10 and 12"))
put('/home/apps/test','/home/apps/')
print(yellow("I'm 10 or 12 /home/apps/"))
with cd('/home/apps'):
run('ls -l')
def deploy():
execute(ls_path)
execute(put_path)

  1. 我们强烈推荐使用基于 SSH key 的访问方式代替依靠同样的密码,SSH key 方式是更加安全的

自动化运维工具Fabric - 密码管理(env.password and ssh key)的更多相关文章

  1. 轻量级自动化运维工具Fabric的安装与实践

    一.背景环境 在运维工作中,经常会遇到重复性的劳动,这个时候为了效率就必须要使用自动化运维工具. 这里我给大家介绍轻量级自动化运维工具Fabric,Fabric是基于Python语言开发的,是开发同事 ...

  2. Python自动化运维工具-Fabric部署及使用总结

    使用shell命令进行复杂的运维时,代码往往变得复杂难懂,而使用python脚本语言来编写运维程序,就相当于开发普通的应用一样,所以维护和扩展都比较简单,更重要的是python运维工具fabric能自 ...

  3. Python自动化运维工具fabric的安装

    使用shell命令进行复杂的运维时,代码往往变得复杂难懂,而使用python脚本语言来编写运维程序,就相当于开发普通的应用一样,所以维护和扩展都比较简单,更重要的是python运维工具fabric能自 ...

  4. 自动化运维工具fabric使用教程

    摘要:当需要同时管理许多服务器时,如果我们一台一台登陆上去操作会显得费时又费力.此时我们可以用fabric这个包提供的API来编写python脚本完成服务器集群的统一管理. 核心原理:fabric为主 ...

  5. Ansible自动化运维工具

    ansible软件介绍 python语言是运维人员必会的语言!  ansible是一个基于Python开发的自动化运维工具!(saltstack)  其功能实现基于SSH远程连接服务!  ans ...

  6. CentOS7Linux中自动化运维工具Ansible的安装,以及通过模块批量管理多台主机

    使用自动化运维工具Ansible集中化管理服务器 Ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具.它用Python写成,类似于saltstack和Puppet ...

  7. 自动化运维工具之ansible

    自动化运维工具之ansible   一,ansible简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fab ...

  8. 自动化运维工具——ansible详解(一)

    ansible 简介 ansible 是什么? ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.chef.func.fabric)的优点,实现了批量系统 ...

  9. 企业级自动化运维工具应用实战-ansible

    背景 公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备.公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出多套环境可以共开发和测试人员做测试,运 ...

随机推荐

  1. Redis数据库(二)

    1. Redis数据库持久化 redis提供了两种数据备份方式,一种是RDB,另外一种是AOF,以下将详细介绍这两种备份策略. 面试: 1.1  配置文件详解备份方式 [root@localhost ...

  2. MySQL-简要说明

    分类 安装发展顺序分为: 网状型数据库 层次型数据库 关系型数据库 面向对象数据库 主流:关系型数据库 关系型数据库 事务transaction: 多个操作被当作一个整体对待 • ACID:     ...

  3. opencast的docker安装

    在之前的从源安装和从包安装opencast,都遇到较多环境问题导致失败.所有采用docker安装. Dockers是有能力打包应用程序及其虚拟容器,可以在任何Linux服务器上运行的依赖性工具,这有助 ...

  4. verilog behavioral modeling--blocking and nonblocking

                                                                                                 BLOCKIN ...

  5. 解决zend studio代码无法自动提示的3个方法

    最近电脑重装,索性把用了好多年的老版本7.x 升级了,网上下载了一个12.x的破解版. 起初一切正常,等导入项目开始开发的时候发现PHP函数尽然没有提示,一脸懵逼! 经过多方查阅和尝试,现在分享3个解 ...

  6. day22面向对象

    面向对象编程: 1.什么是面向对象 面向过程(编程思想): 过程,解决问题的步骤,流程即第一步做什么,第二步做什么 将复杂问题,拆成若干小问题,按照步骤一一解决,将复杂问题流程化(为其制定固定的实现流 ...

  7. eclipse代码格式化快捷键无法使用

    [产生原因] Ctrl+Shift+F快捷键组合被其他应用占有,如输入法. [解决方案] 关闭或更换其他应用快捷键或更换eclipse对应的快捷键组合.

  8. python基础学习笔记——time模块

    time模块 time翻译过来就是时间,有我们其实在之前编程的时候有用到过. #常用方法 1.time.sleep(secs) (线程)推迟指定的时间运行.单位为秒. 2.time.time() 获取 ...

  9. bootstap 折叠

    data-toggle="collapse" 添加到您想要展开或折叠的组件的链接上. href 或 data-target 属性添加到父组件,它的值是子组件的 id

  10. Exchange 正版化 授权

    网友说法: Exchange服务器版其实价格不高,企业版也就是几万左右,贵的是客户端授权,一个客户端授权大概要300多.但是,但是,中国企业买Exchange客户端一般都是可以按比例买的,比如10%- ...