如何通过Ansible将私有IP写入Elasticsearch配置文件?
Ansible配置Elasticsearch时获取私有IP失败的解决办法
执行Ansible剧本时,hostname -I | awk '{print $2}'命令触发用法错误,核心原因是command模块不支持shell管道语法,会把|和awk当成hostname的参数;同时模板中变量引用方式错误,且手动执行命令获取IP的方式不如利用Ansible内置facts可靠。以下是两种解决方案:
方案一:改用shell模块支持管道
修改roles/make_elasticsearch_conf/tasks/main.yml中的任务:
--- # tasks file for make_elasticsearch_conf # - name: Get private IP address ansible.builtin.shell: "hostname -I | awk '{print $2}'" register: cluster_ip - name: Create /etc/elasticsearch/elasticsearch.yml File ansible.builtin.template: src: elasticsearch.yml.j2 dest: /etc/elasticsearch/elasticsearch.yml
同时修正模板roles/make_elasticsearch_conf/templates/elasticsearch.yml.j2的变量引用:
cluster.name: {{ ansible_host }} node.name: {{ ansible_host }} network.host: {{ cluster_ip.stdout }}
注:shell模块通过系统shell执行命令,支持管道、重定向等语法;register返回的是对象,需取stdout字段获取命令输出内容。
方案二:使用Ansible内置facts(推荐)
开启gather_facts: True后,Ansible会自动收集主机IP信息,无需手动执行命令。修改任务文件,移除手动获取IP的步骤:
--- # tasks file for make_elasticsearch_conf # - name: Create /etc/elasticsearch/elasticsearch.yml File ansible.builtin.template: src: elasticsearch.yml.j2 dest: /etc/elasticsearch/elasticsearch.yml
根据需求修改模板中的IP引用:
- 取所有IPv4地址中的第二个(对应原命令逻辑):
cluster.name: {{ ansible_host }} node.name: {{ ansible_host }} network.host: {{ ansible_all_ipv4_addresses[1] }}
- 取指定网卡(如eth1)的IP:
cluster.name: {{ ansible_host }} node.name: {{ ansible_host }} network.host: {{ ansible_eth1.ipv4.address }}
注:ansible_all_ipv4_addresses是主机所有IPv4地址的列表;ansible_<网卡名>可直接获取对应网卡的IP信息,不受IP顺序变化影响,稳定性更高。
内容的提问来源于stack exchange,提问作者Red Cricket
相关产品推荐
相关产品推荐

