ansible playbook-13223089
参考资料:Ansible Playbook 介绍(https://blog.csdn.net/CityzenOldwang/article/details/72628895)
ansible playbook核心元素详解(https://blog.csdn.net/nextkara/article/details/72863264)
ansible playbook详解(http://www.mamicode.com/info-detail-1240734.html)
1、关于Ansible
Ansible是一个部署工具;Ansible通过SSH协议实现远程节点和管理节点之间的通信。
理论上说,只要管理员通过ssh登录到一台远程主机上能做的操作,Ansible都可以做到。
安装前操作:
# ansible --help #查看帮助
# ansible --version # 检查ansible是否安装
ansible 2.4.0
config file = None
configured module search path =
ansible python module location = /usr/lib/python2.7/site-packages/ansible-2.4.0-py2.7.egg/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Nov 20 2015, 02:00:19)
ansible playbook实践
一、安装:(使用yum或pip方式)
Ansible是python开发的,故依赖一些python库和组件,如:paramiko,PyYaml和jinja三个关键组件;
只要机器上安装了 Python 2.6 或 Python 2.7 (windows系统不可以做控制主机),都可以运行Ansible.
安装ansible很简单,可通过git从githu上直接获取代码,也可以像redhat/CentOS上通过yum进行安装。
方式一:
yum install epel-release -y yum install ansible -y 方式二:
yum install ansible jinja2 -y pip install ansible jinja2
备注:1.只需在执行机器上安装即可,被执行机器无需安装
2.jinja2为ansible所需要的模块
使用 ansible --version 来查看是否安装完成
ansible使用格式:
# ansible all -m shell -a "ifconfig|grep eno16777736"
172.17.0.102 | SUCCESS | rc=0 >>
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu 1500
172.17.0.112 | SUCCESS | rc=0 >>
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu 1500
172.17.0.105 | SUCCESS | rc=0 >>
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu 1500
二、开始配置:
1)需求:准备2-3台机器,使用ansible playbookecho.yml发送任务到每台机器上运行脚本。
1.1、创建ansible相关文件及文件夹:
mkdir /data/ansible #创建任务目录
mkdir /data/ansible/config #ansible任务的hosts配置文件目录
mkdir /data/ansible/logs #ansible任务的日志目录
touch /data/ansible/ansible.cfg #ansible任务的配置文件
*****************************
1.2、制作ansible主机相关:(被执行主机信息位置/etc/ansible/hosts可能不是/data/ansible/config/hosts)
1)创建hosts文件并登记被执行主机的信息:
#使用admin账号,[ ]内配置一个组名
vim /data/ansible/config/hosts
###hosts文件内容开始###192.168.1.16 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=xxx192.168.2.30 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=xxx192.168.1.18 ansible_ssh_port=22 ansible_ssh_user=admin ansible_ssh_pass=xxx
ansible_connection=paramiko ###hosts文件内容结束###
解释:为组名
*****************************
1.3、编辑任务的配置文件:(ansible主配置文件ansible.cfg )
vim /data/tmpansible/ansible.cfg###ansible.cfg文件内容开始###host_key_checking = False # 默认用这个callback_plugins = /usr/share/ansible_plugins/callback_plugins # 默认用这个ANSIBLE_SSH_ARGS="-o StrictHostKeyChecking=no" # 默认用这个_forks=5 # 默认用这个,并发任务数inventory = /data/tmpansible/config/hosts # 要修改为任务目录(参考上面创建的目录)log_path= /data/tmpansible/logs/app.log # 要修改为任务目录(参考上面创建的目录)timeout = 10###ansible.cfg文件内容结束### *******************************
三、编辑任务相关:
2.1、任务echo.yml相关:vim /data/tmpansible/echo.yml (ansible任务的执行模板。为yml文件格式)
###echo.yml内容开始###
---
- name:操作三台主机
hosts:hosts_group #对应config/hosts下的3台主机组的名称
roles: #角色(echo为任务的角色)
- echo #ansible会执行roles下面的echo任务的tasks
###echo.yml内容结束###
2.2、任务roles相关
mkdir -p/data/tmpansible/roles/echo/{templates,tasks,files} #批量递增创建templates,tasks,files这三个文件夹
#echo为具体roles的任务,对应echo.yml中的echo;templates为ansible的任务的模板,可以使用宏变量;
#tasks为具体的任务,默认会执行它下面的任务;files为tasks会使用的文件;
2.2.1、编辑任务执行文件main.yml #千万不要自定义文件名,这个才是我们实际需要操作的内容(拷贝文件、执行脚本之类)
vim /data/tmpansible/roles/echo/tasks/main.yml###main.yml文件内容开始### ---
- name: (Checkbundle) Step 1, Transfer domain.txt(拷贝文件)
copy: src=文件名 dest=目录/文件名
- name: (Checkbundle) Step 2, Transfer scripts(拷贝脚本)
#这个是将templates目录下的文件复制过去,里面可以嵌套更改一些变量 (模板:dest=**/scripts/**.sh)
template: src=脚本名 dest=目录/脚本名 - name: (Checkbundle) Step 3,
#这个是执行脚本(模板:nohup sh **/scripts/**.sh &)
shell: nohup sh 目录/脚本名 & ###main.yml文件内容结束###
**************注 释**********************
# {{ install_dir_name }} 等就是变量,实际操作的时候请替换成真正的脚本名字,具体脚本中也能增加变量# 变量的索引地址可以放在 /data/tmpansible/group_vars/all 中例如"install_dir_name: jutidejiaobenmingzi"
2.2.2、创建脚本
vim /data/tmpansible/roles/echo/templates/scripts.sh###scripts.sh文件内容开始####!/bin/bashecho "hello" > /tmp/echo###scripts.sh文件内容结束###
2.2.3、执行任务
cd /data/ansible/ ansible-playbook echo.yml
#ansible-playbook -C echo.yml可查看执行步骤
#然后观察屏幕输出或者logs下的日志 四、ansible常用模块及用法
官方模块列表:https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html
1、copy模块(从本地copy文件分发到目录主机路径 )
src= 源文件路径
dest= 目标路径
注意:src= 路径后面带/ 表示带里面的所有内容复制到目标目录下,不带/是目录递归复制过去
content= 自行填充的文件内容
owner 属主 group 属组 mode权限
示例:# ansible all -m copy -a "src=/data/1.txt dest=/tmp/1.txt.ansible mode=600"
查看node1、node2主机的/tmp目录,文件已经以1.txt.ansible重名民的方式传输成功。
2、fetch模块(从node1拉取文件到ansible主机端)
示例:# ansible all -m fetch -a "src=/tmp/an.txt dest=/tmp"
3、command模块(在远程主机上执行命令,属于裸执行,非键值对显示;不进行shell解析。不支持管道功能)
示例:# ansible all -m command -a "ifconfig"
4、shell模块(由于commnad只能执行裸命令(即系统环境中有支持的命令),至于管道之类的功能不支持,shell模块可以做到。)
示例:# ansible all -m shell -a "ifconfig|grep eno"
5、file模块(设置文件属性(创建文件))
path=目标路径 group 目录属组 owner 属主
state=directory为目录,link为软件链接
示例:创建目录:# ansible all -m file -a "path=/var/tmp/hello.dir state=directory"
创建软连接文件:# ansible all -m file -a "src=/tmp/hi.txtpath=/var/tmp/hi.link state=link"
6、cron模块(通过cron模块对目标主机生成计划任务)
分(minute)时(hour)日(day)月(month)周(week)
name=(本次计划任务的名称)
state=present生成(默认)|absent 删除(基于name)
示例1:对所有机器执行任务:每隔3分钟从time.windows.com同步时间(因为cron默认是生成任务,结尾不加state=present也表示生成任务)
# ansible all -m cron -a "minute=*/3 job='/usr/sbin/update time.windows.com &>/dev/null' name=update_time"
示例2:删除计划任务(结尾加state=absent为删除任务)
# ansible all -m cron -a "name=update_time state=absent"
7、yum模块(故名思义就是yum安装软件包的模块)
enablerepo表示启用, disablerepo禁用某repo库
name 安装包名
state (present' orinstalled', latest')表示安装, (absent' or `removed') 表示删除
示例:通过安装epel扩展源并安装nginx
# ansible all -m yum -a"name=epel-release state=installed"
# ansible all -m yum -a"name=nginx state=installed"
8、service模块(服务管理模块)
name:服务名
state:服务状态
enabled: 是否开机启动 true|false
runlevel: 启动级别 (systemed方式忽略)
示例:开机启动nginx:# ansible all -m service -a "name=nginx state=started enabled=true"
9、script模块(把本地的脚本传到远端执行;前提是到远端可以执行,不要把Linux下的脚本同步到windows下执行;)
示例:直接在ansible上执行脚本
# ansible all -m script -a "/root/01/scripts/test.sh"
# cat /tmp/ansible.txt
ansible script test!
页:
[1]