问题描述
在使用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更简洁。
正文完