我正在管理两个配置不同的服务器环境。我通过在命令行上指定不同的SSH配置来访问这两个环境,因为我需要为SSH指定不同的User
,ProxyCommand
和其他选项列表。
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.cfg
是loaded 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进行任何修改,我不想将所有调用都包含在ansible
或ansible-playbook
命令中。为了保留Ansible命令的行为,我相信我的选择是:
ssh_args = -F <<config_file>>
的目标设为已打开的脚本p.read(path)
是一个扩展为生成有效ansible.cfg的脚本答案 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"
诉P>
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
#define _PATH_HOST_CONFIG_FILE SSHDIR "/ssh_config"
and read here with an fopen,没有留下&#34;文件作为脚本的空间&#34; schenanigans。
答案 1 :(得分:0)
另一个选项是将环境变量ANSIBLE_SSH_ARGS
设置为您希望Ansible传递给ssh命令的参数。