如何在 Ansible Dynamic Inventory EC2 中设置用户名
How to Set UserNames in Ansible Dynamic Inventory EC2
我有一个简单的 AWS 服务器 Ansible 动态清单,如下所示。
---
plugin: aws_ec2
regions:
- eu-west-2
keyed_groups:
- key: tags.Name
hostnames:
# A list in order of precedence for hostname variables.
- ip-address
compose:
ansible_host: _Applications_
ansible_user: "'ubuntu'"
这很好用,除了我还有另一个 Redhat 实例。
这意味着当我尝试在所有主机上执行一个简单的 ping
命令时,它失败了,因为用户名 ubuntu
仅在其中一台服务器上有效。
有没有办法设置我的清单文件的组,以便我可以根据它的标签或其他内容为特定组添加 ec2-user
用户名。
我可以使用我的静态清单轻松地做到这一点,但我不确定如何使用动态清单来做到这一点。
我尝试将我的 Ansible 清单设置为环境变量
export ANSIBLE_INVENTORY=~/Users/inventory
并将我的 aws_ec2.yaml
与包含我的不同组的组 vars 目录一起放置在清单目录中,每个不同组中都有默认用户名
username: ubuntu
username: ec2-user
然后这样设置我的库存文件
compose:
ansible_user: "{{ username }}"
但是当 Ansible 尝试连接时,它使用的是 admin
用户名,而不是我的组变量中设置的用户名。
有没有办法设置连接到不同类型服务器所需的不同用户名?
根据 constructed 插件的示例,您可以使用 keyed_group
功能通过 ansible_distribution
:
创建组
keyed_groups:
# this creates a group per distro (distro_CentOS, distro_Debian) and assigns the hosts that have matching values to it,
# using the default separator "_"
- prefix: distro
key: ansible_distribution
然后在groups_vars/distro_Ubuntu.yaml
和group_vars/distro_RedHat.yaml
里面设置ansible_user
。
另外根据文档,这需要事实缓存才能运行(否则 Ansible 在处理 keyed_groups
设置时不知道 ansible_distribution
的值)。
我目前无法访问 AWS,但这是我在本地测试所有内容的方式。给定如下所示的库存:
$ tree inventory
inventory/
├── 00-hosts.yaml
└── 10-constructed.yaml
其中 inventory/00-hosts.yaml
看起来像:
all:
hosts:
host0:
ansible_host: localhost
而 inventory/10-constructed.yaml
看起来像:
plugin: constructed
strict: false
groups:
ipmi_hosts: ipmi_host|default(false)
keyed_groups:
- prefix: "distro"
key: ansible_distribution
而 ansible.cfg
看起来像:
[defaults]
inventory = inventory
enable_plugins = constructed
gathering = smart
fact_caching = jsonfile
fact_caching_connection = ./.facts
我第一次运行这个剧本:
- hosts: all
gather_facts: true
tasks:
- debug:
var: group_names
调试任务的输出是:
TASK [debug] ******************************************************************************************************************************************************************************************************
ok: [host0] => {
"group_names": [
"ungrouped"
]
}
但是由于之前的剧本 运行 执行的事实收集和缓存,我第二次 运行 它的输出是:
TASK [debug] ******************************************************************************************************************************************************************************************************
ok: [host0] => {
"group_names": [
"distro_Fedora"
]
}
类似地,在第一个 playbook 运行 ansible-inventory --graph
输出之前:
@all:
|--@ungrouped:
| |--host0
但是在 运行 执行一次剧本后,我得到:
@all:
|--@distro_Fedora:
| |--host0
|--@ungrouped:
我已将这些全部打包到 an example repository。
我有一个简单的 AWS 服务器 Ansible 动态清单,如下所示。
---
plugin: aws_ec2
regions:
- eu-west-2
keyed_groups:
- key: tags.Name
hostnames:
# A list in order of precedence for hostname variables.
- ip-address
compose:
ansible_host: _Applications_
ansible_user: "'ubuntu'"
这很好用,除了我还有另一个 Redhat 实例。
这意味着当我尝试在所有主机上执行一个简单的 ping
命令时,它失败了,因为用户名 ubuntu
仅在其中一台服务器上有效。
有没有办法设置我的清单文件的组,以便我可以根据它的标签或其他内容为特定组添加 ec2-user
用户名。
我可以使用我的静态清单轻松地做到这一点,但我不确定如何使用动态清单来做到这一点。
我尝试将我的 Ansible 清单设置为环境变量
export ANSIBLE_INVENTORY=~/Users/inventory
并将我的 aws_ec2.yaml
与包含我的不同组的组 vars 目录一起放置在清单目录中,每个不同组中都有默认用户名
username: ubuntu
username: ec2-user
然后这样设置我的库存文件
compose:
ansible_user: "{{ username }}"
但是当 Ansible 尝试连接时,它使用的是 admin
用户名,而不是我的组变量中设置的用户名。
有没有办法设置连接到不同类型服务器所需的不同用户名?
根据 constructed 插件的示例,您可以使用 keyed_group
功能通过 ansible_distribution
:
keyed_groups:
# this creates a group per distro (distro_CentOS, distro_Debian) and assigns the hosts that have matching values to it,
# using the default separator "_"
- prefix: distro
key: ansible_distribution
然后在groups_vars/distro_Ubuntu.yaml
和group_vars/distro_RedHat.yaml
里面设置ansible_user
。
另外根据文档,这需要事实缓存才能运行(否则 Ansible 在处理 keyed_groups
设置时不知道 ansible_distribution
的值)。
我目前无法访问 AWS,但这是我在本地测试所有内容的方式。给定如下所示的库存:
$ tree inventory
inventory/
├── 00-hosts.yaml
└── 10-constructed.yaml
其中 inventory/00-hosts.yaml
看起来像:
all:
hosts:
host0:
ansible_host: localhost
而 inventory/10-constructed.yaml
看起来像:
plugin: constructed
strict: false
groups:
ipmi_hosts: ipmi_host|default(false)
keyed_groups:
- prefix: "distro"
key: ansible_distribution
而 ansible.cfg
看起来像:
[defaults]
inventory = inventory
enable_plugins = constructed
gathering = smart
fact_caching = jsonfile
fact_caching_connection = ./.facts
我第一次运行这个剧本:
- hosts: all
gather_facts: true
tasks:
- debug:
var: group_names
调试任务的输出是:
TASK [debug] ******************************************************************************************************************************************************************************************************
ok: [host0] => {
"group_names": [
"ungrouped"
]
}
但是由于之前的剧本 运行 执行的事实收集和缓存,我第二次 运行 它的输出是:
TASK [debug] ******************************************************************************************************************************************************************************************************
ok: [host0] => {
"group_names": [
"distro_Fedora"
]
}
类似地,在第一个 playbook 运行 ansible-inventory --graph
输出之前:
@all:
|--@ungrouped:
| |--host0
但是在 运行 执行一次剧本后,我得到:
@all:
|--@distro_Fedora:
| |--host0
|--@ungrouped:
我已将这些全部打包到 an example repository。