我正在创建一个可行的剧本,通过一组AWS EC2主机并安装一些基本包。在playbook可以执行任何任务之前,playbook需要用正确的user: {{ userXXX }}
登录到每个主机(2种类型的发行版AWS Linux或Ubuntu),这是我不太确定如何通过正确的用户登录的部分,它将是ec2-user
或ubuntu
。
- name: setup package agent
hosts: ec2_distros_hosts
user: "{{ ansible_user_id }}"
roles:
- role: package_agent_install
我假设ansible_user_id
将基于ansible保留的变量工作,但这里并非如此。我不想为不同的发行版创建2个单独的剧本,是否有一个优雅的解决方案来动态查找用户登录并用作user:
?
下面是未知用户ansible-playbook -i inventory/ec2.py agent.yml
的失败cmd
你有几种方法来完成你的任务:
1。在每个主机上用相同的名字创建一个可见用户
如果你有一个,你可以使用user: ansible_user
在你的剧本。
2。用合适的login_name
标记每个主机您可以为每个ec2主机创建一个标记(例如login_name
)并在其中指定用户。对于Ubuntu主机—Ubuntu,对于AWS Linux主机—ec2-user。这样做之后,您可以在剧本中使用user: "{{ec2_tag_login_name}}"
-这将从主机的login_name标记中获取用户名。
3。根据需要修补ec2.py脚本
似乎没有合适的方法从AMI获得确切的平台名称,但您可以使用这样的内容:
image_name = getattr(conn.get_image(image_id=getattr(instance,'image_id')),'name')
login_name = 'user'
if 'ubuntu' in image_name:
login_name = 'ubuntu'
elif 'amzn' in image_name:
login_name = 'ec2-user'
setattr(instance, 'image_name', image_name)
setattr(instance, 'login_name', login_name)
将此代码粘贴在ec2.py
的self.add_instance(instance, region)
之前,并使用相同的缩进。它获取图像名称并做一些猜测工作来定义login_name。然后你可以在剧本中使用user: "{{ec2_login_name}}"
您可以根据EC2实例标记设置变量。如果你用发行版名称标记实例,那么你可以通过group_vars
文件为每个发行版设置Ansible的ssh用户名。
group_vars
文件示例:group_vars/tag_Distro_Ubuntu.yml
---
ansible_user: ubuntu
任何标记为Distro: Ubuntu
的实例将与ubuntu
用户连接。为每个发行版标签创建一个单独的group_vars
文件以容纳其他发行版。