ssh-add 永久使用 ansible

ssh-add permanently using ansible

我正在尝试在 ansible 任务中使用 ssh-add 将 SSH 密钥添加到 SSH 代理。

我的 ansible 任务是这样的:

- name: add id_rsa in ssh-agent
  shell: eval `ssh-agent -s` && ssh-add -K ~/.ssh/id_rsa_mykey

它 returns 结果如下:

TASK: [add id_rsa in ssh-agent] *********************************************** 
changed: [testcom.mydomain.com] => {"changed": true, "cmd": "eval `ssh-agent -s` && ssh-add -K ~/.ssh/id_rsa_mykey", "delta": "0:00:00.086725", "end": "2015-08-26 13:35:38.527742", "rc": 0, "start": "2015-08-26 13:35:38.441017", "stderr": "Could not create keychain item\nIdentity added: /var/root/.ssh/id_rsa_mykey (/var/root/.ssh/id_rsa_mykey)", "stdout": "Agent pid 8559", "warnings": []}

我不知道为什么它不能将钥匙添加到钥匙串中,但似乎已经添加了钥匙。但是,当我使用 ssh-add -l 检查时,它说代理没有身份。我找不到问题所在。

可以使用相同的命令在终端中手动添加密钥。

您需要从 bash/zsh/etc 启动脚本向代理添加密钥。您可以通过 Ansible 将这些行添加到文件中,但否则效果不佳。

ssh-agent 效果仅限于调用它的单个任务,因为 ssh-agent 的连接信息保存在环境变量中。您可能想查看您在任务中评估的内容。

$ ssh-agent -s
SSH_AUTH_SOCK=/tmp/ssh-uKzY20owbmmf/agent.8285; export SSH_AUTH_SOCK;
SSH_AGENT_PID=8286; export SSH_AGENT_PID;
echo Agent pid 8286;

如果没有上面显示的设置,您将无法在以后的任务或交互式会话中使用此 ssh-agent

在任何情况下我都不会向 运行 ssh-agent 推荐这种方式 (eval $(ssh-agent))。很难在退出时正确完成守护进程 ssh-agent,很容易在系统中创建无所有者的 ssh-agent 进程。如果改用SSH代理转发会好很多。

我发现在 Ansible 任务中仍然可以 运行 ssh-add 以便以后的任务可以使用我添加的键。但是有必要在剧本开始之前从剧本中删除 eval `ssa-agent` 并分别 运行 。这样代理的环境变量就可以被 Ansible 任务看到。