Ansible - 查找hostvar的最大值和该主机的名称

时间:2015-05-15 14:47:39

标签: amazon-ec2 ansible

我有一个主机变量的库存增加:

Classifier cls1 = (Classifier) weka.core.SerializationHelper.read("C:\\Users\\.....\\FileToImport.model");

我想找到[nodes] node_0 id=0 node_1 id=1 的最高值和拥有它的主机。我找到了在带有for循环(Ansible - Find max value and run action based on a result only on one host)的节点上进行搜索的另一个答案,但我需要能够将此作为本地操作,因为我在ec2上选择了节点启动的值。 / p>

1 个答案:

答案 0 :(得分:2)

我的解决方案:

- name: Find max id host
  set_fact: id_max_host={{ groups['nodes'] | sort('id' | int) | last }}

- name: Find max id
  set_fact: id_max={{ hostvars[id_max_host]['id'] }}

它获取组节点中的主机列表,按hostvar'id'排序(它转换为int,因为它们通常是字符串),然后只选择该排序列表的最后一个。请注意,如果有多个相同的值,它将选择最后一个,而不是第一个。我使用唯一的ID,所以没关系。

这给了我最大的id号和拥有它的主机的名字。它适用于本地和远程任务。我可以使用在远程主机上发现的事实来查看该主机是否应该运行分配给最大ID的任务:

- name: Some actions based on a result of previous tasks
  action: # Run some actions
  when:  id_max_host == inventory_hostname

或者我可以使用它来确保我的所有新启动的实例都在ec2上标记,其ID从id_max + 1开始并增加:

- name: tag instances
  ec2_tag: region="{{ aws_region }}" resource="{{ item.id }}" aws_access_key="{{ aws_access_key }}" aws_secret_key="{{ aws_secret_key }}"
  args:
    tags:
      Name: "node_{{ item.ami_launch_index | int + id_max | int + 1 }}"
      id: "{{ item.ami_launch_index | int + id_max | int + 1 }}"
      with_items: ec2Create.instances