Amazon ec2 基于ec2发行版动态设置ansible playbook用户变量

Amazon ec2 基于ec2发行版动态设置ansible playbook用户变量,amazon-ec2,ansible,Amazon Ec2,Ansible,我正在创建一个ansible playbook,它通过一组AWS EC2主机并安装一些基本的软件包。在playbook可以执行任何任务之前,playbook需要使用正确的用户:{{userXXX}登录到每个主机(2种类型的发行版AWS Linux或Ubuntu),这是我不太确定如何传递正确的用户登录的部分,它可能是ec2用户或Ubuntu - name: setup package agent hosts: ec2_distros_hosts user: "{{ ansibl

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

   - name: setup package agent 
  hosts: ec2_distros_hosts


  user: "{{ ansible_user_id }}"

  roles:
    - role: package_agent_install
我假设
ansible\u user\u id
将基于ansible中的保留变量工作,但这里的情况并非如此。我不想为不同的发行版创建两个单独的playbook,是否有一个优雅的解决方案来动态查找用户登录名并用作
用户:


以下是未知用户ansible playbook-i inventory/ec2.py agent.yml的失败cmd。您有几种方法来完成任务:

---
ansible_user: ubuntu
1.在每个主机上创建具有相同名称的ansible用户 如果你有一个,你可以在剧本中使用
user:ansible\u user

2.用合适的登录名标记每个主机 您可以为每个ec2主机创建一个标记(例如,
login\u name
),并在其中指定用户。对于Ubuntu主机–Ubuntu,对于AWS Linux主机–ec2用户。 这样做之后,您可以在您的剧本中使用
用户:“{{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)

将此代码粘贴到
self.add_instance(instance,region)
ec2.py
前面,使用相同的缩进。它获取图像名称并进行一些猜测来定义登录名。然后您可以在您的剧本中使用
用户:“{{ec2\u login\u name}}”

您可以根据ec2实例标记设置变量。如果使用发行版名称标记实例,则可以通过
group\u vars
文件为每个发行版设置Ansible的ssh用户名

示例
group\u vars
与您的剧本相关的Ubuntu文件:
group\u vars/tag\u Distro\u Ubuntu.yml

---
ansible_user: ubuntu

任何标记为
Distro:Ubuntu
的实例都将与
Ubuntu
用户连接。为每个发行版标签创建一个单独的
group\u vars
文件以容纳其他发行版。

ec2.py脚本是否返回有关发行版的任何信息?否则,这将是不可能的,因为Ansible需要访问主机才能了解发行版。您可以将变量
ansible\u user
设置为每个主机的用户来创建主机变量。但是这种方法是没有意义的,因为如果你需要覆盖每台主机的每台主机,那么动态清单脚本就没有多大意义。我使用你的选项2,这就是我需要让ec2.py生成新标签作为ec2_tag_login_name,为
ubuntu
ec2 user
创建新标签作为
login_name
,并且我能够正确设置
用户:{{ec2_tag u login_name}
。其他小问题,可能与本文无关,我无法让任何“ec2用户”用户建立连接<代码>安乐:[ec2 XXX.compute-1.amazonaws.com]=>SSH错误:权限被拒绝(公钥)。有时使用-vvv重新运行命令会很有用,它会打印SSH调试输出以帮助诊断问题。使用
-vvv
选项运行playbook以检查用于连接的用户名是否是您想要的,并检查该用户的SSH连接。顺便说一句,如果答案有帮助,请将其标记为接受。