如何使ansible仅在需要时请求成为密码

如何使ansible仅在需要时请求成为密码,ansible,Ansible,我正在使用ansible 2.0.2.0从任何计算机更新我的静态网站。我的playbook仅在localhost上运行,基本上有两个部分: 特权部分:确保安装了软件包,本质上是apttasks和been:true 非特权部分:填写模板,缩小并与web托管服务同步,本质上是命令任务而不是变成 我更喜欢将这两个部分放在同一个剧本中,这样在切换计算机时就不必担心依赖性。理想情况下,我希望ansible检查是否安装了apt软件包,并且仅在需要安装任何软件包时才要求输入密码 到目前为止,我已经探讨过的

我正在使用ansible 2.0.2.0从任何计算机更新我的静态网站。我的playbook仅在localhost上运行,基本上有两个部分:

  • 特权部分:确保安装了软件包,本质上是
    apt
    tasks和
    been:true
  • 非特权部分:填写模板,缩小并与web托管服务同步,本质上是
    命令
    任务而不是
    变成
我更喜欢将这两个部分放在同一个剧本中,这样在切换计算机时就不必担心依赖性。理想情况下,我希望ansible检查是否安装了
apt
软件包,并且仅在需要安装任何软件包时才要求输入密码

到目前为止,我已经探讨过的其他不太令人满意的替代方案及其缺点如下:

  • sudo ansible playbook…
    :以
    root
    身份运行非特权部分,在不需要时询问sudo密码
  • ansible playbook——询问成为通行证…
    :始终询问sudo密码,即使不需要安装新软件包
  • ansible playbook…
    :sudo失败:需要密码

有没有办法将特权部分和非特权部分保存在同一个剧本中,而不必不必要地键入sudo密码或给予非特权部分不必要的特权?

如果使用
--ask sudo pass
参数运行
ansible playbook
,则第二个选项将要求您输入一次密码,并将在需要时每次重复使用

如果像第一种情况一样以sudo方式运行,那么您可以在脚本中使用been,根据需要失去您的特权状态

但是,您可以设置
ansible.cfg
来远程安装到
localhost
。因此,您可以设置一个无特权的ansible用户(我使用
centos
),该用户无需密码即可设置为
sudo
。然后我在
centos
用户的
authorized_key
中设置我的本地用户

因此,您可以无特权地运行(如
centos
),但当您需要sudo时,可以使用
been\u方法:sudo
成为root用户

使用这种方法,我使用相同的ansible playbook进行裸机安装,就像远程AWS安装一样

查看我的
ansible.cfg
我有:-

[defaults]
hostfile = inventory
# use local centos account, and ask for sudo password
remote_user = centos
#ask_pass = true
#private_key_file = ~/packer/ec2_amazon-ebs.pem
My
inventory.yml
包含:-

[webservers]
  localhost
ansible-playbook playbook.yml -vvv
#ansible-playbook --ask-sudo-pass playbook.yml
my
setup.sh
包含:-

[webservers]
  localhost
ansible-playbook playbook.yml -vvv
#ansible-playbook --ask-sudo-pass playbook.yml

因此,所有密码询问语句都处于关闭状态。请记住,我没有在默认设置中指定
私钥文件
,它假定正在运行的用户有权ssh到
centos@localhost
无需密码

我认为为了让ansible使用apt检查是否满足软件包依赖关系,它需要根权限-因此,即使不需要安装新软件包,您也需要传递密码。同样的问题,未解决yetguess您将不得不为此使用shell模块,而不是包模块。有点粗俗。一个更好的方法是将这些剧本分开,不确定,但现在它是
——ask been
,而不是
——ask sudo pass