fabric篇之env环境的配置说明

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

先来说说fabric中的env。
1、fabric有很多的配置环境,如:
user:默认用于ssh登录的本地用户名。
password:用于ssh登录的默认密码,若未提供且未配置ssh则无密登录,在执行ssh登录时,需要输入密码。
warn_only:是否当在远程机器上执行命令,出现错误时,fabric是否退出。

2、settings上下文管理器:
有时,我们不希望覆盖env全局配置,而是使用临时配置,你可以用settings,如:

from fabric.api import settings,run

def exists(path):
	with settings(warn_only=True):
		return run('test -e %s' % path)

3、其他
属性读写访问:
#两种方式:
env.host_string
env[‘host_string’]

变量引用:
#普通方式

print("Executing on %s as %s" % (env.host,env.user))

#字典方式

print("Executing on %(host)s as %(user)s" % env)

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

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

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

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

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

示例演示:
注:所有主机密码一样的代码,下面代码的几台主机是用户名和密码一样的,主要做的事情是批量注释,批量停止应用,以及批量关机

#!/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')

注意:所有主机的用户名一样,但密码不一样
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']

正确的示例程序

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-ca证书


下一篇:fabric.js动画简单的播放器