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)也做下密钥分发。