xuol001 发表于 2018-7-29 10:45:32

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=&quot;-o StrictHostKeyChecking=no&quot;                  # 默认用这个_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 中例如&quot;install_dir_name: jutidejiaobenmingzi&quot;  
      2.2.2、创建脚本
vim /data/tmpansible/roles/echo/templates/scripts.sh###scripts.sh文件内容开始####!/bin/bashecho &quot;hello&quot; > /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 &quot;src=/data/1.txt dest=/tmp/1.txt.ansible mode=600&quot;

  查看node1、node2主机的/tmp目录,文件已经以1.txt.ansible重名民的方式传输成功。

  2、fetch模块(从node1拉取文件到ansible主机端)
  示例:# ansible all -m fetch -a &quot;src=/tmp/an.txt dest=/tmp&quot;
  
  3、command模块(在远程主机上执行命令,属于裸执行,非键值对显示;不进行shell解析。不支持管道功能)
  示例:# ansible all -m command -a &quot;ifconfig&quot;
  
  4、shell模块(由于commnad只能执行裸命令(即系统环境中有支持的命令),至于管道之类的功能不支持,shell模块可以做到。)
  示例:# ansible all -m shell -a &quot;ifconfig|grep eno&quot;
  
  5、file模块(设置文件属性(创建文件))
  path=目标路径      group 目录属组         owner 属主
  state=directory为目录,link为软件链接
  示例:创建目录:# ansible all -m file -a &quot;path=/var/tmp/hello.dir state=directory&quot;
  创建软连接文件:# ansible all -m file -a &quot;src=/tmp/hi.txtpath=/var/tmp/hi.link state=link&quot;
  
  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 &quot;minute=*/3 job='/usr/sbin/update time.windows.com &>/dev/null' name=update_time&quot;
  示例2:删除计划任务(结尾加state=absent为删除任务)
  # ansible all -m cron -a &quot;name=update_time state=absent&quot;
  
  
  7、yum模块(故名思义就是yum安装软件包的模块)
  enablerepo表示启用,    disablerepo禁用某repo库
  name 安装包名
  state (present' orinstalled', latest')表示安装, (absent' or `removed') 表示删除
  示例:通过安装epel扩展源并安装nginx
  # ansible all -m yum -a&quot;name=epel-release state=installed&quot;
  # ansible all -m yum -a&quot;name=nginx state=installed&quot;
  
  8、service模块(服务管理模块)
  name:服务名
  state:服务状态
  enabled: 是否开机启动 true|false
  runlevel: 启动级别 (systemed方式忽略)
  示例:开机启动nginx:# ansible all -m service -a &quot;name=nginx state=started enabled=true&quot;
  
  9、script模块(把本地的脚本传到远端执行;前提是到远端可以执行,不要把Linux下的脚本同步到windows下执行;)
  示例:直接在ansible上执行脚本
  
  # ansible all -m script -a &quot;/root/01/scripts/test.sh&quot;
  
  # cat /tmp/ansible.txt
  ansible script test!
  
  
  
  
页: [1]
查看完整版本: ansible playbook-13223089