我正在创建一个通过一组AWS EC2主机并安装一些基本软件包的ansible 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
答案 0 :(得分:2)
您有多种方法可以完成任务:
如果您有,可以在剧本中使用user: ansible_user
。
您可以为每个ec2主机创建一个标记(例如login_name
),并在其中指定用户。对于Ubuntu主机 - ubuntu,适用于AWS Linux主机 - ec2-user。
执行此操作后,您可以在您的剧本中使用user: "{{ec2_tag_login_name}}"
- 这将使用来自主机的login_name标记的用户名。
似乎没有合适的方法可以从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
文件以容纳其他发行版。