微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

多台主机上的localhost中的Ansible Perform Tasks

如何解决多台主机上的localhost中的Ansible Perform Tasks

我正在计划一个Ansible剧本,该剧本将查询Windows主机上特定.exe文件的版本号,然后在Windows主机上安装的版本与Ansible控制器Linux机器上存储的最新版本(“ localhost” ”),并将diff版本部署到Windows主机。

我的剧本看起来像:

- hosts: winClients
  gather_facts: False
  tasks:
  - name: check exe file version
    win_file_version:
      path: C:\my.exe
    register: exe_file_version
  
  - name: Set client version
    set_fact:
      winClientExeVersion: "{{ exe_file_version.win_file_version.file_version }}"

然后,在localhost上,我有每个版本的文件夹,我想在最新版本和winClients上的版本之间生成差异。版本存储在本地主机上的版本号命名的文件夹中,例如MyVersions/1.0.0.0/abc.exe,abc.dll,aaa.txt,...MyVersions/1.0.0.1/abc.exe,...等。我有一个特殊的文件MyVersions/LatestVersion/,其中始终包含最新版本。所以我需要类似的东西:

- hosts: localhost
  gather_facts: False
  tasks:
  - name: check latest version on server using PEV
    shell: peres -v /home/user/MyVersions/LatestVersion/My.exe | awk '{print $3}'
    register: latest_file_version

  - name: Set server version
    set_fact:
      serverLatestVersion: "{{ latest_file_version.stdout }}"

  - name: If versions differ,generate diff between client and latest versions to temp DiffFolder,then delete empty folders
    shell: rsync -rvcm --compare-dest=../{{hostvars.winClients.winClientExeVersion}} . ../DiffFolder && find ../DiffFolder -depth -type d -empty -delete
    args:
      chdir: /home/user/MyVersions/LatestVersion
    when: serverLatestVersion != hostvars.winClients.winClientExeVersion 

然后我使用win_copy生成的差异复制到Windows客户端。

现在,当winClients仅代表一个特定客户端时,所有这些工作正常。 我的问题是,如何对一组客户进行处理,即如果winClients代表一组而不是一台特定的计算机?当其版本号与服务器上的最新版本不同时,如何根据其先前检索的版本号分别为每个客户端生成diff(每个客户端可能安装了不同的版本)?

winClients上部将为每个客户端分配版本号,问题在于localhost任务及其when条件。

解决方法

事实证明这很简单:with_items可以解决问题,以后也可以在when中引用它。

示例:

- hosts: localhost
  gather_facts: False
  tasks:
  - name: Notify if versions differ
    debug:
      msg: "client and server versions differ: Server: {{ serverLatestVersion}},Client: {{ hostvars[item]['winClientExeVersion'] }}"
    with_items: "{{ groups['clients'] }}"
    when: serverLatestVersion != hostvars[item]['winClientExeVersion']

这将循环遍历clients组中的客户端,对于每个版本与服务器版本不同的客户端,请在debug中进行通知。 可以根据when条件,对只需要对相关客户端执行的每个任务(复制,rsync等)使用类似的方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。