常用模块说明

  • command : 在远程主机上执行命令操作 默认模块
  • shell : 在远程主机上执行命令操作 万能模块 在剧本中有时不能反复执行!!!
  • script : 批量执行本地脚本
  • copy : 用于批量分发传输数据信息
  • fetch : 用于将远程主机数据进行拉取到本地管理主机
  • file : 修改数据属性信息/创建数据信息
  • yum : 用于安装和卸载软件包
  • service : 用于管理服务的运行状态
  • user : 用于批量创建用户并设置密码信息
  • mount : 用于批量挂载操作
  • cron : 批量部署定时任务信息
  • ping : 远程管理测试模块

ansible服务剧本功能

主机名称和IP地址规划

服务 主机名 eth0网卡IP eth1网卡IP 软件
防火墙服务器 firewalld 10.0.0.81 172.16.1.81 firewalld
负载均衡服务器 lb01 10.0.0.5 172.16.1.5 nginx,keepalived
负载均衡服务器 lb02 10.0.0.6 172.16.1.6 nginx,keepalived
web服务器 web01 10.0.0.7 172.16.1.7 nginx
web服务器 web02 10.0.0.8 172.16.1.8 nginx
web服务器 web03 10.0.0.9 172.16.1.9 nginx
存储服务器 nfs01 10.0.0.31 172.16.1.31 nfs
备份服务器 backup 10.0.0.41 172.16.1.41 rsync
数据库服务器 db01 10.0.0.51 172.16.1.51 mysql,mariaDB
批量管理服务器 m01 10.0.0.61 172.16.1.61 ansible
跳板机服务器 jumpserver 10.0.0.71 172.16.1.71 jumpserver
监控服务器 zabbix 10.0.0.72 172.16.1.72 zabbix
缓存服务器 暂无 暂无 暂无 暂无

剧本的组成部分

QQ图片20191219120729.png

剧本的语法规范

  1. 空格规范: 实现缩进功能
  2. 冒号规范: 实现键值定义
  3. 横线规范: 实现列表显示

剧本编写常见错误

  1. 剧本语法规范是否符合(空格 冒号 短横线)
  2. 剧本中模块使用是否正确
  3. 剧本中一个name标识下面只能写一个模块任务信息
  4. 剧本中尽量不要大量使用shell模块

利用剧本完成服务一键化部署

一键配置rsync服务端和客户端

#服务端
- hosts: 172.16.1.41
  tasks: 
    - name: 01-install rsync
      yum: name=rsync state=installed
    - name: 02-push conf file
      copy: src=/tmp/rsyncd.conf dest=/etc/
    - name: 03-useradd rsync
      user: name=rsync shell=/sbin/nologin create_home=no
    - name: 04-touch rsync.password
      copy: content='rsync_backup:123456' dest=/etc/rsync.password mode=600
    - name: 05-mkdir /backup
      file: dest=/backup owner=rsync group=rsync state=directory
    - name: 06-start enable rsyncd
      service: name=rsyncd state=started enabled=yes

#客户端
- hosts: 172.16.1.31
  tasks:
    - name: 01-install rsync
      yum: name=rsync state=installed
    - name: 02-touch rsync.password
      copy: content='123456' dest=/etc/rsync.password mode=600
    - name: 03-check hosts
      shell: rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

配置主机清单

  • /etc/ansible/hosts

主机清单的配置方法

分组配置主机信息

[data]
172.16.1.31
172.16.1.41

[web]
172.16.1.7
  • 运行效果
[root@m01 ansible-playbook]# ansible data -a "hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01

172.16.1.41 | CHANGED | rc=0 >>
backup
[root@m01 ansible-playbook]# ansible web -a "hostname"
172.16.1.7 | CHANGED | rc=0 >>
web01

主机名符号匹配配置

[web]
172.16.1.[7:9]

#也可以在/etc/hosts文件配置好ip后使用主机名
#[web]
#web[01:03]
  • 运行效果
[root@m01 ansible-playbook]# ansible web -a "hostname"
172.16.1.7 | CHANGED | rc=0 >>
web01
172.16.1.8 | CHANGED | rc=0 >>
web02
172.16.1.9 | CHANGED | rc=0 >>
web03

跟上非标准远程端口

[web]
172.16.1.7:52113

#也可以在/etc/hosts文件配置好ip后使用主机名
#[web]
#web01:52113
  • 运行效果
[root@m01 ansible-playbook]# ansible web -a "hostname"
172.16.1.7 | CHANGED | rc=0 >>
web01

主机使用特殊的变量

#[web]
#172.16.1.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456

#嵌入式变量信息,将配置写入hosts文件
#[web:vars]
#ansible_ssh_host=172.16.1.7
#ansible_ssh_port=22
#ansible_ssh_user=root
#ansible_ssh_pass=123456
#[web]
#web01

#也可以不在/etc/hosts文件配置好ip
[web]
web01 ansible_ssh_host=172.16.1.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
  • 运行效果
[root@m01 ansible-playbook]# ansible web -a "hostname"
web01 | CHANGED | rc=0 >>
web01

主机组名嵌入配置

[rsync:children]
rsync_server
rsync_client

[rsync_server]
172.16.1.41

[rsync_client]
172.16.1.31
172.16.1.7
  • 运行结果
[root@m01 ~]# ansible rsync -a "hostname"
172.16.1.7 | CHANGED | rc=0 >>
web01
172.16.1.41 | CHANGED | rc=0 >>
backup
172.16.1.31 | CHANGED | rc=0 >>
nfs01
[root@m01 ~]# ansible rsync_server -a "hostname"
172.16.1.41 | CHANGED | rc=0 >>
backup

剧本的扩展功能配置

在剧本中设置变量信息

直接在剧本文件编写

#服务端
- hosts: rsync_server
  vars:
    backdir: /backup1
  tasks:
    - name: 01-install rsync
      yum: name=rsync state=installed
    - name: 02-push conf file
      copy: src=/tmp/rsyncd.conf dest=/etc/
    - name: 03-useradd rsync
      user: name=rsync shell=/sbin/nologin create_home=no
    - name: 04-touch rsync.password
      copy: content='rsync_backup:123456' dest=/etc/rsync.password mode=600
    - name: 05-mkdir /backup
      file: dest={{ backdir }} owner=rsync group=rsync state=directory
    - name: 06-start enable rsyncd
      service: name=rsyncd state=started enabled=yes

在命令行中进行指定

ansible-playbook --extra-vars=backdir=/backup2 rsync.yaml
ansible-playbook -e backdir=/backup2 rsync.yaml

在主机清单文件编写

[rsync_server]
172.16.1.41
[rsync_server:vars]
backdir=/backup3

[rsync_client]
172.16.1.7
172.16.1.31

变量优先级排序

  • 在主机清单文件编写
  • 直接在剧本文件编写
  • 在命令行中进行指定

如何全局设置变量

  • roles 剧本整合

在剧本中设置注册信息

设置服务端剧本,使用ss -lntup|grep rsync查看rsync服务是否启动

#服务端
- hosts: rsync_server
#  vars:
#    backdir: /backup1
  tasks:
    - name: 01-install rsync
      yum: name=rsync state=installed
    - name: 02-push conf file
      copy: src=/tmp/rsyncd.conf dest=/etc/
    - name: 03-useradd rsync
      user: name=rsync shell=/sbin/nologin create_home=no
    - name: 04-touch rsync.password
      copy: content='rsync_backup:123456' dest=/etc/rsync.password mode=600
    - name: 05-mkdir /backup
      file: dest={{ backdir }} owner=rsync group=rsync state=directory
    - name: 06-start enable rsyncd
      service: name=rsyncd state=started enabled=yes
    - name: 07-check server
      shell: ss -lntup|grep rsync
      register: port_server
    - name: print server
      debug: msg={{port_server}}

其中会有一段结果为以下内容,选取stdout_lines的部分

TASK [print server] *************************************************************
ok: [172.16.1.41] => {
    "msg": {
        "changed": true, 
        "cmd": "ss -lntup|grep rsync", 
        "delta": "0:00:00.040566", 
        "end": "2019-12-19 20:11:16.812264", 
        "failed": false, 
        "rc": 0, 
        "start": "2019-12-19 20:11:16.771698", 
        "stderr": "", 
        "stderr_lines": [], 
        "stdout": "tcp    LISTEN     0      5         *:873                   *:*                   users:((\"rsync\",pid=1786,fd=3))\ntcp    LISTEN     0      5        :::873                  :::*                   users:((\"rsync\",pid=1786,fd=5))", 
        "stdout_lines": [
            "tcp    LISTEN     0      5         *:873                   *:*                   users:((\"rsync\",pid=1786,fd=3))", 
            "tcp    LISTEN     0      5        :::873                  :::*                   users:((\"rsync\",pid=1786,fd=5))"
        ]
    }
}

改动后的服务端剧本为以下内容

#服务端
- hosts: rsync_server
#  vars:
#    backdir: /backup1
  tasks:
    - name: 01-install rsync
      yum: name=rsync state=installed
    - name: 02-push conf file
      copy: src=/tmp/rsyncd.conf dest=/etc/
    - name: 03-useradd rsync
      user: name=rsync shell=/sbin/nologin create_home=no
    - name: 04-touch rsync.password
      copy: content='rsync_backup:123456' dest=/etc/rsync.password mode=600
    - name: 05-mkdir /backup
      file: dest={{ backdir }} owner=rsync group=rsync state=directory
    - name: 06-start enable rsyncd
      service: name=rsyncd state=started enabled=yes
    - name: 07-check server
      shell: ss -lntup|grep rsync
      register: port_server
    - name: print server
      debug: msg={{ port_server.stdout_lines }}

只显示rsync服务的内容,这样就可以确认rsync服务是否启动

TASK [print server] *************************************************************
ok: [172.16.1.41] => {
    "msg": [
        "tcp    LISTEN     0      5         *:873                   *:*                   users:((\"rsync\",pid=1786,fd=3))", 
        "tcp    LISTEN     0      5        :::873                  :::*                   users:((\"rsync\",pid=1786,fd=5))"
    ]
}

在剧本中设置判断信息

  • 设置两个创建文件的操作,并设置when
  • 设置debug输出ip信息
#客户端
- hosts: rsync_client
  tasks:
    - name: 01-install rsync
      yum: name=rsync state=installed
    - name: 02-touch rsync.password
      copy: content='123456' dest=/etc/rsync.password mode=600
    - name: test touch
      copy: content='{{ ansible_eth0.ipv4.address }}' dest=/tmp/nfs.txt
      when: (ansible_hostname == "nfs01")
    - name: test touch
      copy: content='{{ ansible_eth0.ipv4.address }}' dest=/tmp/web.txt
      when: (ansible_hostname == "web01")
    - name: print server
      debug: msg={{ ansible_eth0.ipv4.address }}
    - name: 03-check hosts
      shell: rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
  • 运行结果,有两个结果分别为skippingchanged,一条执行一条跳过
  • 输出结果中获得了ip
TASK [test touch] ***************************************************************
skipping: [172.16.1.7]
changed: [172.16.1.31]

TASK [test touch] ***************************************************************
skipping: [172.16.1.31]
changed: [172.16.1.7]

TASK [print server] *************************************************************
ok: [172.16.1.7] => {
    "msg": "10.0.0.7"
}
ok: [172.16.1.31] => {
    "msg": "10.0.0.31"
}

获取内置变量方法

ansible rsync_server -m setup -a "filter=ansible_hostname"

常见主机信息

  • ansible_all_ipv4_addresses : 仅显示ipv4的信息
  • ansible_devices : 仅显示磁盘设备信息
  • ansible_distribution : 显示是什么系统
  • ansible_distribution_major_version : 显示是系统主版本
  • ansible_distribution_version : 仅显示系统版本
  • ansible_machine : 显示系统类型,32位,64位
  • ansible_eth0 : 仅显示eth0的信息
  • ansible_hostname : 仅显示主机名
  • ansible_kernel : 仅显示内核版本
  • ansible_lvm : 显示lvm相关信息
  • ansible_memtotal_mb : 显示系统总内存
  • ansible_memfree_mb : 显示可用系统内存
  • ansible_memory_mb : 详细显示内存情况
  • ansible_swaptotal_mb : 显示总的swap内存
  • ansible_swapfree_mb : 显示swap内存的可用内存
  • ansible_mounts : 显示系统磁盘挂载情况
  • ansible_processor : 显示cpu个数(具体显示每个cpu的型号)
  • ansible_processor_vcpus : 显示cpu个数(只显示总的个数)

可以在剧本中使用ansible_eth0.ipv4.address获得ip