如何在 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.yamlgroup_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