在 Ansible 剧本中通过别名获取主机的连接选项

在 Ansible 剧本中通过别名获取主机的连接选项

我有一个角色,竞选localhost

---
- hosts: localhost
  tasks:
    ...
    - name: Push code to target host
      shell: scp -P "{{ ansible_port }}" "{{ home_dir }}/{{ project }}.tgz" root@{{ target_server }}:/home/teamcity/

我使用 target_server 环境变量运行此剧本,该变量在另一个子任务中用作目标主机:

ansible-playbook \
-i 'ansible/hosts' \
--extra-vars "target_server=stage" \
ansible/deliver.yml

有没有办法获取由服务器别名scp描述的ansible/hosts作为环境变量传递的连接选项?目的不是传递ansible_port或其他连接选项两次,而是从已经传递的服务器别名中获取target_server

换句话说,如果我运行 playbook --extra-vars "target_server=stage",如何获取ansible_hostnameansible_port供主机'stage'用作 scp 连接选项?

答案1

由于您正在针对本地主机运行剧本,所以我假设源文件位于那里。

您可以使用更多适合的模块来复制文件,例如复制模块

- hosts: target_server
  tasks:
  - name: Push code via copy
    copy:
      src: "{{ home_dir }}/{{ project }}.tgz"
      dest: "/home/teamcity/"

如果要在目标服务器上提取档案,可以使用取消存档模块

  - name: Push code via unarchive
    unarchive:
      src: "{{ home_dir }}/{{ project }}.tgz"
      dest: "/home/teamcity/"

如果源文件位于不同的服务器上,则可以使用同步模块从服务器 A 复制到 B:

  - name: Push code from remote server
    synchronize:
      src: "{{ home_dir }}/{{ project }}.tgz"
      dest: "/home/teamcity/"
    delegate_to: src_server

如果你坚持使用带有 scp 的 shell 模块,则可以使用hostvars多变的

- hosts: localhost
  - name: Push code to target host
    shell: scp -P "{{ hostvars['target_server']['ansible_port'] }}" "{{ home_dir }}/{{ project }}.tgz" root@{{ hostvars['target_server']['ansible_hostname'] }}:/home/teamcity/

相关内容