2.3 配置运行环境
2.3.1 配置Ansible环境
Ansible配置文件是以ini格式存储配置数据的,在Ansible中,几乎所有的配置项都可以通过Ansible的playbook或环境变量来重新赋值。在运行Ansible命令时,命令将会按照预先设定的顺序查找配置文件,如下所示:
1)ANSIBLE_CONFIG:首先,Ansible命令会检查环境变量,及这个环境变量将指向的配置文件。
2)./ansible.cfg:其次,将会检查当前目录下的ansible.cfg配置文件。
3)~/.ansible.cfg:再次,将会检查当前用户home目录下的.ansible.cfg配置文件。
4)/etc/ansible/ansible.cfg:最后,将会检查在用软件包管理工具安装Ansible时自动产生的配置文件。
注意
如果你通过操作系统软件包管理工具或pip安装,那么你在/etc/ansible目录下应该已经有了ansible.cfg配置文件;如果你是通过GitHub仓库安装的,在你复制的仓库中examples目录下可以找到ansible.cfg,你可以把它拷贝到/etc/ansible目录下。
1.使用环境变量方式来配置
大多数的Ansible参数可以通过设置带有ANSIBLE_开头的环境变量进行配置,参数名称必须都是大写字母,如下配置项:
export ANSIBLE_SUDO_USER=root
设置了环境变量之后,ANSIBLE_SUDO_USER就可以在playbook中直接引用。
2.设置ansible.cfg配置参数
Ansible有很多配置参数,你也许不会都使用到。下面列出常用的配置参数:
·inventory——这个参数表示资源清单inventory文件的位置,资源清单就是一些Ansible需要连接管理的主机列表。在1.9版本之前有个类似功能的参数hostfile,但1.9版本之后就不建议再使用了。下一章将对资源清单做详细的讲解。这个参数的配置实例如下:
inventory = /etc/ansible/hosts
·library——Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录。配置实例如下:
library = /usr/share/ansible
Ansible支持多个目录方式,只要用冒号(:)隔开就可以,同时也会检查当前执行playbook位置下的./library目录。
·forks——设置默认情况下Ansible最多能有多少个进程同时工作,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管节点的数量来确定,可能是50或100,默认值5是非常保守的设置。配置实例如下:
forks = 5
·sudo_user——这是设置默认执行命令的用户,也可以在playbook中重新设置这个参数。配置实例如下:
sudo_user = root
·remote_port——这是指定连接被管节点的管理端口,默认是22。除非设置了特殊的SSH端口,不然这个参数一般是不需要修改的。配置实例如下:
remote_port = 22
·host_key_checking——这是设置是否检查SSH主机的密钥。可以设置为True或False,下一节将详细介绍。配置实例如下:
host_key_checking = False
·timeout——这是设置SSH连接的超时间隔,单位是秒。配置实例如下:
timeout = 60
·log_path——Ansible系统默认是不记录日志的,如果想把Ansible系统的输出记录到日志文件中,需要设置log_path来指定一个存储Ansible日志的文件。配置实例如下:
log_path = /var/log/ansible.log
另外需要注意,执行Ansible的用户需要有写入日志的权限,模块将会调用被管节点的syslog来记录,口令是不会出现在日志中的。
2.3.2 使用公钥认证
现在运维对安全要求都是比较重视的,一般会采用密钥验证方式来登录,Ansible 1.2.1之后的版本都默认启用公钥认证。
如果有台被管节点重新安装系统并在known_hosts中有了与之前不同的密钥信息,就会提示一个密钥不匹配的错误信息,直到被纠正为止。在使用Ansible时,如果有台被管节点没有在known_hosts中被初始化,将会在使用Ansible或定时执行Ansible时提示对key信息的确认。
如果你不想出现这种情况,并且你明白禁用此项行为的含义,只要修改home目录下~/.ansible.cfg或/etc/ansible/ansible.cfg的配置项:
[defaults] host_key_checking = False
或者直接在控制主机的操作系统中设置环境变量,如下所示:
$export ANSIBLE_HOST_KEY_CHECKING=False
需要说明的是,在早期使用paramiko模式时,公钥认证速度相当慢,因此当使用密钥认证方式时建议采用SSH方式连接,这也是现在默认的连接方式。
2.3.3 配置Linux主机SSH无密码访问
为了避免Ansible下发指令时输入目标主机密码,通过证书签名达到SSH无密码是一个好的方案。推荐使用ssh-keygen与ssh-copy-id来实现快速证书的生成及公钥下发,其中ssh-keygen生产一对密钥,使用ssh-copy-id来下发生成的公钥。具体操作如下。
在控制主机(ansiblecontrol)上创建密钥,执行:ssh-keygen -t rsa,有询问直接按回车键即可,将在/root/.ssh/下生成一对密钥,其中id_rsa为私钥,id_rsa.pub为公钥,代码如下:
[root@ansiblecontrol]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa):<回车> Enter passphrase (empty for no passphrase): <回车> Enter same passphrase again: <回车> Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: ec:f2:89:2a:62:c5:1a:53:32:04:04:fd:40:e9:ad:dd root@ansiblecontrol. ansible.cn The key' s randomart image is: +--[ RSA 2048]-----+ |*+.. | | .+ | |.. + | | o..o . | | =o . S | | o.o. E. | | = . . | |.o. + . | |.. .... o | +----------------------+
下发密钥就是控制主机把公钥id_rsa.pub下发到被管节点上用户下的.ssh目录,并重命名成authorized_keys,且权限值为400。接下来推荐常用的密钥拷贝工具ssh-copy-id,把公钥文件id_rsa.pub公钥拷贝到被管节点,命令格式如下:
ssh-copy-id [-h—-? —-n] [-i [identity_file]] [-p port] [[-o <ssh -o options>] ...] [user@]hostname
输入以下命令同步公钥到被管节点web1(192.168.1.111):
[root@ansiblecontrol]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.111 /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.1.111' s password:<输入口令> Number of key(s) added: 1 Now try logging into the machine, with: "ssh ' root@192.168.1.111' " and check to make sure that only the key(s) you wanted were added. [root@ansiblecontrol]# ssh root@192.168.1.111 Last login: Sat Aug 29 12:07:452015 from ansiblecontrol.ansible.cn [root@web1~]#
密钥分发后,需要验证一下SSH无密码配置是否成功,只需运行ssh root@192.168.1.111,如果直接进入被管节点root账号提示符,即出现[root@web1~]#,则说明配置成功。
同样的配置方式对web2(192.168.1.112)也做下密钥分发。