Variables 将Ansible变量从一个角色(在一台主机上运行)传递到同一剧本中另一台主机上运行的另一个角色

Variables 将Ansible变量从一个角色(在一台主机上运行)传递到同一剧本中另一台主机上运行的另一个角色,variables,ansible,roles,ansible-playbook,Variables,Ansible,Roles,Ansible Playbook,我有一个剧本,在不同的主机上运行不同的角色。 是否可以将变量从一台主机上运行的一个角色传递到同一playbook运行中运行的另一台主机上的另一个角色?或者有什么解决办法 playbook host1 role1 here I get some variables: var1 var2 ...etc host2 role2 here I need to use var1 var2 ... etc from the above host/r

我有一个剧本,在不同的主机上运行不同的角色。 是否可以将变量从一台主机上运行的一个角色传递到同一playbook运行中运行的另一台主机上的另一个角色?或者有什么解决办法

playbook
   host1
     role1
       here I get some variables: var1 var2 ...etc
   host2
     role2
       here I need to use var1 var2 ... etc from the above host/role
role1中设置变量
db
的任务如下所示:

- shell: cd /ACE/conf && grep ^db.url local1.properties | awk -F/ '{print $4}' | awk -F? '{print $1}'
  register: db
---   
- name: test hostvars host1
  hosts: LBL
  tasks:
    - command: "ls /bin"
        register: ls_out

- name: test hostvars host2
  hosts: LM
  tasks:
    - debug:
        var: "{{ hostvars['LBL']['ls_out']['stdout'] }}"
更新:在第一台主机上,值是动态的,就像一个总是更新的配置文件。在我使用role1将值存储在host1上的变量中之后,我将移动到host2,运行role2并使用host1存储的变量中的值执行操作

我试过与hostvars合作:

{{ hostvars.LBL.db.stdout }}
{{ hostvars['LBL']['db'] }}
{{ hostvars['LBL']['db']['stdout'] }}
我得到一个错误:

in get_variables raise Exception("host not found: %s" % hostname) Exception: host not found: LBL
LBL存在于主机中,因为我在主机上运行第一个角色

我在一台主机上设置了一个变量,希望该变量对另一台主机可用。所有这些都在一个剧本中。能做到吗


hostvars不是这样使用它的:

- shell: cd /ACE/conf && grep ^db.url local1.properties | awk -F/ '{print $4}' | awk -F? '{print $1}'
  register: db
---   
- name: test hostvars host1
  hosts: LBL
  tasks:
    - command: "ls /bin"
        register: ls_out

- name: test hostvars host2
  hosts: LM
  tasks:
    - debug:
        var: "{{ hostvars['LBL']['ls_out']['stdout'] }}"
错误:

fatal: [10.104.148.138] => host not found: LBL
/etc/ansible/hosts

[root@NS1 ansible]# cat /etc/ansible/hosts
[LBL]
10.104.148.136
[LM]
10.104.148.138

这个话题很复杂,根据你想要什么,有两种不同的答案

访问在同一主机的另一个角色中的一个角色中定义的变量 例如:

---
- hosts: host1
- roles:
    - role1
    - role2
[group_foo]
host1
host2
[group_bar]
host3
host4
目标:您想从role2中的role1访问一些变量

使用
设置事实
模块

内部角色1:

name: save precious value
set_fact: 
  pantsu: shiroi
内部角色2:

name: Nozoki...
debug: msg="Color is {{ pantsu }}"
从一个主机(或组)到另一个主机(或组)访问静态变量 例如:

---
- hosts: host1
- roles:
    - role1
    - role2
[group_foo]
host1
host2
[group_bar]
host3
host4
组变量/组变量

important_value=bla-bla-ba
目标:您希望在group2的剧本中使用它

这样做要复杂得多

组内变量/组栏

other_var: '{{hostvars[groups["group_foo"][0]].important_value}}'

您可以使用除“0”之外的其他索引。

问题出在您的库存中

此消息:

fatal: [10.104.148.138] => host not found: LBL
是因为
LBL
是一个组而不是主机。组
LBL
中有一个主机:
10.104.148.136

执行以下操作之一:

一,。将您的库存(
/etc/ansible/hosts
)更改为:

二,。或者,如果您真的知道自己在做什么,并且
LBL
是一个组,并且您希望保持这种方式,则使用以下命令访问变量:

{{ hostvars['10.104.148.136']['db']['stdout'] }}

同样,LBL是一个组,而不是主机

这是我的解决方案。我的任务是在两台服务器之间同步数据,我希望像这样传入服务器名称:ansible playbook sync.yaml-e“source=host1 destination=host2”

以下是主要的剧本:

---

- name: get_sync_facts
  hosts: "{{ source }}"
  roles:
    - set_sync_facts

- name: sync
  hosts: "{{ destination }}" 
  roles:
    - get_sync_facts
    - sync
以下是设置同步事实角色:

---

- set_fact: src_media_dir='/some/dir/'
- set_fact: src_user='myuser'
- set_fact: src_host='1.1.1.1'
- set_fact: src_port=12345
- set_fact: src_db_user='dbuser'
- set_fact: src_db_password='something'
- set_fact: src_db_name='some_db'
---

- set_fact: src_media_dir={{ hostvars[source]['src_media_dir'] }}
- set_fact: src_user={{ hostvars[source]['src_user'] }}
- set_fact: src_host={{ hostvars[source]['src_host'] }}
- set_fact: src_port={{ hostvars[source]['src_port'] }}
- set_fact: src_db_user={{ hostvars[source]['src_db_user'] }}
- set_fact: src_db_password={{ hostvars[source]['src_db_password'] }}
- set_fact: src_db_name={{ hostvars[source]['src_db_name'] }}
(我实际上从任务中得到了一些,从主机变量中得到了一些,但你明白了)

下面是get_sync_facts角色:

---

- set_fact: src_media_dir='/some/dir/'
- set_fact: src_user='myuser'
- set_fact: src_host='1.1.1.1'
- set_fact: src_port=12345
- set_fact: src_db_user='dbuser'
- set_fact: src_db_password='something'
- set_fact: src_db_name='some_db'
---

- set_fact: src_media_dir={{ hostvars[source]['src_media_dir'] }}
- set_fact: src_user={{ hostvars[source]['src_user'] }}
- set_fact: src_host={{ hostvars[source]['src_host'] }}
- set_fact: src_port={{ hostvars[source]['src_port'] }}
- set_fact: src_db_user={{ hostvars[source]['src_db_user'] }}
- set_fact: src_db_password={{ hostvars[source]['src_db_password'] }}
- set_fact: src_db_name={{ hostvars[source]['src_db_name'] }}

你可以不用这个,直接在剧本中引用hostvars,但这似乎更容易维护,因为它与set_sync_facts角色直接对应

这是一个很老的话题,但也许对某些人会有帮助。我使用sed根据额外参数中指定的“target”获取主机名

要使用此“目标”组,该组必须仅包含1个主机名

我的目录主机:

[ansible_local]
localhost

[machine1]
machine1.domain.tld
升级_packages.yml

---
- hosts: '{{ target }}'
  sudo: yes
  tasks:
  - name: check for Debian system
    shell: /bin/false
    when: ansible_pkg_mgr != "apt"

  - name: full-upgrade all packages
    apt: update_cache=yes upgrade=full
    register: upgrade_result

- hosts: ansible_local
  tasks:
  - name: find out host from target
    shell: /bin/sed -n -e '/^\[{{ target }}\]$/,/^\[.*\]$/ { /^\[/d; /^$/d; p; }' {{ inventory_file }}
    register: target_inventory

  - name: Display all facts from target machine (change when to true if needed)
    debug: var=hostvars[target_inventory.stdout]
    when: false

  - name: Display upgrade result on ansible_local node
    debug: var=hostvars[target_inventory.stdout].upgrade_result.msg

调用:
ansible playbook./upgrade-packages.yml-e“target=machine1”-v
我有一个类似的设置,其中有三个主机h1、h2、h3,我想在每个主机上定义一个事实
{“重要事实”:“foo”}
(分别是bar和baz)

要获取包含所有主机上所有不同重要信息的列表,您可以这样做:

- set_fact:
    important_facts_list: "{{ hostvars | json('*.important_fact') }}"
  run_once: yes
  delegate_to: h1

重要事实列表
将包含
['foo'、'bar'、'baz']
,您现在可以使用
和项目对它们进行迭代

第一个示例是值分配的基本变量,它不适用于这里,因为我使用两个不同的主机。在第一台主机上,这些值是动态的,就像一个总是更新的配置文件。在我使用第一个角色将值存储在第一个主机上的变量中之后,我将移动到第二个主机,运行第二个角色,并使用host one存储的变量中的值进行处理。我在一台主机上设置了一个变量,希望该变量对另一台主机可用。所有这些都在一个剧本中。基本上两台主机都在同一个组中。您可以在一个剧本中设置事实,然后通过
hostvars:{{hostvars['serv1']['saved'u fact']}}
--name:test hostvars host1 hosts:LBL任务:-shell:echo主机名寄存器:ls_out-set_事实:ls_down={{ls_out.stdout}'-name:test hostvars host2 hosts:LM tasks:-shell:echo{{{hostvars['LBL']['ls_down']}
错误:
致命:[10.104.148.138]=>找不到主机:LBL
@ady8531,您使用set_fact错误。它不需要foo=bar符号,它需要一个dict列表。请参见此处的示例:。下面是上述代码的工作示例:感谢您提供关于如何查看shiroi pantsu的清晰建议:你能发布剧本中设置变量var1/2的部分吗
hostvars.LBL.*
应该可以工作。如果var1/2是在清单文件中定义的,那么也发布它。这是第一个角色
-name:blablashell:cd/ACE/conf&&grep^db.url local1.properties | awk-F/'{print$4}'| awk-F?'{print$1}'register:db
如果我在同一个角色中执行和回显{{do.stdout}},效果会很好。我不使用库存。在第二个角色中,如果我执行
shell:echo“{{hostvars['LBL']['db']['stdout']}”
则会出现错误“hostvars不能像这样使用它:”这是不可能的。这两项任务对我来说很好,并按预期打印出
ls\u
。发布了错误的代码还是什么。。。?请在“不工作”一词上注明,我在上面的问题中添加了该剧本的输出。Ansible版本是1.9.0.1。。。1.8.4的相同输出实际上我修改了hosts文件并添加了:
[ow.hosts]LBL LM
,它正在工作。谢谢!是否可以使用类似的东西:
与_项:{{hostvars['LBL']['db_*']}}
进行循环?示例:在LBL主机上,我存储了一些名为:db_ace、db_abc等的变量。如何调用