gpt4 book ai didi

python - 在 Ansible 1.9 运行时指定 SSH 配置文件

转载 作者:行者123 更新时间:2023-11-28 21:50:58 25 4
gpt4 key购买 nike

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

例如

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 的任何修改我不想包装对 ansible 的所有调用或 ansible-playbook命令。为了保留 Ansible 命令的行为,我相信我的选择是:

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

最佳答案

选项 C 是我认为实现此目标的唯一方法。您可以将默认/最常用的 ansible.cfg 设置为在 cwd ansible.cfg 中读取的那个,然后可选择设置/取消设置指向指定版本的环境变量 ssh_args = -F config_legacy 您需要的行 (ANSIBLE_SSH_ARGS)。

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

出于维护原因,动态 list (ec2.py) 文件是修改更改的极差位置,这就是为什么通常会看到 --user=REMOTE_USER标志与设置 ANSIBLE_SSH_ARGS="-F some_ssh_config" 环境变量相结合,为 Ansible 存储库的临时用户提供了一个丑陋的命令。

例如

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

ansible-playbook playbooks/why_i_am_doing_this.yml -F other_ansible.cfg

选项 A 不起作用,因为根据上面的 p.read(),文件被一次性打开以加载到 Python 中,但这并不重要,因为如果文件可以任意决定打开作为脚本,我们将生活在一个非常可怕的世界中。

从系统的角度来看,ansible.cfg 加载是这样的:

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

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

选项 B 不起作用的原因与 A 不起作用的原因相同——即使您使用适当的 read/readline/readlines 签名创建了一个模拟 Python 文件对象,该文件仍然以只读方式打开,而不是执行。

如果这是 OpenSSH 的正确存储库,则 config file is specified like so :

#define _PATH_HOST_CONFIG_FILE      SSHDIR "/ssh_config"

processed like so :

    /* Read systemwide configuration file after user config. */
(void)read_config_file(_PATH_HOST_CONFIG_FILE, pw,
host, host_arg, &options,
post_canon ? SSHCONF_POSTCANON : 0);

and read here with an fopen ,这没有为“文件作为脚本”的诡计留下空间。

关于python - 在 Ansible 1.9 运行时指定 SSH 配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31082632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com