ansible 学习命令详解
ansible 学习命令详解
一.什么是ansible?
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,
实现了批量系统配置、批量程序部署、批量运行命令等功能。
无客户端。
二.ansible工作原理
3
三.部署环境
(1)准备环境,准备好要部署的客户机(一台ansible,n台需要批量部署的主机)
ansible主机地址:192.168.65.140
需要部署的客户机(由于批量太多这里例举三台客户机)地址:192.168.65.138 192.168.65.142 192.168.65.143
(2)域名解析
进入到ansible主机 vim/etc/hosts
将需要部署的客户机地址解析加入进去:
192.168.65.138 host1
192.168.65.142 host2
192.168.65.143 host3
(3)ansible服务器安装
首先安装epel源,首先安装阿里源:
rm -rf /etc/yum.repos.d/* (清除源配置文件)
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 【安装阿里云的epel源(如果没有wget命令可以先yum -y install wget 装一个wget )】
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo (安装阿里云的centos7的repo文件)
然后,开始安装ansible: yum -y install ansble
(4)实现免密登陆客户机(可选)
ssh-keygen #生成密钥对
ssh-copy-id # 客户机IP地址
如果不往客户机上推送公钥的话也可以进入ansible配置文件给客户机增加用户名和密码依然可以实现免密登陆:
vi /etc/ansible/hosts
host[1:3]ansible_ssh_user='root' ansible_ssh_pass='wangning'
四.ansible基础
(1)定义主机清单:
vim/etc/ansible/hosts
在里面加入上面解析的客户机地址:host1 host2 host3
(2)测试连通性
ansible host1 -m ping -o #ansible:调用ansible命令
# host1:客户机一地址
# -m:指定模块
# ping:ping:
#ssh连通性测试
# -o:以行输出
注意ping和ssh:ping是探测ssh程序是否连接。
五.主机清单
(1)主机组
增加主机组:vim /etc/ansible/hosts
[webserver]
host1
host2
host3 # []:中括号定义主机组的名称,在里面填上主机组的名字,把客户机写到下面写在下面的客户机就属于这个主机组
测试主机组:ansible webserver -m ping -o #出现各个客户机的su'ccess证明测试成功
(2)增加用户名和密码和端口
进入配置文件:
vim /etc/ansible/hosts
【webserver】 # 客户机组名
host[1:3]ansible_ssh_user='root' ansible_ssh_pass='wangning' #给客户机添加用户和密码
测试:ansible webserver -m ping -o # 免用户名和密码成功
主机用户名和密码不同的设置方法:
【webserver】 # 客户机组名
host1:ansible_ssh_user='wangning' ansible_ssh_pass='wangning1' #给客户机一添加用户名和密码
host[2:3]ansible_ssh_user='root' ansible_ssh_pass='wangning' #给别的客户机添加用户和密码
如果客户机修改端口了的话ansible配置文件里面需要加上客户机端口
例:客户机一:
vim /etc/ssh/sshd_config
port 2222
systemctl restart sshd
ansible配置文件:
host1:ansible_ssh_user='wangning' ansible_ssh_pass='wangning1' ansible_ssh_port=2222 #客户机如果修改了端口只需要在ansible里面加上端口就OK了
(6).子分组
进入配置文件:
vim /etc/ansible/hosts
【apache】 #定义apache组
host1
【mysql】 #定义mysql组
host【2:3】
【webserver】 #将apache组和mysql组加入到webserver组里面
apache
mysql
(7).自定义主机列表
vim hostlist #定义一个主机列表文件
[webserver]
host1
host2
host3
测试:
ansible -i hostlist webserver -m ping -o
六.点对点模式
简介:
临时的,在ansible中是指需要快速执行的单条命令,并且不需要保存的命令。对于复杂的命令则为 playbook。
(1)shell模块
ansible webserver -m shell -a ‘hostname’ -o # -m:定义模块 shell:调用shell模块 # -a:制定参数 单引号里面写要干的事情
ansible host2 -m shell -a ‘yum -y install apache’ -o #在host2客户机上部署apache
(2)copy模块
ansible webserver -m copy -a ‘src=/tmp/wangning.txt dest=/tmp/wangning.txt mod=654 owner=root group=bin’-o
#src:源文件地址
#dest:目标文件地址
#mod:文件权限
#owner:属主
#group:属组
(3)用户模块
ansible webserver -m user -a 'name=wangning state=present' #创建用户:调用user模块创建一个wangning的用户
ansible webserver -m user -a 'name=wangning state=absent' #删除用户:
给客户机修改密码:
echo 'wangning' | openssl passwd -1 -stdin #生成密码:生成一个加密的wangning密码选项
ansible webserver -m user -a 'name=qianfeng password="$1$gJ9gAvue$SP0qLivrFtgRM27bE9USl1"' #修改密码:password后面就是刚才生成的wangning密码
(4)服务模块
ansible host2 -m service -a 'name=httpd state=started' #启动服务
ansible host2 -m service -a 'name=httpd state=stopped' #停止服务
ansible host2 -m service -a 'name=httpd state=restarted' #重启服务
ansible host2 -m service -a 'name=httpd state=started enabled=yes' #开机自启
ansible host2 -m service -a 'name=httpd state=started enabled=no' #永久关闭
(4)软件包管理
ansible host1 -m yum -a 'name="*" state=latest' #升级所有包
ansible host2 -m yum -a 'name="httpd" state=latest' #安装apache
(3)文件模块
ansible host1 -m file -a 'path=/tmp/88.txt mode=777 state=touch' #创建文件
ansible host1 -m file -a 'path=/tmp/99 mode=777 state=directory' #创建目录
七.YAML-YAML Ain’t Markup Language-非标记语言
简介:
ansible的playbook采用yaml语法,所以当要写好剧本的话必须懂得YAML语言
(1)语法
列表:
使用"- "(减号加一个或多个空格)作为列表项。yaml的列表在playbook中极重要,必须得搞清楚它的写法。
例如:
字典:
使用"冒号+空格"分隔,即key: value。它一般当作列表项的属性
例如:
(2)通过YAML编写一个完成web部署的剧本,配置,启动的全过程。
准备工作:
ansible all -m yum -a 'name=httpd state=removed' -o #清理环境
yum -y install httpd #安装apache 准备配置文件
mkdir apache
cd apache
cp -rf /etc/httpd/conf/httpd.conf .
grep '^Listen' httpd.conf #修改配置文件监听端口,用作推送
编写剧本:
vim apache.yaml
- hosts: host2 #指定客户机
tasks: #任务(下面是任务内容),一般情况每个yaml文件内都得有这个任务
- name: install apache packages #指定要做的任务(安装apache)
yum: name=httpd state=present #执行任务的命令
- name: copy apache conf #拷贝配置文件
copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
- name: ensure apache is running #启动apache服务
service: name=httpd state=started enabled=yes
测试:
ansible-playbook apache.yaml --syntax-check # 检验语法是否有错误
ansible-playbook apache.yaml #测试
handlers (处理程序)
简介:
如果修改了配置文件的话,再次执行ansible就会失败,因为修改了配置文件之后需要刷新配置文件,然而这么些台客户机不可能每次都刷新,所以产生了我们这个处理程序
添加处理程序:
#notify:触发器,引用handlers
八.Role 角色扮演
简介:
roles则是在ansible中,playbooks的目录组织结构。
将代码或文件进行模块化,成为roles的文件目录组织结构,
易读,代码可重用,层次清晰。
通过role远程部署nginx配置:
目录结构:
#roles:主目录名
#site.yaml:主文件
#nginx:存放的是ansible部署nginx的内容
#files:存放网页的目录
#handlers:存放处理程序的目录
#tasks:存放ansible主任务的目录
#templates:金甲模板,里面存放的是模板的ansible执行文件
#vars:存放变量的目录
准备好目录结构之后,安装上nginx并拷贝nginx的配置文件到金甲模板目录中:
yum install -y nginx && cp /etc/nginx/nginx.conf roles/nginx/templates/nginx.conf.j2
编写任务:
vim roles/nginx/tasks/main.yaml
---
- name install epel-release
yum: name=epel-release state=latest
- name: install nginx packge
yum: name=nginx state=latest
- name: copy index.html
copy: src=index.html dest=/usr/share/nginx/html/index.html
- name: copy nginx.conf template
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
- name: make sure nginx service running
service: name=nginx state=started enabled=yes
准备配置文件:
vim roles/nginx/templates/nginx.conf.j2 #进入到金甲模板里的拷贝过来的配置文件
worker_processes {{ ansible_processor_cores }}; #调用内部已知变量
worker_connections {{ worker_connections }}; #自定义变量
编写变量:
vim roles/nginx/vars/main.yaml #进入到变量目录的剧本文件
worker_connections: 10240
编写处理程序:
vim roles/nginx/handlers/main.yaml #进入到处理程序的剧本
--- #剧本开头指定 ---
- name: restart nginx
service: name=nginx state=restarted
编写主剧本:
vim roles/site.yaml #进入到主剧本
- hosts: host4 #指定客户机
roles: #调用roles
- nginx #执行nginx
实施:
cd /roles #进入到roles目录
ansible-playbook site.yaml --syntax-check #测试剧本
ansible-playbook site.yaml #实施剧本
若有问题咨询欢迎大家联系我:
邮箱:Wangmouren1997@163.com
QQ:1586787265