首页 > 解决方案 > 如何在构建期间通过ansible访问打包机(IP /主机)

问题描述

我正在尝试使用 packer 和 ansible integration Provisioner 使用 GCP 构建我的应用程序。但在构建过程中,我需要执行一些 curl 命令,但我无法找到如何执行相同操作。

我已经尝试过“localhost”,然后是一些 ansible 变量,例如“{{ ansible_host }}”(返回不起作用的 127.0.0.1)和“{{ ansible_default_ipv4.address }}”(未找到变量)

我在 yml.j2 文件中使用这些。这可能是问题的原因。

错误 --> 使用“ansible_host”测试

[0;32m    googlecompute: TASK [deploy-XXXXX : Create the XXXXX collection] ***************************[0m
[0;32m    googlecompute: fatal: [localhost]: FAILED! => {"changed": false, "content": "", "msg": "Status code was -1 and not [200]: Request failed: <urlopen error [Errno 111] Connection refused>", "redirected": false, "status": -1, "url": "http://127.0.0.1:8765/api/v1/collections/XXXXX"}[0m
[0;32m    googlecompute:    to retry, use: --limit @/deploy-XXXXX.retry[0m
[0;32m    googlecompute:[0m
[0;32m    googlecompute: PLAY RECAP *********************************************************************[0m
[0;32m    googlecompute: localhost                  : ok=2    changed=1    unreachable=0    failed=1[0m

使用“ansible_default_ipv4.address”进行测试

[0;32m    googlecompute: TASK [deploy-XXXXX : copy environment specific variables] *********************[0m
[0;32m    googlecompute: fatal: [localhost]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'ansible_default_ipv4' is undefined"}[0m
[0;32m    googlecompute:    to retry, use: --limit @/deploy-XXXXX.retry[0m
[0;32m    googlecompute:[0m
[0;32m    googlecompute: PLAY RECAP *********************************************************************[0m
[0;32m    googlecompute: localhost                  : ok=0    changed=0    unreachable=0    failed=1[0m
[0;32m    googlecompute:[0m

这里是剧本片段

- name: Validate server runing
  uri:
    url: "http://{{ ansible_default_ipv4.address }}:{{ port }}/validate"
    method: PUT
    body_format: json
    body: "{\"test\":\"validate\"}"
    status_code: 200
    headers:
      Content-Type: "application/json"

标签: ansiblepacker

解决方案


我能够通过将 delegate_to: default 添加到任务来克服这个问题。例如

- name: Validate server runing
  uri:
    url: "http://{{ ansible_default_ipv4.address }}:{{ port }}/validate"
    method: PUT
    body_format: json
    body: "{\"test\":\"validate\"}"
    status_code: 200
    headers:
      Content-Type: "application/json"
  delegate_to: default

推荐阅读