我在目录 /tmp/values.txt
中的每个服务器上都有一个名为 values.txt
的文件,它有一些值。我有一个 jinja
模板,我正在替换 values.txt
但问题是,当我使用 lookup
命令时,它会在 Controller 服务器而不是远程服务器中查找
这是我尝试过的:
- name: Create /etc/systemd/system/etcd.service
template:
src: etcd.service.j2
dest: /etc/systemd/system/etcd.service
vars:
value_from_file: "{{ lookup('file', '/tmp/values.txt').split('\n') }}"
vars_from_jinja: [SELF_NAME, SELF_IP, NODE_1_NAME, NODE_1_IP, NODE_2_NAME, NODE_2_IP, NODE_3_NAME, NODE_3_IP, NODE_4_NAME, NODE_4_IP]
my_dict: "{{ dict(vars_from_jinja|zip(value_from_file)) }}"
我怎样才能远程完成这个任务?或者是否有另一种解决方法来将值替换为 jinja 模板?
PS:我无法将 values.txt
提取到 Controller ,因为每个服务器中的 values.txt
内容略有不同。
有人可以帮帮我吗?
最佳答案
查找在 Controller 上找到文件(或流)。如果你的文件在远程节点上,你不能使用查找
Lookup plugins are an Ansible-specific extension to the Jinja2 templating language. You can use lookup plugins to access data from outside sources (files, databases, key/value stores, APIs, and other services) within your playbooks. Like all templating, lookups execute and are evaluated on the Ansible control machine. Ansible makes the data returned by a lookup plugin available using the standard templating system. You can use lookup plugins to load variables or templates with information from external sources.
试试 cat 文件:
- name: read the values.txt
shell: cat /tmp/values.txt
register: data
- name: Create /etc/systemd/system/etcd.service
template:
src: etcd.service.j2
dest: /etc/systemd/system/etcd.service
vars:
value_from_file: "{{ data.stdout_lines }}"
vars_from_jinja: [ SELF_NAME, SELF_IP, NODE_1_NAME, NODE_1_IP, NODE_2_NAME, NODE_2_IP, NODE_3_NAME, NODE_3_IP, NODE_4_NAME, NODE_4_IP ]
my_dict: "{{ dict(vars_from_jinja|zip(value_from_file)) }}"
关于Ansible - 如何在远程服务器中使用查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65034541/