自动化运维—ansible
一、Ansible介绍
Ansilbe是一个部署一群远程主机的工具。远程的主机可以是远程虚拟机或物理机, 也可以是本地主机。
Ansilbe通过SSH协议实现远程节点和管理节点之间的通信,不需要安装客户端。
Ansible基于模块工作,模块可以由任何语言开发
Ansible不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读
Ansible的安装十分简单,centos上可直接通过yum安装。
Ansible有提供命令行版本,免费。也有提供UI(浏览器图形化)版本,网址: www.ansible.com/tower,但是收费的。 官方文档: http://docs.ansible.com/ansible/latest/index.html
Ansible已经被redhat公司收购,它在github上是一个非常受欢迎的开源软件,github地址https://github.com/ansible/ansible
一本不错的入门电子书 https://ansible-book.gitbooks.io/ansible-first-book/
二、ansible安装和远程执行命令
查看ansible 的yum清单,安装ansible ansible-doc(只需要在lin-01上面安装就可以了)
yum -y install ansible ansible-doc
安装完成之后,查看lin-01上面有没有公钥,如果没有则生成公钥,生成公钥的命令:ssh-keygen
把此公钥分别 存放在lin-02机器上面,同时还要在lin-01上面进行认证一下
之后再到lin-01上面进行测试看看能不能远程连接lin-02
编辑/etc/ansible/hosts文件,添加以下语句(这里的)
在行testhost主机上,执行命令
语句释义:ansible 批量执行命令,testhost 是主机的集合,-m后面接调用module的名字, -a后面接调用module的参数
shell模块也可以执行命令
错误解决:
错误: "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"
解决: yum install -y libselinux-python
三、 ansible拷贝文件或目录
ansible linux-02 -m copy -a "src=/etc/ansible dest=/tmp/ansibletest owner=root group=root mode=0755"
- linux-02 : 指定认证主机,可以是testhost集合;
- copy -a "定义内容" :复制定义的内容
- src=/etc/ansible :定义复制的源目录及文件
- dest=/tmp/ansibletest :定义要复制到的位置
- owner=root :定义uid为root
- group=root :组为root
- mode=0755 :权限为755
整个语句意思为:把master机器的/etc/ansible目录复制到远程机器linux-02上的/tmp/ansibletest目录,并指定所有者、所有组及其权限;
在另一台机器上进行查看刚才拷贝的结果
注意:
- 源目录会放到目标目录下面去,
- 如果目标指定的目录不存在,它会自动创建。
- 如果拷贝的是文件,dest指定的名字和源如果不同,并且它不是已经存在的目录,相当于拷贝过去后又重命
- 但相反,如果desc是目标机器上已经存在的目录,则会直接把文件拷贝到该目录下面。
四、 ansible远程执行脚本
先编写一个脚本内容如下
由于ansible执行脚本的时候需要把脚本拷贝到别的机器上然后才能批量执行脚本所以我们先要进行考本脚本文件
开始执行命令并到另一台机器上面进行查看
注意:-m command 不支持管道符,而-m shell 支持管道
五、ansible管理任务计划
- 新建管理任务计划
给102机器创建名为test cron 的管理认为计划
在另一台机器上进行查看任务计划
- 管理计划任务
state=absent 定义状态为无,即可删除此计划任务
在到另一台机器上面进行查看有没有任务计划
注意:由ansible管理的计划任务 (crontab -e),请不要手动修改,否则会导致ansible无法再管理相应的计划任务
六、ansible安装包和管理服务
我们做实验要删除一个安装包
到另外一台机器上进行检验,查看有没有删除
在给另外一台机器进行安装httpd
ansible-doc cron :查看指定模块的文档
ansible-doc -l : 列出所有的模块
七、使用ansible playbook
- Playbooks 是 Ansible的配置,部署,编排语言.他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合.
- 如果 Ansible 模块你是工作室中的工具,那么 playbooks 就是你设置的方案计划.
- Playbooks 的格式是YAML。
1.首先进行创建一个文件,之后再使用ansible进行执行文件
到另一台机器上进行验证有没有执行成功
八、playbook里的变量
先创建一个文件
create_user.yml文件语句释义:
- name参数对该playbook实现的功能做一个概述,后面执行过程中,会打印name变量的值,可以省略;
- gather_facts参数指定了在以下任务部分执行前,是否先执行setup模块获取主机相关 信息,如果后面的task会使用到setup获取的信息时会用到;
- vars参数,指定了变量,这里指字一个user变量,其值为test,需要注意的是,变量值一定要用引号引住;
- user指定了调用user模块,name是user模块里的一个参数,而增加的用户名字调用了上面user变量的值。
执行文件
九、playbook里的循环
创建while.yml文件
---
- hosts: 192.168.126.102
user: root
tasks:
- name: change mode for files
file: path=/tmp/{{ item }} state=touch mode=600
with_items:
- 1.txt
- 2.txt
- 3.txt
查看执行结果
十、playbook里的条件判断
创建when.yml条件判断的yml文本
---
- hosts: 192.168.126.102
user: root
gather_facts: True
tasks:
- name: use when
shell: touch /tmp/when.txt
when: ansible_ens33.ipv4.address == "192.168.126.102"
when: ansible_ens33.ipv4.address == "192.168.112.138" 释义:
- when: 为ansble模块
- ansible_ens33 :为一个1级范围
- ipv4:为ansible_ens33范围内的子集;
- address:为ipv4的一个子集;
- == "192.168.112.138" :匹配此IP
上面的when条件语句,就通过查看facter信息,来设置条件;
查看所有的facter信息: ansible 主机名-m setup
执行when.yml文件并进行检测
十一、playbook中的handlers
Ansible playbook中的handlers可实现类似逻辑与的功能。(相当于shell中&&)
运用场景为:修改完配置文件后,重新加载配置文件;
创建handler.yml文件
---
- name: handlers test
hosts: 192.168.126.102
user: root
tasks:
- name: copy file
copy: src=/etc/passwd dest=/tmp/bbb.txt
notify: test handlers
handlers:
- name: test handlers
shell: echo "111111" >> /tmp/bbb.txt
说明:此处必要copy步骤成功,handlers才能够继续执行
进行测试和查看
十二、 playbook安装nginx
- 实战:批量安装源码nginx
- 思路:先在一台机器上编译安装好nginx、打包,然后再用ansible去下发
第一步:创建/etc/ansible/nginx_install目录及其子目录
[root@linux-01 ansible]# mkdir nginx_install
[root@linux-01 ansible]# cd nginx_install/
[root@linux-01 nginx_install]# mkdir -p roles/{common,install}/{handlers,files,meta,tasks,templates,vars}
第二步:确定需要打包的nginx目录文件
[root@linux-01 nginx_install]# pwd
/etc/ansible/nginx_install
[root@linux-01 nginx_install]# ls
roles
[root@linux-01 nginx_install]# ls /usr/local/nginx
client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
[root@linux-01 nginx_install]# ls /etc/init.d/nginx
/etc/init.d/nginx
[root@linux-01 nginx_install]# ls /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/conf/nginx.conf
第三步:打包nginx目录下,除vhost的所有有关nginxd文件;把nginx配置文件、启动脚本复制到roles/install/templates/下
[root@linux-01 local]# tar czf nginx.tar.gz --exclude "nginx.conf" --exclude "vhost" nginx/
[root@linux-01 local]# mv nginx.tar.gz /etc/ansible/nginx_install/roles/install/files/
[root@linux-01 local]# cp nginx/conf/nginx.conf /etc/ansible/nginx_install/roles/install/templates/
[root@linux-01 local]# cp /etc/init.d/nginx /etc/ansible/nginx_install/roles/install/templates
第四步:定义普通的tasks,创建main.yml文件
- name: Install initializtion require software
yum: name={{ item }} state=installed
with_items:
- zlib-devel
- pcre-devel
第五步:定义变量,创建/install/vars/main.yml 文件
[root@linux-01 common]# vim /etc/ansible/nginx_install/roles/install/vars/main.yml
nginx_user: www //用户
nginx_port: 800 //端口
nginx_basedir: /usr/local/nginx //nginx目录
第六步:定义文件拷贝配置文件
[root@linux-01 common]# vim /etc/ansible/nginx_install/roles/install/tasks/copy.yml
- name: Copy Nginx Software //把nginx包复制到指定目录
copy: src=nginx.tar.gz dest=/tmp/nginx.tar.gz owner=root group=root
- name: Uncompression Nginx Software //用shell模块远程解压到/usr/local下
shell: tar zxf /tmp/nginx.tar.gz -C /usr/local/
- name: Copy Nginx Start Script //复制启动nginx脚本
template: src=nginx dest=/etc/init.d/nginx owner=root group=root mode=0755
- name: Copy Nginx Config //复制nginx配置文件,通过变量,即/usr/local/nginx下
template: src=nginx.conf dest={{ nginx_basedir }}/conf/ owner=root group=root mode=0644
第七步:建立用户、启动服务。删除安装包
vim /etc/ansible/nginx_install/roles/install/tasks/install.yml
- name: Create Nginx User //创建用户信息等
user: name={{ nginx_user }} state=present createhome=no shell=/sbin/nologin
- name: Start Nginx Service //远程启动nginx
shell: /etc/init.d/nginx start
- name: Add Boot Start Nginx Service //增加nginx服务,到启动项
shell: chkconfig --level 345 nginx on
- name: Delete Nginx compression files //删除nginx.tar.gz包
shell: rm -rf /tmp/nginx.tar.gz
第八步:创建main.yml,调用copy和install
vim /etc/ansible/nginx_install/roles/install/tasks/main.yml
- include: copy.yml
- include: install.yml
第九步:创建入口文件
[root@linux-01 common]# vim /etc/ansible/nginx_install/install.yml
---
- hosts: 192.168.126.102
remote_user: root
gather_facts: True
roles:
- common
- install
下面就要在linux-01上面使用ansible-playbook文件
另一台机器要关闭httpd,还有就是如果之前安装了nginx要先进行删除
十三、 playbook管理配置文件
生产环境中安装软件包只是在初始化环境的时候用一下,大多时候是需要管理配置文件的。此时可以用playbook功能。
创建playbook配置目录结构
[root@linux-01 ~]# mkdir -p /etc/ansible/nginx_config/roles/{new,old}/{files,handlers,vars,tasks}
[root@linux-01 ~]# cd /etc/ansible/nginx_config/
把nginx虚拟主机,复制到nginx_config/roles/new/files/目录下
[root@linux-01 nginx_config]# cd /usr/local/nginx/conf/
[root@linux-01 conf]# cp -r nginx.conf vhost /etc/ansible/nginx_config/roles/new/files/
[root@linux-01 conf]# cd -
定义变量文件
[root@linux-01 conf]# vim /etc/ansible/nginx_config/roles/new/vars/main.yml
定义nginx重新加载配置
root@linux-01 nginx_config]# vim /etc/ansible/nginx_config/roles/new/tasks/main.yml
- name: copy conf file
copy: src={{ item.src }} dest={{ nginx_basedir }}/{{ item.dest }} backup=yes owner=root group=root mode=0644
with_items:
- { src: nginx.conf, dest: conf/nginx.conf }
- { src: vhosts, dest: conf/ }
notify: restart nginx
定义总入口配置,创建update.yml文件
[root@linux-01 nginx_config]# vim /etc/ansible/nginx_config/update.yml
---
- hosts: 192.168.126.102
user: root
roles:
- new
执行update.yml文件
[root@linux-01 nginx_config]# ansible-playbook /etc/ansible/nginx_config/update.yml
在另一台客户端机器上进行重新加载nginx服务
文件的回滚测试
在linux-01机器上,把new文件夹备份到old文件夹
[root@linux-01 nginx_config]# rsync -av roles/new/ roles/old/
创建rollback.yml 文件
[root@linux-01 nginx_config]# vim /etc/ansible/nginx_config/rollback.yml
---
- hosts: 192.168.126.102
user: root
roles:
- old
在linux-01上,配置文件nginx.conf,在include前面加上#号
[root@linux-01 nginx_config]# vim /etc/ansible/nginx_config/roles/new/files/nginx.conf
# include vhost/*.conf;
执行rollback.yml 文件
[root@linux-01 nginx_config]# ansible-playbook /etc/ansible/nginx_config/rollback.yml