即使跳过了play,也无法保存寄存器值!

74次阅读
没有评论

问题描述

在使用Ansible时遇到了一个问题。在一个play中,根据环境变量的不同,需要以不同的方式获取IP地址。如果环境是”prod”,第一个play会获取IP地址并将其存储在寄存器”kafkaip”中。然后在第二个play中,通过设置when条件,该play会被跳过。但是尽管第二个play被跳过了,寄存器的值却被清空了,导致set_fact操作失败。用户想知道是否有办法解决这个问题。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在Ansible中,即使任务被跳过,寄存器变量仍然会被填充。你可以通过以下方式解决这个问题:
1. 将命令存储在一个变量中,然后执行它。根据环境的不同,设置不同的命令。
2. 使用set_fact设置kafka_host变量。

以下是一个示例的解决方案:

- name: "Set command for env <> QA"
  set_fact:
    get_ip_command: >-
      aws cloudformation describe-stacks
      --stack-name "{{ stack_kafka }}"
      --query "Stacks[*].Outputs[?OutputKey=='KafkaLink'].OutputValue"
  when:
    - stack_kafka is defined
    - ( deployment_env != "QA" )
- name: "Set command for env = QA"
  set_fact:
    get_ip_command: >-
      aws ec2 describe-instances
      --filter "Name=tag:StackName,Values=KafkaCluster"
      --query 'Reservations[].Instances[].PrivateIpAddress'
      --output text
  when:
    - stack_kafka is defined
    - ( deployment_env == "QA" )
- name: Get the Kafka InstancesPrivateIps
  shell: "{{ get_ip_command }}"
  register: kafkaip
  when: stack_kafka is defined
- name: Register kafka_host
  set_fact:
    kafka_host: "{{ kafkaip.stdout }}"
  when: stack_kafka is defined

在上面的示例中,我们首先根据环境的不同设置了两个不同的命令,分别存储在get_ip_command变量中。然后,使用shell模块执行get_ip_command命令,并将结果存储在kafkaip寄存器中。最后,使用set_fact设置kafka_host变量。

请注意,示例中的命令可能需要根据你的实际情况进行修改。你可以将命令存储在vars或inventory中,以使playbook更简洁。

注意1:在你的QA命令中有一个输出重定向,这将阻止按照你的期望捕获输出,我在示例中省略了它。
注意2:我使用了set_fact来创建命令变量,但你也可以将其放在vars或inventory中,以使playbook更简洁。

正文完