如何在ansible playbook中动态使用AWS实例的IP地址而不使用ansible playbook将其保存在外部文件中

how to use AWS instance's IP address dynamically in an ansible playbook without saving it in an external file using ansible playbook

我在 EC2 上有 2 个集群,1 个是 Cassandra(4 节点集群),另一个是 Kafka(3 节点集群)。我有一个在 AWS 实例上部署我的微服务的剧本,对于那个微服务剧本,我维护了一个清单文件,它将我的 cassandra/kafka 主机的 IP 地址存储在一个变量中,如下所示:

cassandra_hosts = 'X.X.X.X:9042,X.X.X.X:9042,X.X.X.X:9042,X.X.X.X:9042'
kafka_host = 'X.X.X.X:9092,X.X.X.X:9092,X.X.X.X:9092,X.X.X.X:9092'

微服务剧本大致如下:

- hosts: dynamic_hosts
  become: yes
  become_user: xxxxxx
  become_method: sudo 

  vars:
   ansible_connection: "{{ connection_type }}"
   ansible_ssh_user: "{{ ssh_user_name }}"
   ansible_ssh_private_key_file: "{{ ssh_private_key_file }}"

  tasks:

    - name: Register Service as an Upstart
      shell: chdir="{{dest_location}}" "./{{upstartscript}}.sh" " -p  {{service_port}}  -u  {{service_uri}}  -v  {{service_version}}  -c  {{cassandra_hosts}}  -k  {{kafka_host}}  -l  {{log_level}}"
      register: escript

    - name: Register Service as an Upstart Output
      debug: 
       msg : "{{ escript.stdout }}"

上面的代码是我检索我在清单文件中硬编码的 IP 地址的方式(在代码的第一部分中提到)。

我想要实现的是,如何在我的剧本中动态存储我的 AWS 实例的 IP 地址并在我的微服务剧本中使用它而不将 IP 地址存储在清单文件中,任何建议

P.S。如果需要,请您提出任何问题,这是我的第一个问题,在此先感谢

你好, 我还需要获取kafka集群的输出,但是kafka集群在AWS控制台中以不同的方式输出如下:

|||                                                           Outputs                                                           
|||
||+---------------------------+-----------------+---------------------------
----------------------------------------------------+||
|||        Description        |    OutputKey    |                                  
OutputValue                                  |||
||+---------------------------+-----------------+---------------------------
----------------------------------------------------+||
|||  IP of Primary Seed Node  |  ZookeeperLink  |  
X.X.X.X:2181,X.X.X.X:2181,X.X.X.X:2181,X.X.X.X:2181     
|||
|||  IP of Primary Seed Node  |  Node2DNSName   |  ip-X-X-X-
X.ec2.internal                                                 |||
|||  IP of Primary Seed Node  |  KafkaLink      |  
X.X.X.X:9092,X.X.X.X:9092,X.X.X.X:9092,X.X.X.X:9092     
|||
|||  IP of Primary Seed Node  |  Node3DNSName   |  ip-X-X-X-
X.ec2.internal                                                |||
|||  IP of Primary Seed Node  |  Node4DNSName   |  ip-X-X-X-
X.ec2.internal                                                |||
|||  IP of Primary Seed Node  |  Node1DNSName   |  ip-X-X-X-
X.ec2.internal  

我只想输出 KafkaLink 部分的 IP,对此有任何帮助:

    X.X.X.X:9092,X.X.X.X:9092,X.X.X.X:9092,X.X.X.X:9092

我尝试了以下命令,但它不起作用:

 aws cloudformation describe-stacks --stack-name IngKafkaCluster --query 'Stacks[].Outputs[].OutputValue' --output text

我在上面的命令中得到以下输出,这没有错,但不完全是我想要的:

X.X.X.X:2181,X.X.X.X:2181,X.X.X.X:2181,X.X.X.X:2181        ip-X-X-X-X.ec2.internal    X.X.X.X:9092,X.X.X.X:9092,X.X.X.X:9092,X.X.X.X:9092        ip-X-X-X-X.ec2.internal   ip-X-X-X-X.ec2.internal   ip-X-X-X-X.ec2.internal

要获取 AWS EC2 的 IP 地址,您可以尝试以下命令,它将 AWS 输出提取到您想要的文件中:

 aws cloudformation describe-stacks --stack-name IngCassandraCluster --query 'Stacks[].Outputs[].OutputValue' --output text --> kunaltest.text

您可以在 :shell:" 下将此行添加到您的剧本中,以使其执行您想要的操作。