您可以为每个 Ansible 主机组创建和加载动态变量。您需要在库存目录中创建适当的文件。例如:假设您已使用指向相对路径 ./inventory 的 inventory 键配置您的 ansible.cfg 文件。这告诉 Ansible 它应该查看名为 ./inventory 的文件或 ./inventory 文件夹中的一系列文件以获取主机组的信息。
您只需遵循文件夹结构的适当约定,即可告诉 Ansible 为每个组加载不同的变量:
-
./inventory/group_vars: 将持有组变量。
-
./inventory/host_vars: 将保存宿主变量。
Ansible 将使用每个文件夹中的文件名来引用相应的group 或host。如果您想使用多个文件来保存所有变量,也可以使用带有组名的子目录。
您的aws_ec2.yml 文件必须位于./inventory 目录中,这一点很重要。
例如:如果您想存储适当的user 和key 配置以访问标记为Project 标记设置为stackoverflow 的EC2 实例,则需要在./inventory/group_vars/tag_Project_stackoverflow 创建一个目录一个变量文件,如下所示:
ansible_user: ec2-user
ansible_ssh_private_key_file: ~/.ssh/id_rsa
EC2 动态清单模块可以根据您的 EC2 实例的配置创建动态组。检查其documentation 以了解如何配置它。
您甚至可以使用任务动态创建这些文件。这里我创建一个新的 ec2 密钥,将其存储在本地,并创建必要的文件夹结构来保存连接信息:
- name: Create a new EC2 key
amazon.aws.ec2_key:
name: "{{ ec2_key_name }}"
register: ec2_key_output
- name: Save private key
ansible.builtin.copy:
content: "{{ ec2_key_output.key.private_key }}"
dest: "{{ ec2_key_path }}"
mode: 0600
when: ec2_key_output.changed == True
- name: Create the group_vars folder
ansible.builtin.file:
path: ./inventory/group_vars
state: directory
mode: '0755'
- name: Create the group_vars configuration file
ansible.builtin.copy:
content: |
ansible_user: "{{ ec2_user }}"
ansible_ssh_private_key_file: "{{ ec2_key_path }}"
dest: ./inventory/group_vars/tag_Project_stackoverflow
请查看Ansible's documentation regarding inventory management了解更多信息。