根据ec2发行版动态设置ansible-playbook用户varialbe

时间:2016-07-06 01:17:30

标签: amazon-ec2 ansible ansible-playbook

我正在创建一个通过一组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

2 个答案:

答案 0 :(得分:2)

您有多种方法可以完成任务:

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

如果您有,可以在剧本中使用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)

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

答案 1 :(得分:0)

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

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

---
ansible_user: ubuntu

标记为Distro: Ubuntu的所有实例都将与ubuntu用户建立关联。为每个发行版标记创建一个单独的group_vars文件以容纳其他发行版。