Ansible自动化执行不同VM上Docker容器命令的配置问题
实现Ansible按虚拟机分组执行Docker容器命令
我想自动化一个Ansible Playbook,让它在部署于不同服务器的Docker容器中执行指定命令。比如有两台VM(vm1和vm2),需要在vm1上执行command 1和command 2,在vm2上执行command 3和command 4。当前的循环逻辑不对,得修改成每台虚拟机逐个执行对应命令。现有配置如下:
现有配置文件
commands.yml
commands: - group: vm1 commands: - command 1 - command 2 - group: vm2 commands: - command 3 - command 4
Ansible Playbook(当前版本)
- name: Deploy flex Docker image on GCP VM hosts: gcp_vms become: yes gather_facts: false vars_files: - vars.yml tasks: - name: Read commands from configuration file include_vars: file: commands.yml name: command_list - name: Run the commands community.docker.docker_container_exec: container: flex command: "{{ item.command }}" loop: "{{ [command_list.commands].commands }}"
inventory.ini
[gcp_vms] vm1 ansible_host=ip vm2 ansible_host= ip ; vm3 ansible_host= ip
解决方案
要实现按虚拟机分组执行对应命令,需要调整循环逻辑,匹配当前主机的分组命令,具体修改如下:
修改后的Ansible Playbook
- name: Deploy flex Docker image on GCP VM hosts: gcp_vms become: yes gather_facts: false vars_files: - vars.yml tasks: - name: Read commands from configuration file include_vars: file: commands.yml name: command_list - name: Run commands for current VM community.docker.docker_container_exec: container: flex command: "{{ item }}" loop: "{{ command_list.commands | selectattr('group', 'equalto', inventory_hostname) | map(attribute='commands') | first }}"
逻辑说明
- 筛选当前主机的命令组:用
selectattr('group', 'equalto', inventory_hostname)从command_list.commands中选出和当前主机名(inventory_hostname)匹配的组 - 提取命令列表:用
map(attribute='commands')取出该组下的命令数组,再用first获取数组内容(因为筛选后只会有一个匹配的组) - 循环执行命令:直接循环命令列表,每个
item就是要执行的命令,无需再取item.command
这样Playbook在vm1上运行时,只会执行command 1和command 2;在vm2上运行时,只会执行command 3和command 4,实现了按虚拟机逐个执行对应命令的需求。
内容的提问来源于stack exchange,提问作者believer
相关产品推荐
相关产品推荐

