2017-06-12 72 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) }}" 
相关问题