Amazon ec2 -根据ec2发行版动态设置ansible-playbook用户变量



我正在创建一个可行的剧本,通过一组AWS EC2主机并安装一些基本包。在playbook可以执行任何任务之前,playbook需要用正确的user: {{ userXXX }}登录到每个主机(2种类型的发行版AWS Linux或Ubuntu),这是我不太确定如何通过正确的用户登录的部分,它将是ec2-userubuntu

   - 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.pyself.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文件以容纳其他发行版。

最新更新