使用ansible永久添加ssh

使用ansible永久添加ssh,ansible,ssh-keys,Ansible,Ssh Keys,我正在尝试使用SSH插件ansible任务向SSH代理添加SSH密钥 我的任务如下所示: - name: add id_rsa in ssh-agent shell: eval `ssh-agent -s` && ssh-add -K ~/.ssh/id_rsa_mykey 并返回以下结果: TASK: [add id_rsa in ssh-agent] *********************************************** changed: [t

我正在尝试使用SSH插件ansible任务向SSH代理添加SSH密钥

我的任务如下所示:

- name: add id_rsa in ssh-agent
  shell: eval `ssh-agent -s` && ssh-add -K ~/.ssh/id_rsa_mykey
并返回以下结果:

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代理的效果仅限于调用它的单个任务,因为到
ssh代理的连接信息保存在环境变量中。您可能希望查看任务中评估的内容

$ 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代理


在任何情况下,我都不建议以这种方式运行
ssh-agent
eval$(ssh-agent)
)。退出时很难正确完成后台监控的
ssh-agent
,很容易在系统中创建无主的
ssh-agent
进程。使用SSH代理转发会更好。

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

是否要为用户root添加此密钥?@udondan是的,我要为root添加此密钥。这会导致问题吗?我只是想知道,因为问题中没有提到它,但生成的输出显示任务是以root用户身份运行的。我只是认为这可能是偶然的,而你看错了用户。@udondan哦,我明白了,对不起,我应该在问题中提到它。是的,我正在以root用户身份运行playbook,并检查root用户的代理(如果已添加密钥)。根据Alister Bulman的回答,ssh add似乎不会在ansible任务中直接生效。即使这样做可行,您也不知道在该任务运行后ssh代理是否设置了环境变量。不过,您可以自己编写一个包装器脚本,它将ssh代理的输出重定向到一个文件,然后您可以
source
稍后将该文件放入shell中。