【问题标题】:set ansible-playbook user variable dynamically based on the ec2 distros根据 ec2 发行版动态设置 ansible-playbook 用户变量
【发布时间】:2019-11-17 20:51:45
【问题描述】:

我正在创建一个通过一组 AWS EC2 主机并安装一些基本包的 ansible 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

【问题讨论】:

  • ec2.py 脚本是否返回有关发行版的任何信息?如果没有,这是不可能的,因为 Ansible 需要访问主机来了解发行版。您可以创建 hosts_vars 并将变量 ansible_user 设置为每个主机的用户。但是这种做法是没有意义的,因为如果您需要每个 host_vars 覆盖每个主机,那么动态清单脚本没有太大意义。

标签: amazon-ec2 ansible


【解决方案1】:

你有几种方法来完成你的任务:

1。在每个主机上创建具有相同名称的 ansible 用户

如果你有,你可以在你的剧本中使用user: ansible_user

2。用合适的 login_name 标记每个主机

您可以为每个 ec2 主机创建一个标签(例如login_name)并在其中指定用户。对于 Ubuntu 主机 - ubuntu,对于 AWS Linux 主机 - ec2-user。 完成后,您可以在 playbook 中使用 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)

将此代码粘贴到 self.add_instance(instance, region) 之前的 ec2.py 中,缩进相同。它获取图像名称并做一些猜测工作来定义 login_name。然后你可以在你的剧本中使用user: "{{ec2_login_name}}"

【讨论】:

  • 我正在使用您的选项 2,这就是我需要让 ec2.py 生成新标记为 ec2_tag_login_namelogin_name 创建一个新标记为 @987654329 @ 或 ec2-user 并且我能够正确设置 user: {{ ec2_tag_login_name }}。其他小问题,可能与这篇文章无关,我无法让任何“ec2-user”用户建立连接。 atal: [ec2-XXX.compute-1.amazonaws.com] => SSH Error: Permission denied (publickey). It is sometimes useful to re-run the command using -vvvv, which prints SSH debug output to help diagnose the issue.
  • 使用 -vvvv 选项运行 playbook 以检查用于连接的用户名是否是您想要的,并检查该用户的 ssh 连接。顺便说一句,如果答案有帮助,请将其标记为已接受。
【解决方案2】:

您可以根据 EC2 实例标签设置变量。如果您使用发行版名称标记实例,那么您可以通过 group_vars 文件为每个发行版设置 Ansible 的 ssh 用户名。

相对于您的剧本的 Ubuntu 示例 group_vars 文件:group_vars/tag_Distro_Ubuntu.yml

---
ansible_user: ubuntu

任何标记为Distro: Ubuntu 的实例都将与ubuntu 用户连接。为每个发行版标签创建一个单独的 group_vars 文件以适应其他发行版。

【讨论】:

    猜你喜欢
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    相关资源
    最近更新 更多