Ansible介绍:
ansible是新出现的自动化运维工具,基于Python开发,分布式,无需客户端,轻量级,实现了批量系统配置、批量程序部署、批量运行命令等功能,ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
Ansible特性
1)、no agents:不需要在被管控主机上安装任何客户端,更新时,只需在操作机上进行一次更新即可(不用安装客户端。分布式的)
2)、no server:无服务器端,使用时直接运行命令即可
3)、modules in any languages:基于模块工作,可使用任意语言开发模块
4)、yaml,not code:使用yaml语言定制剧本playbook
5)、ssh by default:基于SSH工作
6)、strong multi-tier solution:可实现多级指挥
ansible部署(实验环境):
系统centos7u6
主机:四台 一个控制节点 三个被控制节点
解析:四台服务器之间互相做本地解析
保证防火墙,selinux关闭
网络,base仓库及epel仓库可用
安装ansible:
yum -y isntall ansible
ansible —version #测试
在进行多台主机实验时,需要在/etc/ansible/hosts内添加被控制服务器得ip地址
/etc/ansible/ansible.cfg 这是ansible得主配置文件
主要设置一些ansible初始化的信息,比如日志存放路径、模块、插件等配置信息
配置文件中常见参数:inventory = /etc/ansible/hosts#这个参数表示资源清单inventory文件的位置library = /usr/share/ansible#指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以forks = 5#并发连接数,默认为5sudo_user = root#设置默认执行命令的用户remote_port = 22#指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全host_key_checking = False#设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例timeout = 60#设置SSH连接的超时时间,单位为秒log_path = /var/log/ansible.log#指定一个存储ansible日志的文件(默认不记录日志)
vim /etc/ansible/hosts
添加被控制节点
可以添加在一个组内或者单独添加
[web]
ansible
web-1
web-2
保存退出
ssh-keygen #制作密钥
ssh-copy-id web-1
ssh-copy-id web-2
进行测试:
ansible web -m ping
语法:
ansible -m-a
pattern—主机清单里定义的主机组名,主机名,IP,别名等,all表示所有的主机,支持通配符,正则
: —多个组,组名之间用冒号隔开
web —组名或主机名中含web的
webservers[0] - webservers组中的第一台主机
以~开头,匹配正则
-m module_name: 模块名称,默认为command
-a arguments: 传递给模块的参数
例:
执行shell命令: -a 是传给模块的参数
[root@ansible ~]# ansible web1 -m shell -a ‘uptime’
给节点增加用户:
[root@vm20 ~]# ansible 192.168.245.143 -a “useradd tom”
[root@vm20 ~]# ansible 192.168.245.143 -a “grep tom /etc/passwd”
重定向输出到本地文件中:
[root@vm20 ~]# ansible 192.168.245.143 -a “df -h” > /tmp/a.txt
command模块:
[root@ansible ~]# ansible web1 -m command -a ‘uptime’
因为默认模块就是command,所以上面命令可以不加-m:
[root@ansible ~]# ansible web1 -a ‘uptime’
copy模块:
ansible weball -m copy -a ‘src=/root/a.txt dest=/opt owner=root group=root mode=644’ -o
src=:指定源文件路径
dest=:目标地址(拷贝到哪里)
owner:指定属主
group:指定属组
mode:指定权限,可以以数字指定比如0644
backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no
软件包管理 yum模块
安装apache
[root@ansible-server ~]# ansible webservers1 -m yum -a “name=httpd state=latest” -o
state= #状态是什么,干什么
state=absent 用于remove安装包
state=latest 表示最新的
state=removed 表示卸载
卸载软件:
[root@ansible-server ~]# ansible webservers1 -m yum -a “name=httpd state=removed” -o
服务管理service模块
[root@ansible-server ~]# ansible webservers1 -m service -a “name=httpd state=started” #启动
[root@ansible-server ~]# ansible webservers1 -m service -a “name=httpd state=stopped” #停止
[root@ansible-server ~]# ansible webservers1 -m service -a “name=httpd state=restarted” #重启
[root@ansible-server ~]# ansible webservers1 -m service -a “name=httpd state=started enabled=yes” #开机启动
[root@ansible-server ~]# ansible webservers1 -m service -a “name=httpd state=started enabled=no” #开机关闭
文件模块file
模块参数详解:
owner:修改属主
group:修改属组
mode:修改权限
path=:要修改文件的路径
recurse:递归的设置文件的属性,只对目录有效
yes:表示使用递归设置
state:
touch:创建一个新的空文件
directory:当目录存在时不会进行修改
[root@ansible-server ~]# ansible webservers1 -m file -a ‘path=/tmp/88.txt mode=777 state=touch’ #创建一个文件
[root@ansible-server ~]# ansible webservers1 -m file -a ‘path=/tmp/99 mode=777 state=directory’ #创建一个目录
收集信息模块setup
[root@ansible-server ~]# ansible webservers1 -m setup #收集所有信息
[root@ansible-server ~]# ansible webservers1 -m setup -a ‘filter=ansibleall_ipv4_addresses’ #只查询ipv4的地址
filter:过滤
[root@ansible-server ~]# ansible webservers1 -m setup -a ‘filter=ansible*_mb’
[root@ansible-server ~]# ansible -i /home/ansible/hostlist web -m setup -a ‘filter=ansible_processor_cores’
[root@ansible-server ~]# ansible all -m setup —tree /tmp/facts
实战:批量安装apache服务,并使用浏览器访问到对应的项目[root@xingdian /]# vim apache.yml
hosts: web
user: root
tasks:- name: apache install
yum: name=httpd state=latest - name: mkdir file
file: path=/web1 state=directory mode=777 - name: copy index
copy: src=/apache/index.html dest=/web1 - name: Listen
shell: echo “Listen 81” >> /etc/httpd/conf/httpd.conf - name: copy conf
copy: src=/apache/hello.conf dest=/etc/httpd/conf.d/
notify: start httpd
handlers: - name: start httpd
service: name=httpd state=restarted
保存退出
- name: apache install
cd /apache
echo “so nice” > index.html
vim hello.conf
ServerName localhost
DocumentRoot /web1
AllowOverride all
Require all granted
检测语法:
ansible-playbook —syntax-check apache.yml
ansible-playbook apache.yml
自建变量实验:
vim /etc/ansible/aaa.yml
hosts: ‘{{ hosts }}’
user: ‘{{ user }}’
tasks:- name: test
shell: free -m | grep Mem >> /root/a.txt
保存退出
使用ansible-playbook —syntax-check检测是会报错得
使用时需要参数去指定变量得值:
- name: test
ansible-playbook aaa.yml —extra-vars “hosts=web user=root”
set_fact自定义facts变量:
set_fact模块可以自定义facts,这些自定义的facts可以通过template或者变量的方式在playbook中使用。如果你想要获取一 个进程使用的内存的百分比,则必须通过set_fact来进行计算之后得出其值,并将其值在playbook中引用。
vim /etc/ansible/bbb.yml
hosts: web
user: root
tasks:- name: Calculate InnoDB buffer pool size
set_fact: innodb_buffer_pool_size_mb=”{{ ansible_swapfree_mb / 2 }}” - name: nihao
template: src=/my.cnf dest=/etc/my.cnf owner=root group=root mode=0644
保存退出
set_fact: innodb_buffer_pool_size_mb=”{{ ansible_memtotal_mb / 2 }}”
通过sey_fact去定义,而不是直接执行
template: src=templates/my.cnf dest=/etc/my.cnf owner=root group=root mode=0644
template:这个是一个模板 可以传变量
- name: Calculate InnoDB buffer pool size
vim /my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
Disabling symbolic-links is recommended to prevent assorted
security risks
symbolic-links=0
Configure the buffer pool
innodb_buffer_pool_size = {{ innodb_buffer_pool_size_mb|int }}M
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
保存退出
ansible-playbook —syntax-check bbb.yml
ansible-playbook bbb.yml
Ansible-role:
role 角色
roles是在ansible中,playbooks的目录组织结构。
每一个角色是有名字的 他是一个目录 , 可以包含子目录
以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;
role_name/ 这个是角色的名称
files/:存储由copy或script等模块调用的文件;
tasks/: 专门存储任务的目录 一个角色可以定义多个任务
此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;
handlers/: 条件 前一个任务执行成功去执行下面的 处理特定事物的文件
此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;
vars/: 变量 定义变量的文件
此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;
templates/: 模板 使用变量的文件存储由template模块调用的模板文本;
meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;
default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;
利用rloe角色批量部署nginx并发布内容实验:
准备目录结构:
cd /etc/ansilbe/roles
mkdir nginx/{files,handlers,tasks,templates,vars} -p
创建文件:
touch site.yml nginx/{handlers,tasks,vars}/main.yml
检验:
yum install -y tree
tree nginx/
nginx/
├── files
├── handlers
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
└── vars
└── main.yml
5 directories, 3 files
创建nginx得测试文件
echo “so nice” > nginx/files/index.html
安装nginx并配置模板:
yum -y install nginx && cp /etc/nginx/nginx.conf nginx/templates/nginx.conf.j2
编写任务:
vim nginx/tasks/main.yml
- name: install epel
yum: name=epel-release state=latest - name: install nginx
yum: name=nginx state=latest - name: copy nginx.conf templte
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf - name: copy index.html
copy: src=index.html dest=/usr/share/nginx/html/index.html
notify: start nginx
保存退出
准备配置文件:
vim /nginx/templates/nginx.cong.j2
注释掉worker_processes auto;
并在它下面添加worker_processes {{ worker_connections }};
编写变量:
vim nginx/vars/main.yml
添加以下内容:
worker_connections:2
编写handlers:
vim nginx/handlers/main.yml
添加:
- name: start nginx
service: name=nginx state=started
编写剧本:
vim site.yml
hosts: web
user: root
roles:- nginx
检测:
ansible-playbook site.yml —syntax-check
playbook: site.yml
执行脚本:
ansible-playbook site.yml
如有报错根据报错提示进行修正
随后查看被控制机即可或
ansible web -m shell -a “ss -antpl”
