2017-08-03 278 views
0

我的Ansible playbook部署到數據庫和web服務器,我需要在它們之間使用一些共享變量。從這個questionanswer幾乎給了我什麼,我需要:Ansible playbook在主機之間生成和共享變量

--- 
- hosts: all 
    tasks: 
    - set_fact: my_global_var='hello' 

- hosts: db 
    tasks: 
    - debug: msg={{my_global_var}} 

- hosts: web 
    tasks: 
    - debug: msg={{my_global_var}} 

然而,在我的情況的變量是通過在每個運行的劇本隨機生成一個密碼,然後必須共享:

--- 
- hosts: all 
    tasks: 
    - name: Generate new password 
    shell: "tr -dc _[:alnum:] < /dev/urandom | head -c${1:-20}" 
    register: new_password  
    - name: Set password as fact 
    set_fact: 
     my_global_var: "{{ new_password.stdout }}" 

- hosts: db 
    tasks: 
    - debug: msg={{my_global_var}} 

- hosts: web 
    tasks: 
    - debug: msg={{my_global_var}} 

以上示例不起作用,因爲現在重新生成密碼,並且all主機中的每個主機完全不同(除非您巧妙地爲您的db和web服務器使用相同的機器/主機名)。

理想情況下,我不希望有人不得不記得在命令行上使用--extra-vars傳遞一個好的隨機密碼,它應該由劇本生成和處理。

Ansible中是否有任何建議的機制來在劇本中創建變量,並讓劇本中的所有主機都可以訪問?

回答

1

你可能想嘗試生成本地主機上的傳球,然後將其複製到所有其他主機:

--- 
- hosts: localhost 
    tasks: 
    - name: Generate new password 
    shell: "tr -dc _[:alnum:] < /dev/urandom | head -c${1:-20}" 
    register: new_password  

- hosts: all 
    tasks: 
    - name: Set password as fact 
    set_fact: 
     my_global_var: "{{ hostvars['localhost'].new_password.stdout }}" 

- hosts: db 
    tasks: 
    - debug: msg={{my_global_var}} 

- hosts: web 
    tasks: 
    - debug: msg={{my_global_var}} 
1

只需設置run_once標誌在你的任務:

- hosts: all 
    tasks: 
    - name: Generate new password 
    shell: "tr -dc _[:alnum:] < /dev/urandom | head -c${1:-20}" 
    run_once: True 
    register: new_password 

    - name: Set password as fact 
    set_fact: 
     my_global_var: "{{ new_password.stdout }}" 

然後此密碼將只生成一次

+1

在這種情況下,'my_global_var'只能用於單個主機(首先在播放中)。 –

+0

你是對的,謝謝,我調整了'run_once'只在pw代中運行。 – ProfHase85