指定Ansible的sudo密码
如何以非交互方式为Ansible指定sudo密码?
我正在运行Ansible这样的剧本:
ansible-playbook playbook.yml -i inventory.ini --user=username --ask-sudo-pass
但我想这样运行:
ansible-playbook playbook.yml -i inventory.ini --user=username
–sudo-pass = 12345
有没有办法? 我想尽可能自动化我的项目部署。
您可以通过--extra-vars "name=value"
在命令行上传递variables。 Sudo密码variables是ansible_sudo_pass
。 所以你的命令看起来像:
ansible-playbook playbook.yml -i inventory.ini --user=username \ --extra-vars "ansible_sudo_pass=yourPassword"
2017年更新 :Ansible 2.2.1.0现在使用var ansible_become_pass
。 要么似乎工作。
文档 强烈build议不要以明文forms设置sudo密码,而是在运行ansible-playbook
时在命令行上使用--ask-sudo-pass
2016更新:
Ansible 2.0(不是100%的时候)标记了--ask-sudo-pass
作为弃用。 这个文档现在推荐使用--ask-become-pass
来代替,同时在你的整个剧本中同时使用sudo
。
可能是这样做的最好方法 – 假设你不能使用scottod提供的NOPASSWD解决scheme,就是将Mircea Vutcovici的解决scheme与Ansible vault结合使用。
例如,你可能有一个像这样的剧本:
- hosts: all vars_files: - secret tasks: - name: Do something as sudo service: name=nginx state=restarted sudo: yes
这里我们包含一个名为secret
的文件,它将包含我们的sudo密码。
我们将使用ansible-vault创build此文件的encryption版本:
ansible-vault create secret
这将要求您input密码,然后打开您的默认编辑器来编辑文件。 你可以把你的ansible_sudo_pass
放在这里。
例如: secret
:
ansible_sudo_pass: mysudopassword
保存并退出,现在你有一个encryption的secret
文件,Ansible能够在你运行你的手册时解密。 注意:您可以使用ansible-vault edit secret
编辑文件(并input创build文件时使用的密码)
难题的最后一部分是给Ansible提供一个--vault-password-file
,它将用来解密你的secret
文件。
创build一个名为vault.txt
的文件,并在其中放置您在创buildsecret
文件时使用的密码。 密码应该是一个string存储在文件中的一行。
从Ansible文档:
..确保文件的权限是这样的,没有其他人可以访问您的密钥,不要将您的密钥添加到源代码pipe理
最后:你现在可以用类似的东西来运行你的手册
ansible-playbook playbook.yml -u someuser -i hosts --sudo --vault-password-file=vault.txt
以上是假定以下目录布局:
. |_ playbook.yml |_ secret |_ hosts |_ vault.txt
您可以在这里阅读有关Ansible Vault的更多信息: https ://docs.ansible.com/playbooks_vault.html
看看代码( runner/__init__.py
),我想你可以在你的清单文件中设置它:
[whatever] some-host ansible_sudo_pass='foobar'
似乎在ansible.cfg
configuration文件中也有一些规定,但是现在还没有实现( constants.py
)。
我不认为有理由让你在标志中指定一个密码。 在configuration中可能会有一些地方可以设置,但这会使整体使用安全性较差,不会被推荐。
你可以做的一件事就是在目标机器上创build一个用户,授予他们无密码的sudo权限给所有的命令或者一个受限制的命令列表。
如果你运行sudo visudo
并input如下所示的行,那么当用户运行类似sudo service xxxx start
时,用户的“privilegedUser”不需要input密码:
%privilegedUser ALL= NOPASSWD: /usr/bin/service
您可以一次设置一个组或所有服务器的密码:
[all:vars] ansible_sudo_pass=default_sudo_password_for_all_hosts [group1:vars] ansible_sudo_pass=default_sudo_password_for_group1
我正在把头发撕掉,现在我发现了一个解决办法,
每个包含sudo密码的主机1个encryption文件
的/ etc / ansible /主机:
[all:vars] ansible_ssh_connection=ssh ansible_ssh_user=myuser ansible_ssh_private_key_file=~/.ssh/id_rsa [some_service_group] node-0 node-1
那么你为每个主机创build一个encryption的var文件就像这样:
ansible-vault create /etc/ansible/host_vars/node-0
与内容
ansible_sudo_pass: "my_sudo_pass_for_host_node-0"
如何组织保险库密码(通过–ask-vault-passinput)或由cfg组织,取决于您
基于此我怀疑你可以只encryption整个主机文件…
sudo密码存储为名为ansible_sudo_pass
的variables。 你可以用几种方法设置这个variables:
每台主机,在您的库存主机文件 ( inventory/<inventoryname>/hosts
)
[server] 10.0.0.0 ansible_sudo_pass=foobar
每个组在库存组文件 ( inventory/<inventoryname>/groups
)
[server:vars] ansible_sudo_pass=foobar
每个组,在组variables ( group_vars/<groupname>/ansible.yml
组名 group_vars/<groupname>/ansible.yml
)
ansible_sudo_pass: "foobar"
每组encryption ( ansible-vault create group_vars/<groupname>/ansible.yml
)
ansible_sudo_pass: "foobar"
您可以使用将您的密码编码到encryption保险库中的安全保险库。 之后,您可以在剧本中使用保险柜中的variables。
一些关于安全保险库的文件:
http://docs.ansible.com/playbooks_vault.html
我们正在使用它作为每个环境的保险库。 要编辑保险箱,我们的命令如下:
ansible-vault edit inventories/production/group_vars/all/vault
如果你想打电话给Vaultvariables,你必须使用带有如下参数的剧本:
ansible-playbook -s --vault-password-file=~/.ansible_vault.password
是的,我们以纯文本forms在本地目录中存储保险库密码,但不像每个系统的存储根密码那样危险。 根密码位于Vault文件中,或者可以将其用作用户/组的sudoers文件。
我build议在服务器上使用sudoers文件。 以下是组pipe理员的示例:
%admin ALL=(ALL) NOPASSWD:ALL
Ansible vault在这里已经被提出了几次,但是我更喜欢git-crypt来encryption我的剧本中的敏感文件。 如果你使用git来保存你的剧本,那很简单。 我发现的问题是,我不可避免地遇到了要encryption的文件的encryption副本,并且在工作之前必须解密它。 git-crypt提供更好的工作stream程IMO。
https://github.com/AGWA/git-crypt
使用这个,你可以把你的密码放在你的剧本中,并把你的剧本标记为.gitattributes中的encryption文件,如下所示:
my_playbook.yml filter = git-crypt diff = git-crypt
您的手册将在github上透明encryption。
那么你只需要在你使用的主机上安装encryption密钥来运行,或者按照文档中的说明使用gpg进行设置。 有一个很好的转发gpg密钥的问答,例如你的ssh-agent在这里转发ssh密钥: https : //superuser.com/questions/161973/how-can-i-forward-a-gpg-key-via-ssh-agent
如果您习惯于将密码保存为纯文本文件,则另一种select是使用带有–extra-vars参数的JSON文件(确保从源代码pipe理中排除该文件):
ansible-playbook --extra-vars "@private_vars.json" playbook.yml
Ansible从1.3开始支持这个选项 。
伙计们,很简单,只添加在variables文件中:
例如:Vim group_vars / all
Ansible_connection:ssh Ansible_ssh_user:rafael Ansible_ssh_pass:password123 Ansible_become_pass:password123
你可以像这样在hosts文件中写入你的playbook的sudo密码
[host-group-name] host-name:port ansible_sudo_pass =' your-sudo-password '
在您的inventory.ini中,类似于:
hostname ansible_ssh_host=ip [all] hostname [all:vars] ansible_connection=ssh ansible_ssh_user=root ansible_ssh_pass=12345
你可以像下面那样使用sshpass工具,
$ sshpass -p“你的通行证”无效模式-m模块-a参数-i库存–ask-sudo-pass
我们也可以使用EXPECT BLOCK来产生bash,并根据您的需求进行定制
- name: Run expect to INSTALL TA shell: | set timeout 100 spawn /bin/sh -i expect -re "$ " send "sudo yum remove -y xyz\n" expect "$ " send "sudo yum localinstall -y {{ rpm_remotehost_path_for_xyz }}\n" expect "~]$ " send "\n" exit 0 args: executable: /usr/bin/expect
只需用--extra-vars "become_pass=Password"
调用你的剧本--extra-vars "become_pass=Password"
become_pass =('ansible_become_password','ansible_become_pass')