Deployment

通過 Ansible playbook 中的別名獲取主機的連接選項

  • May 7, 2019

我有一個角色,反對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 env var 執行這個劇本,它在另一個子任務中用作目標主機:

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

有沒有辦法獲取連接選項scp,由伺服器別名描述ansible/hosts,作為 env var 傳遞?目標不是ansible_port兩次傳遞或其他連接選項,而是從已經傳遞的伺服器別名中獲取target_server

換句話說,如果我執行 playbook ,--extra-vars "target_server=stage"我怎樣才能讓host用作 scp 連接選項?ansible_hostname``ansible_port``'stage'

由於您正在針對 localhost 執行劇本,因此我假設源文件位於那裡。

您可以使用更多合適的模組來複製文件,例如複製模組

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

如果要在目標伺服器上提取存檔,可以使用unarchive 模組一步完成:

 - 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/

引用自:https://serverfault.com/questions/966138