2017-06-12 100 views
0

我有一個環境,用戶的sudo密碼在多臺服務器上不一樣。這可以被看作是一種安全功能:-D是否可以做動態查詢

我想保存須藤密碼(在時間點保管庫/安全除外)在文件中:

  • host1.sudopwd
  • host2.sudopwd
  • ...
  • hostn.sudopwd
我ansible劇本

,我使用類似的東西:

--- 
- hosts: all 
tasks: 
- include: '{{ inventory_hostname }}' 
    vars: 
    ansible_become: true 
    ansible_become_user: root 
    ansible_become_pass: "{{ lookup('file','{{ inventory_hostname }}.sudopwd') }}" 

而且,如果我爲每個主機創建一個文件,它就會運行良好。 現在我怎樣才能讓它更「動態」?

假設我有一個名爲searchsudopwd的腳本,它是一個簡單的bash腳本(事實上可以是任何語言)。

#!/usr/bin/env bash 
if [[ "$1" == "host1" ]]; then 
    echo "pwd1" 
elif [[ "$1" == "host2" ]]; then 
    echo "pwd2" 
else 
    echo "default pwd" 
fi 

如何與ansible使用它呢?我的劇本中需要改變什麼才能使其工作?

我已經試過類似:

--- 
- hosts: all 
tasks: 
- include: '{{ inventory_hostname }}' 
    vars: 
    ansible_become: true 
    ansible_become_user: root 
    ansible_become_pass: "{{ item }}" 
    with_lines: searchsudopwd '{{ inventory_hostname }}' 

但它不工作...

如果我的想法是不行的,是有辦法,有一個像一個「默認」的密碼,並只獲得特定主機的密碼?

謝謝你的幫助和時間!

回答

1

我認爲你最好將密碼放在單獨的host_vars文件中,需要時將默認值放在group_vars/all中。把它放在Ansible Vault中。 (但你有Ansible庫共享密碼。)

我有一個名爲「ML01」,所以我改變了你的腳本宿主:

$ cat /home/jscheible/searchsudopwd 
#!/usr/bin/env bash 
if [[ "$1" == "ml01" ]]; then 
    echo "pwd1" 
elif [[ "$1" == "host2" ]]; then 
    echo "pwd2" 
else 
    echo "default pwd" 
fi 

要調用與密碼的本地程序,只需調用在delegate_to: localhost一齣戲:

$ cat show_pwd 
--- 
- hosts: all 
    connection: ssh 
    gather_facts: false 
    tasks: 
    - name: Do passwd lookup 
    command: /home/jscheible/searchsudopwd {{ inventory_hostname }} 
    delegate_to: localhost 
    register: result 

    - name: Show results 
    debug: 
     var: result.stdout 
    delegate_to: localhost 

這結果對我的測試:

$ ansible-playbook show_pwd 

PLAY [all] ********************************************************************* 

TASK [Do passwd lookup] ******************************************************** 
changed: [al01 -> localhost] 
changed: [ml01 -> localhost] 

TASK [Show results] ************************************************************ 
ok: [al01 -> localhost] => { 
    "result.stdout": "default pwd" 
} 
ok: [ml01 -> localhost] => { 
    "result.stdout": "pwd1" 
} 

PLAY RECAP ********************************************************************* 
+0

謝謝:-)在我不知道的「host_vars」!我已經測試過它,並且正如我期待的那樣工作! 我沒有檢查答案的其他部分,但與host_vars/group_vars解決方案相比,它看起來「太複雜了」 –

+0

一旦我有足夠的聲望,我會+1你的答案! –

1

有方便的lookup plugins

實際上,你可以只是pipe查找替換你file查找:

ansible_become_pass: "{{ lookup('pipe','/path_on_ansible_machine/searchsudopwd '+inventory_hostname) }}"