访问其他主机的字典变量

imp1sh

假设我有这个hosts.yml

alpinehosts:
  hosta:
  hostb:

这些是./host_vars/hosta.yml中的玉a属植物的hostvars(反向代理)

rproxyitems:
- rproxyfqdn: "pageA.com"
  comment: "This ia website A"
  rproxyaltfqdn: "alternativeA1.com alternativeA2.com"
  rproxytarget: "http://destinationA"
- rproxyfqdn: "pageB.com"
  comment: "This ia website B"
  rproxyaltfqdn: "alternativeB1.com alternativeBb.com"
  rproxytarget: "http://destinationB"

在主机上,请求被重定向到我想让nginx具有server_name,就像在反向代理中一样。写一次,用很多。

那是我的目标webhost ./host_vars/hostb.yml(Web服务器请求被重定向到)

nginxvhost:
- fqdn: pageA.com
  servername: {{ hostvars[hosta].rproxyitems[rproxyfqdn[pageA.com]] }}
  serveraltname: {{ hostvars[hosta].rproxyitems[rproxyfqdn[pageA.com]].rproxyaltfqdn }}
  comment: "This is website A target webservice"
- fqdn: pageB.com
  servername: {{ hostvars[hosta].rproxyitems[rproxyfqdn[pageB.com]] }}
  serveraltname: {{ hostvars[hosta].rproxyitems[rproxyfqdn[pageB.com]].rproxyaltfqdn }}
  comment: "This is website B target webservice"

我的方法行不通,但希望您能明白。如何仅访问对方的主机(hostA)词典变量元素?我当然可以手动输入值,但是我不喜欢这个概念。我想定义一次,并经常使用。

对于错误请看截图。错误信息

β.εηοιτ.βε

好吧,您已经很接近解决方案了,因为它hostvars[hosta].rproxyitems肯定表明您在正确的轨道上。
但是,由于pageA.compageB.com是列表的值而不是键或字典的值,因此这使您的任务更加复杂。

针对您的问题的两种解决方案:

  1. 通过实际的列表结构,您可以使用Jinja过滤器selectmatchAnsible测试来匹配列表中具有以下特定元素的元素rproxyfqdnrproxyitems | selectattr('rproxyfqdn', 'match', 'pageA.com')这将返回一个列表,因此,如果您确定始终只有一个匹配项,则只需添加first过滤器即可。
    鉴于剧本
    - hosts: hostb
      gather_facts: no
    
      tasks:
        - debug:
            msg: "{{ nginxvhost }}"
          vars:
            nginxvhost:
              - fqdn: pageA.com
                servername: "{{ (hostvars['hosta'].rproxyitems | selectattr('rproxyfqdn', 'match', 'pageA.com') | first).rproxytarget }}"
                serveraltname: "{{ (hostvars['hosta'].rproxyitems | selectattr('rproxyfqdn', 'match', 'pageA.com') | first).rproxyaltfqdn }}"
                comment: "This is website A target webservice"
              - fqdn: pageB.com
                servername: "{{ (hostvars['hosta'].rproxyitems | selectattr('rproxyfqdn', 'match', 'pageB.com') | first).rproxytarget }}"
                serveraltname: "{{ (hostvars['hosta'].rproxyitems | selectattr('rproxyfqdn', 'match', 'pageB.com') | first).rproxyaltfqdn }}"
                comment: "This is website B target webservice"
    
    总结一下:
    PLAY [hostb] *****************************************************************************************************
    
    TASK [debug] *****************************************************************************************************
    ok: [hostb] => {
        "msg": [
            {
                "comment": "This is website A target webservice",
                "fqdn": "pageA.com",
                "serveraltname": "alternativeA1.com alternativeA2.com",
                "servername": "http://destinationA"
            },
            {
                "comment": "This is website B target webservice",
                "fqdn": "pageB.com",
                "serveraltname": "alternativeB1.com alternativeBb.com",
                "servername": "http://destinationB"
            }
        ]
    }
    
    PLAY RECAP *******************************************************************************************************
    hostb                      : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    
  2. 您还可以稍微更改数据结构,并使用字典而不是列表,从而更轻松地访问特定条目:
    rproxyitems:
      pageA.com:
        comment: "This ia website A"
        rproxyaltfqdn: "alternativeA1.com alternativeA2.com"
        rproxytarget: "http://destinationA"
      pageB.com:
        comment: "This ia website B"
        rproxyaltfqdn: "alternativeB1.com alternativeBb.com"
        rproxytarget: "http://destinationB"
    
    这使我们可以直接访问rproxyitems['pageA.com']并简化剧本:
    - hosts: hostb
      gather_facts: no
    
      tasks:
        - debug:
            msg: "{{ nginxvhost }}"
          vars:
            nginxvhost:
              - fqdn: pageA.com
                servername: "{{ hostvars['hosta'].rproxyitems['pageA.com'].rproxytarget }}"
                serveraltname: "{{ hostvars['hosta'].rproxyitems['pageA.com'].rproxyaltfqdn }}"
                comment: "This is website A target webservice"
              - fqdn: pageB.com
                servername: "{{ hostvars['hosta'].rproxyitems['pageB.com'].rproxytarget }}"
                serveraltname: "{{ hostvars['hosta'].rproxyitems['pageB.com'].rproxyaltfqdn }}"
                comment: "This is website B target webservice"
    
    这将给出与上述相同的概述。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Ansible:如何访问其他主机的变量?

来自分类Dev

从其他脚本访问变量

来自分类Dev

从其他类访问变量?

来自分类Dev

访问其他表单变量

来自分类Dev

从其他文件访问变量

来自分类Dev

访问Angular中其他组件的变量

来自分类Dev

从其他类访问变量(C ++)

来自分类Dev

如何从其他方法访问变量

来自分类Dev

从Unity中的其他场景访问变量

来自分类Dev

如何访问其他类中的变量

来自分类Dev

C ++从其他函数访问变量

来自分类Dev

从Fragment访问其他Fragment变量或元素

来自分类Dev

在其他函数中访问变量

来自分类Dev

其他游戏中的访问变量 - Ansible

来自分类Dev

无法从其他设备访问本地主机站点

来自分类Dev

通过主机从其他lxc容器访问lxc容器服务

来自分类Dev

PHP如何从类内部的其他变量访问变量?

来自分类Dev

PHP如何从类内部的其他变量访问变量?

来自分类Dev

使用变量访问其他文件中的单元格

来自分类Dev

从其他对象直接访问@observable变量

来自分类Dev

访问在其他控制器中定义的变量

来自分类Dev

访问Java中的其他方法变量?

来自分类Dev

从其他函数PHP访问局部变量

来自分类Dev

为什么php访问其他页面中定义的变量?

来自分类Dev

从其他配置文件访问配置变量

来自分类Dev

如何从其他进程访问全局静态变量

来自分类Dev

静态变量不能被其他类访问

来自分类Dev

静态变量的地址可以被其他文件访问

来自分类Dev

如何从python中的其他函数访问变量