我有一个在不同主机上运行不同角色的剧本。 是否可以将变量从一个主机上运行的一个角色传递到同一个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中设置teh变量db的任务如下所示:

- shell: cd /ACE/conf && grep ^db.url local1.properties | awk -F/ '{print $4}' | awk -F? '{print $1}'
  register: db

更新:在第一台主机上,值是动态的,它就像一个始终更新的配置文件。 在我使用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不能像这样使用它:

---   
- 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 /主机

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

#1楼 票数:12

这个主题很复杂,根据你的需要,有两个不同的答案。

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

例:

---
- hosts: host1
- roles:
    - role1
    - role2

目标:您想要从role2中的role1访问一些变量。

使用set_fact模块。

内部角色1:

name: save precious value
set_fact: 
  pantsu: shiroi

内部角色2:

name: Nozoki...
debug: msg="Color is {{ pantsu }}"

访问一个主机(或组)的静态变量到其他主机

例:

[group_foo]
host1
host2
[group_bar]
host3
host4

group_vars / group_foo

important_value=bla-bla-ba

目标:您想在playbook中将它用于group2。

这样做比较棘手。

在group_vars / group_bar中

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

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

#2楼 票数:6 已采纳

问题出在您的库存中。

这条信息:

fatal: [10.104.148.138] => host not found: LBL

是因为LBL是一个组而不是主机。 LBL有一个主机: 10.104.148.136

执行以下操作之一:

1.将您的库存( /etc/ansible/hosts )更改为:

LBL ansible_ssh_host=10.104.148.136
LM ansible_ssh_host=10.104.148.138

2.或者如果你真的知道你正在做什么, LBL是一个小组,你想保持这种方式然后访问变量:

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

同样,LBL是一个不是主持人的群体。 更多信息

#3楼 票数:2

这是我的解决方案。 我的任务是在两个服务器之间同步数据,我想传递服务器名称,如下所示: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_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'

(我实际上从任务中获得了一些这些来自主机变量的其他东西,但你明白了)

这是get_sync_facts角色:

---

- 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角色对应。

#4楼 票数:1

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

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

我的库存主机:

[ansible_local]
localhost

[machine1]
machine1.domain.tld

upgrade_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

#5楼 票数:0

我有一个类似的设置,其中有三个主机h1,h2,h3,并且在每个主机上我想要定义一个事实{ "important_fact": "foo" } (和bar和baz,分别)

要获取包含所有主机上所有不同important_facts的列表,您可以这样执行:

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

important_facts_list将包含[ 'foo', 'bar', 'baz' ] ,您现在可以使用with_items迭代它们。

  ask by ady8531 translate from so

未解决问题?本站智能推荐:

3回复

如何设置相对于主机的Ansible角色的变量文件?

这是我的剧本的详细信息: 剧本树 主机 play1.yml play2.yml 题 我想根据主机(play1.yml或play2.yml)对monit使用不同的变量文件。 我该怎么做? 非常感谢
2回复

Ansible - 在运行时定义库存

如果我的问题有点基础的话,我对ansible很新。 场景: 我有一些远程主机组,如[EPCs] [客户端]和[测试人员]我能够按照我希望的方式配置它们。 问题: 我需要编写一个剧本,在运行时,会在运行时向用户询问库存。 作为运行剧本的示例,应按以下方式提示用户:“输入要
1回复

Ansible-下载Java JDK-错误:任务:“命令”中指定了多个操作

Ansible:1.9.2(因此使用wget代替get_url)。 Linux CentOS 6.5 运行以下命令并获得以下错误消息: 知道我想念的是什么。 我创建的角色“ java”具有default / main.yml: 角色some_common的defau
1回复

ansible-playbook不限制主机

我有一个主机文件,指定了一个属于多个组的服务器: 在剧本中,不同的小组具有不同的角色: 我的问题是,当我去运行剧本时,尝试通过使用“ --limit”参数指定“ group”来将其限制为仅需要的“角色” 最终将对服务器运行所有播放。 为什么这样做呢? 我能否只运行与该
3回复

Ansible:如何使用不同密码的主机运行游戏?

我目前正在学习如何使用 Ansible。 现在,我有一堆服务器,无论是新的还是旧的,它们都有不同的登录名或密码,或者两者都有。 所有人都拥有运行戏剧的关键访问权限。 这是我的开始。 示例主机文件: 所以为了简单起见,我最初在所有机器上运行了一个相当于sudo apt-get update &a
1回复

Ansible-with_fileglob循环-变得_user不起作用-在源计算机上运行操作

环境是:Ansible 1.9.4 或 1.9.2,Linux CentOS 6.5 我在以下位置建立角色: $ cat角色/构建/默认值/main.yml : $ cat角色/构建/任务/main.yml 在我的工作空间中: 主机文件(清单)包含: site
3回复

在hostvars中定义的Ansible包含角色

我正在尝试执行以下操作: 在hostvars中定义适当的主机角色 创建一个角色,以仅调用与特定主机相关的角色,并且这些角色已在hostvars中的变量中定义 有没有办法做到这一点? 例如: host_vars / hostname_one / mail.yml run_all_
7回复

Ansible 最佳实践不重复共同角色

在 Ansible 最佳实践页面上: http ://docs.ansible.com/ansible/playbooks_best_practices.html#top-level-playbooks-are-separated-by-role 它显示了一个示例,其中主 playbook site