Ansible set_事实本地并在远程主机上使用

Ansible set_事实本地并在远程主机上使用,ansible,ansible-inventory,ansible-facts,Ansible,Ansible Inventory,Ansible Facts,我试图在本地主机上获取一个版本,并将其用作其他远程主机上的var 在ansible中使用set_事实模块 论地方 - name: Set code version shell: wget -O - -o /dev/null wget -O - -o /dev/null https://repo1.maven.org/maven2/org/brutusin/wava/maven-metadata.xml | grep -Po '(?<=<version>)(

我试图在本地主机上获取一个版本,并将其用作其他远程主机上的var

在ansible中使用set_事实模块

论地方

    - name: Set code version
      shell:  wget -O - -o /dev/null wget -O - -o /dev/null https://repo1.maven.org/maven2/org/brutusin/wava/maven-metadata.xml | grep -Po '(?<=<version>)([0-9\.]+(-SNAPSHOT)?)' | sort --version-sort -r| head -n 1
      register: shell_output

    - name: set version
      set_fact:
        code_version: "{{ shell_output.stdout }}"
        debug: var=code_version
        run_once: true
获取以下错误:
任务包含一个带有未定义变量的选项。错误是:“代码版本”


如果有任何方法可以实现这一点,您可以使用下面的共享方法注册一个变量,以便在Ansible中的不同播放之间保持–不同的目标主机

在本地

- name: Set code version
  shell:  wget -O - -o /dev/null wget -O - -o /dev/null https://repo1.maven.org/maven2/org/brutusin/wava/maven-metadata.xml | grep -Po '(?<=<version>)([0-9\.]+(-SNAPSHOT)?)' | sort --version-sort -r| head -n 1
  register: shell_output

- name: Register dummy host with variable
  add_host:
    name: "DUMMY_HOST"
    code_version: "{{ shell_output.stdout }}"

它可以工作。

您可以使用
hostvars
变量访问其他主机中定义的变量

例如:

- debug:
    msg: "{{ hostvars['localhost']['code_version'] }}"

使用委托并在同一剧本上运行所有任务怎么样?我用它把kubernetes连接到一个集群。我将一个shell命令委托给主节点,然后在playbook的其他主机上执行该命令的输出。我很确定您可以向localhost执行相同的委托:

hosts: all
tasks:
    - name: Set code version
      shell:  wget -O - -o /dev/null wget -O - -o /dev/null https://repo1.maven.org/maven2/org/brutusin/wava/maven-metadata.xml | grep -Po '(?<=<version>)([0-9\.]+(-SNAPSHOT)?)' | sort --version-sort -r| head -n 1
      register: shell_output
      delegate_to: localhost

    - name: set version
      set_fact:
        code_version: "{{ shell_output.stdout }}"
        cacheable: yes

    - name: test code version
      debug:
        msg: code version is " {{ code_version }} "
主机:所有
任务:
-名称:设置代码版本

shell:wget-O--O/dev/null wget-O--O/dev/nullhttps://repo1.maven.org/maven2/org/brutusin/wava/maven-metadata.xml |grep-Po'(?不需要定义虚拟主机。该变量已在
hostvars['host\u what\u created\u variable']中可用)
。在特定情况下,我会牢记这一点。但在实际的OPs案例中,为什么不直接使用在localhost上注册的var?我还设想了一些针对“所有”组的播放可能产生的副作用。@AlassaneNdiaye,是的。在编写任务时,我将本地和远程视为两个不同的目标主机组,并且像我过去在这样一个用例中所做的那样写下答案。
- debug:
    msg: "{{ hostvars['localhost']['code_version'] }}"
hosts: all
tasks:
    - name: Set code version
      shell:  wget -O - -o /dev/null wget -O - -o /dev/null https://repo1.maven.org/maven2/org/brutusin/wava/maven-metadata.xml | grep -Po '(?<=<version>)([0-9\.]+(-SNAPSHOT)?)' | sort --version-sort -r| head -n 1
      register: shell_output
      delegate_to: localhost

    - name: set version
      set_fact:
        code_version: "{{ shell_output.stdout }}"
        cacheable: yes

    - name: test code version
      debug:
        msg: code version is " {{ code_version }} "