可以将ansible任务视为字典

时间:2017-11-06 03:58:41

标签: ansible

我有两个不同的任务(可选)值。根据Playbook的运行位置,可选值是否存在。目前我根据when子句执行了两个任务副本,但这很容易出错,因为有问题的任务有很多其他强制配置,并且混合中丢失了一个可选条目。

- name: Launch configuration for prod
  ec2_lc:
    region: "{{ aws_region }}"
    name: "lc-{{ env }}-{{ type }}-{{ ansible_date_time.iso8601_micro|replace(\":\", \"-\") }}"
    image_id: "{{ ami_id }}"
    key_name: "{{ aws_key_pair_name }}"
    security_groups: "{{ sec_group_instance.group_id }}"
    instance_type: "{{ instance_type }}"
    instance_profile_name: "{{ env }}-{{ type }}"
    volumes:
      - device_name: /dev/xvda
        volume_size: 20
        device_type: gp2
        delete_on_termination: true
  register: lcprod
  tags:
    - asg
  when:
    env == "prod"

- name: Launch configuration for non-prod
  ec2_lc:
    region: "{{ aws_region }}"
    name: "lc-{{ env }}-{{ type }}-{{ ansible_date_time.iso8601_micro|replace(\":\", \"-\") }}"
    image_id: "{{ ami_id }}"
    key_name: "{{ aws_key_pair_name }}"
    security_groups: "{{ sec_group_instance.group_id }}"
    instance_type: "{{ instance_type }}"
    spot_price: "{{ admin_bid_price }}"
    instance_profile_name: "{{ env }}-{{ type }}"
    volumes:
      - device_name: /dev/xvda
        volume_size: 20
        device_type: gp2
        delete_on_termination: true
  register: lcdev
  tags:
    - asg
  when:
    env != "prod"

- name: Set lc for stg or prod
  set_fact: lc="{{ lcprod }}"
  when:
    env == "prod"

- name: Set lc for none stg or prod
  set_fact: lc="{{ lcdev }}"
  when:
    env != "prod"

理想情况下,此示例可以折叠为单个任务(即没有后续的set_fact任务),并且spot_price条目是否存在,具体取决于env。

我尝试将spot_price设置为null或“”但没有成功。

1 个答案:

答案 0 :(得分:0)

对我而言,似乎你想要:

spot_price: "{{ (env == "prod") | ternary(omit, admin_bid_price) }}"

请参阅:Ansible Filters - Omitting ParametersOther Useful Filters