指定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.cfgconfiguration文件中也有一些规定,但是现在还没有实现( 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 

每个组,在组variablesgroup_vars/<groupname>/ansible.yml 组名 group_vars/<groupname>/ansible.yml

 ansible_sudo_pass: "foobar" 

每组encryptionansible-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')