如何从文件中读取特定行并将其注册为变量并将其传递给ansible中的另一个角色

如何从文件中读取特定行并将其注册为变量并将其传递给ansible中的另一个角色,ansible,Ansible,我正在使用ansible角色创建azure映像,以下是我的剧本示例: - hosts: localhost gather_facts: yes roles: - azure_vmcreator - hosts: azure_vms gather_facts: no roles: - vm_software - download_Artifact - hosts: localhost gather_facts: yes roles:

我正在使用ansible角色创建azure映像,以下是我的剧本示例:


- hosts: localhost
  gather_facts: yes
  roles: 
   - azure_vmcreator

- hosts: azure_vms
  gather_facts: no
  roles:
    - vm_software
    - download_Artifact

- hosts: localhost
  gather_facts: yes
  roles: 
    - azure_imagecreator

我们的想法是在download_Artifact角色中下载一个f.exe文件并将其安装到vm中,安装时f.exe将创建一个product.id文件。我想读取该文件的第二行并将其注册为变量,比如image_prefix,这样我就可以在azure_imagecreator角色中使用image_prefix变量并创建一个图像,将其添加到前缀中


我是ansible新手,有人能帮我解决这个问题吗?

在剧本中访问另一台主机上设置的变量不是很简单。一般工作流如下所示:

download_Artifact
中,使用
set_fact
模块将相关行保存为
host_var
。(
set_fact
始终将变量存储为主机变量)

您可以使用
和_file
将文件内容放入变量,然后使用jinja获取文件的第二行:

    - name: Print Second line of a File
      debug:
        msg: "{{ item.split("\n")[1] }}"
      with_file:
        - "/filepath"
jinja2代码段所做的是在换行符上拆分文件,将其转换为一个行数组,然后访问第二行(数组索引从0开始)

您需要使用
set\u fact
模块将该字符串保存到变量中,而不是打印内容

然后,在第三个剧本中,将设置为参数的hostvar传递给角色。Use可以使用
hostvars..
访问另一台主机的hostvars

如果事先不知道主机名,可以在playbook执行期间使用ansibles特殊变量
groups
获取名称。然后,调用看起来有点像这样(虽然尚未对此进行测试,并且假设您的角色接受名为
image\u prefix
)的变量):


谁应该从文件中读取一行并将其发送到变量?@VinayUpadhyay我已经更新了答案,告诉您如何获取文件的内容。
- hosts: localhost
  gather_facts: yes
  roles: 
    - name: azure_imagecreator
      azure_imagecreator:
        image_prefix: hostvars[groups.azure_vms[0]].image_prefix