我如何指定一个sudo密码Ansible在非交互的方式?

我是这样运行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**

有办法吗?我希望尽可能地自动化我的项目部署。


当前回答

我们也可以在ansible中使用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

其他回答

以上@toast38coza的解决方案对我来说很管用;只是sudo: yes现在在Ansible中被弃用了。 请使用become和become_user。

tasks:
 - name: Restart apache service
   service: name=apache2 state=restarted
   become: yes
   become_user: root

查看代码(runner/__init__.py),我认为你可以将其设置在你的库存文件中:

[whatever]
some-host ansible_sudo_pass='foobar'

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

文档强烈建议不要将sudo密码设置为明文:

提醒一下,密码永远不应该以纯文本的形式存储。有关使用Ansible Vault加密您的密码和其他秘密的信息,请参见使用Ansible Vault加密内容。

相反,当运行ansible-playbook时,你应该在命令行上使用——ask-become-pass

之前版本的Ansible使用——ask-sudo-pass和sudo来代替become。

我不认为ansible会让你在标志中指定密码,因为你希望这样做。 可能在配置的某个地方可以设置这个,但这将使使用ansible整体不太安全,不建议使用。

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

如果你运行sudo visudo并输入如下一行,那么用户'privilegedUser'在运行sudo service xxxx start时应该不需要输入密码:

%privilegedUser ALL= NOPASSWD: /usr/bin/service

这对我很管用…… 创建文件/etc/sudoers.d/90-init-users文件

echo "user ALL=(ALL)       NOPASSWD:ALL" > 90-init-users

其中“user”是您的用户id。