Ansible 如何在没有冗余代码的情况下在一个位置为所有后续主机设置变量?

Ansible 如何在没有冗余代码的情况下在一个位置为所有后续主机设置变量?,ansible,ansible-inventory,ansible-facts,Ansible,Ansible Inventory,Ansible Facts,TL/DR:我有“src_host”和“dest_host”变量,我想用它们来设置戏剧中的“-hosts:”对象。但是,我必须在“vars:”of each“-hosts:”部分下为每场比赛重新设置它们,例如src_host=“{{hostvars['localhost']['src_host']}”如何在开始时设置这两个变量而不必重置它们 我的主机文件如下所示 [wordpress] localhost ansible_user=user ansible_port=22 ansible_ssh

TL/DR:我有“src_host”和“dest_host”变量,我想用它们来设置戏剧中的“-hosts:”对象。但是,我必须在“vars:”of each“-hosts:”部分下为每场比赛重新设置它们,例如src_host=“{{hostvars['localhost']['src_host']}”如何在开始时设置这两个变量而不必重置它们

我的主机文件如下所示

[wordpress]
localhost ansible_user=user ansible_port=22 ansible_ssh_private_key_file=/home/user/.ssh/id_rsa
root_localhost ansible_user=root ansible_port=22 ansible_ssh_private_key_file=/home/user/.ssh/id_rsa

---snip---

server2.net ansible_host="server2.net" ansible_user=user ansible_port=22 ansible_ssh_private_key_file=/home/user/.ssh/id_rsa
root_server2.net ansible_host="server2.net" ansible_user=root ansible_port=22  ansible_ssh_private_key_file=/home/user/.ssh/id_rsa
我的剧本开头是这样的:

- hosts: localhost, server2.net, root_server2.net #always include "localhost" in this list because it is needed to store the variables for the src_host and dest_host
  vars:
    src_host: localhost #modify these and the host will be changed for all subsequent plays/tasks
    dest_host: server2.net #modify these and the host will be changed for all subsequent plays/tasks
    src_dump_path: /home/user/cvrt9_dump.sql #set vars for copying file
  roles:  
    - set_facts_for_db_copy

- hosts: "{{ src_host }}" 
  vars: 
    src_host: "{{ hostvars['localhost']['src_host'] }}"
    dest_host: "{{ hostvars['localhost']['dest_host'] }}"
    ---snip---
  roles:
    - dump_db
    - copy_file
等等

对于“-set_facts_for_db_copy”,我有“main.yml”,其中我设置了“src_host”和“dest_host”变量:

---
# tasks file for set_facts_for_db_copy
- name: create variables that equal src_dump_path and set src_host/dest_host
  set_fact:
    ---snip---
    src_host: "{{ src_host }}"
    dest_host: "{{ dest_host }}"
因此,我需要为所有后续的“-hosts:”设置“src_host”和“dest_host”,它们通过从“set_fact_for_db_copy”集合中的一个主机变量获取值来使用它们。正如您可能已经注意到的,我随机选择了“localhost”:

src_host: "{{ hostvars['localhost']['src_host'] }}"
dest_host: "{{ hostvars['localhost']['dest_host'] }}"
如果我没有那条线,我会得到:

user@localhost:/home/maintainer/ansible-play$ ansible-playbook -i hosts_tat-kay playbook.yml 

PLAY [localhost, server2.net, root_server2.net] **************

TASK [setup] *******************************************************************
ok: [server2.net]
ok: [root_server2.net]
ok: [localhost]

TASK [set_facts_for_db_copy : create variables that equal src_dump_path] *******
ok: [localhost]
ok: [server2.net]
ok: [root_server2.net]
ERROR! the field 'hosts' has an invalid value, which appears to include a variable that is undefined. The error was: 'src_host' is undefined

The error appears to have been in '/home/maintainer/ansible-play/playbook.yml': line 14, column 3, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


- hosts: "{{ src_host }}" 
  ^ here

现在,我可以在主机文件中设置这些变量:

[wordpress:vars]
src_host=localhost
dest_host=server2.net
但是,我仍然必须从“{hostvars['localhost']['src_host']}”等的子序列“-hosts:”playbook中的对象中引用它们。因此,我的问题是,我如何在所有后续“-hosts:”对象(如下所示)中消除这些冗余代码,同时仍然允许我在开始时更改“src_host”和“dest_host”变量一次,并让这些更改影响其余的重头戏?谢谢

    src_host: "{{ hostvars['localhost']['src_host'] }}"
    dest_host: "{{ hostvars['localhost']['dest_host'] }}"

为此,请使用库存文件,为需要变量的主机创建一个父组,如下所示

[desireenv:children]
wordpress
otherhost
etc
然后将th vars值分配给创建的新父组

[desireenv:vars]
src_host: "{{ hostvars['localhost']['src_host'] }}"
dest_host: "{{ hostvars['localhost']['dest_host'] }}"

我在的帮助下找到的一个解决方案是将其放在我的主机文件(清单文件)中

然后在ansible剧本和它所称的角色中,我不得不替换

"{{ src_host }}" 

对于“{{dest_host}}”也是如此

但是,我可以在ansible剧本中删除这些多余的代码:

src_host: "{{ hostvars['localhost']['src_host'] }}"
dest_host: "{{ hostvars['localhost']['dest_host'] }}"

如果我不必将src_主机和dest_主机更改为hostvars['localhost'],那就太好了。。。因为使用localhost似乎是任意的,如果我想用不同的src_主机和dest_主机一个接一个地运行几个ansible脚本呢?使用库存文件会将其锁定,因此这并不理想。如果没有其他人回答,我会接受这个答案,因为这是唯一有效的答案,而且从技术上讲它符合我的问题

在帮助中心的部分,有一条建议:“假装你正在和一位忙碌的同事谈话,并且必须用一句话总结你的整个问题。”。“拿去吧!”techraf感谢你的建设性批评。我删掉了一些东西,并在开头添加了一个TL/DR摘要。只是有机会回顾一下。你的答案似乎不起作用。“错误!字段‘hosts’有一个无效值,该值似乎包含一个未定义的变量。错误是:'src_host'未定义”“hosts文件中的[desireenv:children]部分和[desireenv:vars]部分是否都存在?”?我像这样运行它:ansible playbook-I hosts playbook.ymlok我让它工作了,但是我不得不在我的主机文件中有它:[wordpress]localhost server2.net[testenv:children]wordpress[testenv:vars]src_host=localhost dest_host=server2.net,然后在ansible脚本和它调用的角色中,我必须替换“{src_host}”使用“{hostvars['localhost']['src_host']}}”和同样的“{{dest_host}}”
"{{ hostvars['localhost']['src_host'] }}"
src_host: "{{ hostvars['localhost']['src_host'] }}"
dest_host: "{{ hostvars['localhost']['dest_host'] }}"