如何为SSH连接设置默认的Ansible用户名/密码?


59

我正在使用Ansible,并且在清单/全部中都具有以下配置:

[master]
192.168.1.10 ansible_connection=ssh ansible_ssh_user=vagrant ansible_ssh_pass=vagrant

[slave]
192.168.1.11 ansible_connection=ssh ansible_ssh_user=vagrant ansible_ssh_pass=vagrant
192.168.1.12 ansible_connection=ssh ansible_ssh_user=vagrant ansible_ssh_pass=vagrant

[app]
192.168.1.13 ansible_connection=ssh ansible_ssh_user=vagrant ansible_ssh_pass=vagrant

[all:children]
master
slave

我不想为每个新实例重复所有参数。如何在一个地方配置它们?是否有带有这些参数的文件?


3
~/.ssh/config
ceejayoz 2014年

1
@ceejayoz您能解释一下吗
罗伯特·罗伯特·罗伯特(Robert

我不是Ansible管理员,并且文档在主题上不明确(这是“变量”还是“参数”,并且有区别吗?),但看起来您可以以某种方式在组级别定义变量。
DerfK 2014年

Answers:


73

您可以将以下部分添加到库存文件中:

[all:vars]
ansible_connection=ssh
ansible_user=vagrant
ansible_ssh_pass=vagrant

注意: Ansible 2.0之前ansible_useransible_ssh_user


2
在Ansible 2.0以上,它应该是: [all:vars] ansible_connection=ssh ansible_port=22 ansible_user=admin
zx1986 '16

2
@ zx1986你在哪里读的?
030


请注意,端口22是的默认端口ansible_port,因此您无需明确指定它,除非有所不同。如果有人知道如何一次将变量应用于一个以上的组(而不是“全部”),则很有意思,逗号分隔似乎不起作用。
威廉·特雷尔

1
@WilliamTurrell有点晚了,但是您可以创建一组组(使用:children修饰符),然后设置变量(使用:vars修饰符)。
Lasse Halberg Haarbye'5

23

组变量

您可以通过使用Ansible的“ 最佳做法”文档中指定的剧本布局并在定义它们的位置创建文件来设置适用于所有主机的变量。group_vars/all

---
# file: group_vars/all
ansible_connection: ssh 
ansible_ssh_user: vagrant 
ansible_ssh_pass: vagrant

[edit]我对您正在尝试做的事情感到困惑。您无需在清单中指定Ansible用户或密码。如果您使用的是Vagrant,则绝对不会,如果您是从命令行调用Ansible的,则可以使用指定用户,--user=vagrant并使用要求输入密码--ask-pass


1
我只需要对基础架构进行更好的组织。如果总是,我将使用vagrant:vagrant我想将其配置放在默认情况下Ansible加载的某个地方,但我不知道在哪里。每个要执行的连接都必须使用它。
罗伯特

文件必须命名group_vars/all/main.yml还是简单命名group_vars/all
realtebo

安装后,这个工作对我来说sshpass-"you must install the sshpass program"
user9869932

1
@realtebo文件必须命名为group_vars/all
xloto

1
当每个主机具有不同的密码时,-k进行询问通行对于“全部”来说并不是一件很有趣的事情。是的,您需要sshpass,如果是的话,如果您从未连接过〜\ .ssh \ config,则可能需要为known_hosts设置种子。
mckenzm

5

我认为最好将ssh密钥安装用于整个拉式服务器上的所有服务器。您应该仅在每个节点上运行ssh-copy-id,并在所有位置安装ssh密钥,以便ansible能够使用ssh密钥登录。不将密码保存到剧本/清单中会更加安全。

为此,您应该生成ssh密钥对 ,然后对所有服务器运行ssh-copy-id。


1
如果有人可以从您的配置文件中窃取密码,那么他们也可能会使用您的ssh密钥。这与回答OP问题完全无关。这个问题不是在征求其他意见。
Muh Fugen

@MuhFugen>如何在一个地方配置它们?是否有带有这些参数的文件?这是一个准确的短语,为发表意见和回应提供了正确方向的理解。窃取配置(可能存在于git repo中的某个地方)与窃取私钥不同。
podarok

4

在下方添加到清单主机。

对于Ansible <2.0:

[all:vars]
ansible_connection=ssh
ansible_ssh_user=vagrant 
ansible_ssh_pass=vagrant

对于 Ansible> = 2.0

[all:vars]
ansible_connection=ssh # actually default mode smart is OK
ansible_user=vagrant
ansible_pass=vagrant # or ansible_ssh_pass=vagrant

链接提到ansible_ssh_pass,不ansible_pass
Matthias Weiler

2

免责声明:我仅在OSX上对此进行了测试。基于各种文档,我希望它可以在其他平台上运行。

“项目目录”是指Vagrant项目的基本目录-包含的目录Vagrantfile

Vagrant自动生成的Ansible库存文件:

Vagrant 使用默认的Ansible连接变量创建清单文件。在中寻找它<project directory>/.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory

Vagrant将根据需要重新生成此文件,因此手动编辑将被覆盖。但是,根据Vagrant文​​档,您可以在其中指定多台计算机,组var等,Vagrantfile并将它们添加到此清单文件中。

将Ansible配置为默认使用此清单文件:

要使此文件成为ansible您在项目目录中(主机上)时命令使用的默认值,请在项目目录中添加ansible.cfg包含以下内容的文件,并根据需要更改路径:

[defaults]
inventory = ./path/to/inventory

要确认正在使用此清单文件,请将其查找为ansible报告的默认文件:

(从项目目录中)

$ ansible | grep inventory ERROR! Missing target hosts -i INVENTORY, --inventory-file=INVENTORY specify inventory host path (default=./.vagrant/provis ioners/ansible/inventory/vagrant_ansible_inventory) or

确认主机:

$ ansible all --list-hosts hosts (2): master slave

在这些主机上使用Ansible:

然后,在项目目录中,您应该能够ansible正常使用在中定义的主机Vagrantfile

例如:

ansible slave -a 'hostname'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.