Ansible set_fact本地并在远程主机上使用

时间:2019-09-25 15:22:58

标签: ansible ansible-inventory ansible-facts

我正在尝试获取本地版本,并将其用作其他远程主机中的var

在ansible中使用set_fact模块

在本地

    - 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

在远程

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

出现以下错误:The task includes an option with an undefined variable. The error was: 'code_version'

是否有实现此目标的方法?

3 个答案:

答案 0 :(得分:2)

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

例如:

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

答案 1 :(得分:0)

您可以使用以下共享方法注册一个变量,以在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 }}"

在远程

- name: test code version
  debug:
    msg: code version is " {{ hostvars['DUMMY_HOST']['code_version'] }} "

有效。

答案 2 :(得分:0)

使用委托并在同一个剧本上运行所有任务该怎么办?我用它来将kubernetes加入集群。我将Shell命令委派给主节点,然后在剧本的其他主机上执行该命令的输出。我很确定您可以对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 }} "