为Ansible指定sudo密码

为Ansible指定sudo密码,ansible,Ansible,如何以非交互方式为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** my_playbook.yml filter=g

如何以非交互方式为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**
 my_playbook.yml filter=git-crypt diff=git-crypt
[host-group-name]
host-name:port ansible_sudo_pass='*your-sudo-password*'
$ ansible-playbook -i /tmp/hosts pb.yml -e@<(asp)
但我想这样运行它:

$ ansible-playbook playbook.yml -i inventory.ini \
    --user=username --ask-sudo-pass
$ ansible-playbook playbook.yml -i inventory.ini \
    --user=username` **--sudo-pass=12345**
 my_playbook.yml filter=git-crypt diff=git-crypt
[host-group-name]
host-name:port ansible_sudo_pass='*your-sudo-password*'
$ ansible-playbook -i /tmp/hosts pb.yml -e@<(asp)
有办法吗?我希望尽可能地自动化项目部署。

查看代码(),我认为您可以在清单文件中设置它:

[whatever]
some-host ansible_sudo_pass='foobar'

ansible.cfg
config文件中似乎也有一些规定,但现在还没有实现()。

我认为ansible不会让您按照自己的意愿在标志中指定密码。 配置中可能有一些地方可以设置,但这会使使用ansible的总体安全性降低,因此不建议这样做

您可以做的一件事是在目标计算机上创建一个用户,并向他们授予所有命令或受限命令列表的无密码sudo权限

如果您运行
sudo visudo
并输入如下行,则用户“privilegedUser”在运行类似
sudo service xxxx start的操作时不必输入密码:

%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密码,而是在运行
ansible playbook


2016年更新:


Ansible 2.0(非100%时)标记为
——询问sudo pass
是否已弃用。现在建议使用
--ask been pass
,同时在您的剧本中使用
sudo
替换为
been

,这可能是最好的方法-假设您不能使用scottod提供的NOPASSWD解决方案,那么将Mircea Vutcovici的解决方案与

例如,您可能有这样的剧本:

- hosts: all

  vars_files:
    - secret

  tasks:
    - name: Do something as sudo
      service: name=nginx state=restarted
      sudo: yes
这里我们包含一个名为
secret
的文件,其中将包含我们的sudo密码

我们将使用ansible vault创建此文件的加密版本:

ansible-vault create secret
这将要求您输入密码,然后打开默认编辑器编辑文件。您可以将您的
ansible\u sudo\u通行证
放在这里

e、 g.:
秘密

ansible_sudo_pass: mysudopassword
保存并退出,现在您有了一个加密的
secret
文件,Ansible可以在您运行playbook时解密该文件。注意:您可以使用
ansible vault edit secret
编辑文件(并输入创建文件时使用的密码)

最后一个难题是为Ansible提供一个
--vault密码文件
,它将使用该文件解密您的
机密
文件

创建一个名为
vault.txt
的文件,并在其中输入创建
secret
文件时使用的密码。密码应该是一个字符串,作为单行存储在文件中

从Ansible文档:

。。确保对该文件的权限使其他人无法访问您的密钥,并且不要将您的密钥添加到源代码管理

最后:您现在可以使用以下内容运行您的剧本

ansible-playbook playbook.yml -u someuser -i hosts --sudo --vault-password-file=vault.txt 
以上假设的目录布局如下:

.
|_ playbook.yml
|_ secret
|_ hosts
|_ vault.txt

您可以在此处阅读有关Ansible Vault的更多信息:

您可以通过
--extra vars“name=value”
在命令行上传递变量。Sudo密码变量是ansible\u Sudo\u pass
。因此,您的命令如下所示:

ansible-playbook playbook.yml -i inventory.ini --user=username \
                              --extra-vars "ansible_sudo_pass=yourPassword"
2017年更新:Ansible 2.2.1.0现在使用var
Ansible\u Been\u pass
。这两种方法似乎都有效。

您可以使用ansible vault,它会将您的密码编码到加密的vault中。之后,您可以在剧本中使用来自vault的变量

有关ansible vault的一些文档:

我们将其用作每个环境的vault。要编辑vault,我们有以下命令:
ansible vault编辑库存/生产/组变量/全部/vault

如果要调用vault变量,则必须使用ansible playbook,其参数如下:
ansible剧本-s--vault密码文件=~/.ansible\u vault.password

是的,我们将vault密码以纯文本形式存储在本地目录中,但它不像存储每个系统的根密码那样危险。根密码位于vault文件中,或者您可以像sudoers文件一样为您的用户/组使用它

我建议在服务器上使用sudoers文件。下面是组管理员的示例:

%admin ALL=(ALL)NOPASSWD:ALL

我正为这件事焦头烂额,现在我找到了一个解决方案,它满足了我的需要:

每台主机1个包含sudo密码的加密文件

/etc/ansible/hosts:

[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
然后为每个主机创建一个加密的var文件,如下所示:

ansible-vault create /etc/ansible/host_vars/node-0
ansible-playbook --ask-vault-pass -e@<PATH_TO_VAULT_FILE> <PLAYBOOK_FILE>
心满意足

ansible_sudo_pass: "my_sudo_pass_for_host_node-0"
如何组织保险库密码(通过--询问保险库通行证)或通过cfg由您决定


基于此,我怀疑您可以只加密整个hosts文件…

如果您喜欢将密码保存在纯文本文件中,另一个选项是使用带有--extra vars参数的JSON文件(请确保将该文件从源代码管理中排除):


.

Ansible vault在这里已经被建议过好几次了,但我更喜欢git crypt来加密我剧本中的敏感文件。如果你用git来保存你的ansible剧本,那很简单。我在ansible vault中发现的问题是,我最终不可避免地会遇到我想要处理的文件的加密副本,并且必须先对其进行解密才能工作
git-crypt
提供了更好的工作流程

使用此功能,您可以将密码放在playbook的var中,并在
.gittributes
中将playbook标记为加密文件,如下所示:

$ ansible-playbook playbook.yml -i inventory.ini \
    --user=username --ask-sudo-pass
$ ansible-playbook playbook.yml -i inventory.ini \
    --user=username` **--sudo-pass=12345**
 my_playbook.yml filter=git-crypt diff=git-crypt
[host-group-name]
host-name:port ansible_sudo_pass='*your-sudo-password*'
$ ansible-playbook -i /tmp/hosts pb.yml -e@<(asp)
您的剧本将在Github上透明加密。然后,您只需在用于运行ansible的主机上安装加密密钥,或者按照文档中的说明使用
gpg
进行设置

有一个
ansible-playbook -i inventory copyTest.yml
$ ansible-playbook -i /tmp/hosts pb.yml \
   -e@<(echo "ansible_sudo_pass: $(lpass show folder1/item1 --password)")
$ cat ~/.bashrc
alias asp='echo "ansible_sudo_pass: $(lpass show folder1/item1 --password)"'
$ ansible-playbook -i /tmp/hosts pb.yml -e@<(asp)
[all:vars]
ansible_ssh_user=ansible
ansible_ssh_private_key_file=home/user/.ssh/mykey
[group]
192.168.0.50 ansible_sudo_pass='{{ myserver_sudo }}'

ansible-vault create mypasswd.yml
ansible-vault edit mypasswd.yml
myserver_sudo: mysecretpassword
ansible-playbook -i inv.ini my_role.yml --ask-vault --extra-vars '@passwd.yml'
tasks:
 - name: Restart apache service
   service: name=apache2 state=restarted
   become: yes
   become_user: root
{{ lookup('community.general.passwordstore', 'Server1/User')}}"
---
   servers:
     hosts:
       server1:
         ansible_become_pass: "{{ lookup('community.general.passwordstore', 'Server1/User')}}"