ANSIBLE
Simple, agentless and powerful open source IT automation.
ansible是一个轻量级的自动化运维工具,学习门槛低,安装简单,执行方便,它基于ssh,远程服务器上不需要安装客户端agent,利用推送方式对客户系统加以配置,这样所有工作都可在主服务器端完成,不需要维护远程服务器上的客户端agent。
ansible中的概念
- 任务task:多个
task顺序执行,在每个task执行结束可以通知hanlder触发新操作。 - 变量variable:用户定义的变量。
- 环境facts:
facts从每台服务器上收集得到,可以用作变量。 - 模块module:比如
shell,ping,apt,git,copy,默认的command等等。 - 操作hanlder:任务执行后的回调任务,通过
task中的notify配置关联handler,不管有多少个通知,handler在所有任务运行后,按照配置的先后顺序只运行一次。
使用前提
ansible基于ssh操作远程服务器,所以要求远程服务器提供:
remote_user能够通过ssh公钥无密码登录到所管理的远程服务器。remote_user执行sudo的时候不需要密码,配置如下说明。
sudo chmod +w /etc/sudoers visudo |
或者是用vim直接编辑此文件:
sudo vim /etc/sudoers |
找到root ALL=(ALL:ALL) ALL,在下面添加一行,username为ssh远程登陆用户的用户名:
username ALL=(ALL:ALL) NOPASSWD:ALL |
保存退出,然后恢复为只读。
sudo chmod -w /etc/sudoers |
Mac OS上安装ansible
使用homebrew安装最方便:
brew install ansible |
或者是使用pip安装:
sudo easy_install pip sudo pip install ansible |
配置
ansible配置文件设置.ansible.cfg,ansible执行的时候会按照以下顺序查找配置文件:
- ANSIBLE_CONFIG (环境变量)
- ansible.cfg (当前目录)
- ~/.ansible.cfg (用户目录)
- /etc/ansible/ansible.cfg (默认位置)
在当前用户目录新建一份空文件:
touch ~/.ansible.cfg |
Ping command test
编辑/etc/ansible/hosts文件,加入以下远程服务地址,并且在这些远程服务器的~/.ssh/authorized_keys文件中加入了登录用户的ssh公钥,使得用户可以通过ssh无密码登录:
192.168.1.50[local]127.0.0.1[mail]mail.example.com ansible_ssh_user=username[webservers]www.example.com[dbservers]db[a:f].example.com |
这是一份需要维护的远程服务器的inventory目录文件,更详细的说明可查看Inventory官方文档。
使用ping模块检查以上配置中的所有服务器状态:
ansible all -m ping |
前面公钥设置正确的情况下,会得到如下类似的输出:
127.0.0.1 | success >> {
"changed": false,
"ping": "pong"
}
mail.example.com | success >> {
"changed": false,
"ping": "pong"
}
Echo command test
ansible all -a "/bin/echo hello" |
127.0.0.1 | success | rc=0 >>
hello
mail.example.com | success | rc=0 >>
hello
如果要执行远程服务器操作的用户与当前操作用户不同时,可以通过/etc/ansible/hosts文件配置ansible_ssh_user,或者是在运行命令时加上-u参数覆盖配置文件中的设置。
ansible all -a "/bin/echo hello" -u bruce |
这是一条ansible ad-hoc命令,ad-hoc命令是指临时的,在ansible中是指需要快速执行,并且不需要保存的命令。ansible提供两种方式去完成任务,一是ad-hoc命令,一是写playbook,前者可以解决一些简单的任务,后者解决较复杂的任务.
指定ansible hosts配置文件运行ad-hoc命令
ansible -i ~/hosts all -a 'who' |
以上命令参数说明:
-i表示hosts文件的位置,默认是/etc/ansible/hosts。-a后面是module的参数,这边没有指定module,即默认的module,是command module。all代表host所有服务器。
这条命令就是对用户指定配置文件~/hosts中所有的host执行who命令。
修改ansible默认hosts文件位置
修改默认hosts文件位置,编辑用户目录下的~/.ansible.cnf文件:
mkdir ~/ansible cp /etc/ansible/hosts ~/ansible/hosts vim .ansible.cfg |
加入以下内容:
[defaults]hostfile=~/ansible/hosts |
playbook.yml配置
前面已经提到playbook是ansible保存的一份配置文件,用于执行复杂的任务和需要重复执行的任务。
以下是官方示例中的一份playbook配置文件,这份配置只有一个play,一份配置可以添加多个play。在这个配置中定义了3个task和1个handler,使用yum安装apache,添加apache配置文件并通知hanlder执行apache重启,检查当前是否正在运行apache服务,最后由handler重启apache服务。
- hosts: webservers vars: http_port: 80 max_clients: 200 remote_user: root tasks: - name: ensure apache is at the latest version yum: sudo: yes name: httpd state: latest - name: write the apache config file template: src: /srv/httpd.j2 dest: /etc/httpd.conf notify: - restart apache - name: ensure apache is running service: name: httpd state: started handlers: - name: restart apache service: name: httpd state: restarted |
playbook简单示例
设置一个简单的任务,登陆远程服务器将登录用户名写入whoami.rst文件中,保存以下内容到~/ansible/playbook.yml。
# playbook.yml- hosts: webservers # hosts中指定 remote_user: username # 如果和当前用户一样,则无需指定 tasks: - name: whoami shell: 'whoami > whoami.rst' |
playbook的结构
一个playbook文件由一个或多个play组成,在play中首先需要定义在哪个主机上执行,即
hosts: webservers |
每个play定义了在一个或多个远程主机上执行的一系列的task,下面就是一个task:
- name: whoami shell: 'whoami > whoami.rst' |
其中每个task一般就是调用一个ansible的模块,如调用copy模块复制文件到远程主机或调用shell模块执行命令。tasks中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个,如果中途发生错误所有已执行任务都将回滚因此在更正playbook后重新执行一次即可。
运行以上配置文件:
ansible-playbook -i ~/ansible/hosts ~/ansible/playbook.yml |
输出内容如下:
PLAY [webservers] *******************************************************************
GATHERING FACTS ***************************************************************
ok: [www.example.com]
TASK: [whoami] ****************************************************************
changed: [www.example.com]
PLAY RECAP ********************************************************************
www.example.com : ok=2 changed=1 unreachable=0 failed=0
关于playbook,还可以查看官方提供的playbook示例项目:
git clone git@github.com:ansible/ansible-examples.git |