在Ansible 1.9中的运行时指定SSH配置文件

时间:2015-06-26 21:45:40

标签: python ssh ansible

我正在管理两个配置不同的服务器环境。我通过在命令行上指定不同的SSH配置来访问这两个环境,因为我需要为SSH指定不同的UserProxyCommand和其他选项列表。

e.g。

ssh oldserver.example.org -F config_legacy

ssh newserver.example.org -F config

要在我的服务器上配置和维护状态,我一直在使用Ansible(版本1.9.0.1),它读取由ansible.cfg中的一行指定的SSH配置文件:

...
ssh_args =  -F some_configuration_file
...

ansible.cfgloaded a number of ways

def load_config_file():
    ''' Load Config File order(first found is used): ENV, CWD, HOME, /etc/ansible '''

    p = configparser.ConfigParser()

    path0 = os.getenv("ANSIBLE_CONFIG", None)
    if path0 is not None:
        path0 = os.path.expanduser(path0)
    path1 = os.getcwd() + "/ansible.cfg"
    path2 = os.path.expanduser("~/.ansible.cfg")
    path3 = "/etc/ansible/ansible.cfg"

    for path in [path0, path1, path2, path3]:
        if path is not None and os.path.exists(path):
            try:
                p.read(path)
            except configparser.Error as e:
                print("Error reading config file: \n{0}".format(e))
                sys.exit(1)
            return p
    return None

我可以使用这种行为在每个命令之前设置一个环境变量来加载一个完全不同的ansible.cfg,但这看起来很麻烦,因为我只需要调整ssh_args。不幸的是,Ansible没有公开命令开关来指定SSH配置。

我希望不对Ansible进行任何修改,我不想将所有调用都包含在ansibleansible-playbook命令中。为了保留Ansible命令的行为,我相信我的选择是:

  • a)将ssh_args = -F <<config_file>>的目标设为已打开的脚本
  • b)目标p.read(path)是一个扩展为生成有效ansible.cfg的脚本
  • c)只维护不同的ansible.cfg文件,并利用Ansible按环境变量cwd的顺序选择此文件的事实。

2 个答案:

答案 0 :(得分:5)

选项C是我能看到完成此任务的唯一方法。你可以让你的默认/最常用的ansible.cfg是在cwd ansible.cfg中读取的那个,然后可选地设置/取消设置一个环境变量,该变量指向指定你需要的ssh_args = -F config_legacy行的版本(ANSIBLE_SSH_ARGS)。

需要执行ansible.cfg而不是仅使用SSH选项传递envvar的原因是因为Ansible不遵守ssh配置文件中的User设置 - 它已经决定了谁它想要在启动命令时运行。

动态广告资源(ec2.py)文件是出于维护原因而难以进行变更的原因,这就是为什么看到--user=REMOTE_USER标志的典型情况,再加上设置{ {1}}环境变量,使一个丑陋的命令给一个Ansible仓库的临时用户。

e.g。

ANSIBLE_SSH_ARGS="-F some_ssh_config"

ANSIBLE_SSH_ARGS="-F other_ssh_config" ansible-playbook playbooks/why_i_am_doing_this.yml -u ubuntu

选项A不起作用,因为根据上面的ansible-playbook playbooks/why_i_am_doing_this.yml -F other_ansible.cfg 将文件一次性打开以加载到Python中,并不重要,因为如果文件可以任意决定以脚本形式打开,我们&# 39;生活在一个非常可怕的世界里。

这是p.read()加载从系统角度看的方式:

$ sudo dtruss -a ansible ......

ansible.cfg

选项B不起作用的原因与A不起作用的原因相同 - 即使您使用正确的读/读/读取线sigatures创建模拟Python文件对象,该文件仍在打开只读,而不是执行。

如果这是OpenSSH的正确回购,config file is specified like so

74947/0x11eadf:    312284       3      2 stat64("/Users/tfisher/code/ansible/ansible.cfg\0", 0x7FFF55D936C0, 0x7FD70207EA00)             = 0 0
74947/0x11eadf:    312308      19     17 open_nocancel("/Users/tfisher/code/ansible/ansible.cfg\0", 0x0, 0x1B6)          = 5 0
74947/0x11eadf:    312316       3      1 read_nocancel(0x5, "# ansible.cfg \n#\n# Config-file load order is:\n#   envvar ANSIBLE_CONFIG\n#   `pwd`/ansible.cfg\n#   ~/.ansible.cfg\n#   /etc/ansible/ansible.cfg\n\n# Some unmodified settings are left as comments to encourage research/suggest modific", 0x1000)               = 3477 0
74947/0x11eadf:    312308      19     17 open_nocancel("/Users/tfisher/code/ansible/ansible.cfg\0", 0x0, 0x1B6)          = 5 0

processed like so

#define _PATH_HOST_CONFIG_FILE      SSHDIR "/ssh_config"

and read here with an fopen,没有留下&#34;文件作为脚本的空间&#34; schenanigans。

答案 1 :(得分:0)

另一个选项是将环境变量ANSIBLE_SSH_ARGS设置为您希望Ansible传递给ssh命令的参数。