是否可以进行动态查找

时间:2017-06-12 16:00:51

标签: configuration ansible

我有一个环境,用户的sudo密码在几台服务器上不一样。这可以看作是一个安全功能:-D

我想在文件中保存sudo密码(在时间点放置保险库/安全性):

  • 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 }}'

但它不起作用......

如果我的想法不起作用,有没有办法像"默认"密码,只获取特定主机的密码?

感谢您的帮助和时间!

2 个答案:

答案 0 :(得分:1)

我认为您最好在需要时将密码放在单个host_vars文件中,并将默认设置放在group_vars / all中。把它全部放在Ansible Vault中。 (但是你有一个Ansible Vault的共享密码。)

我有一个名为" 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 *********************************************************************

答案 1 :(得分:1)

有方便的lookup plugins

您实际上只需用file查询替换pipe查找:

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