我有一个角色,竞选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_hostname
并ansible_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/