批量管理剧本编写规范
剧本组成部分:
1)host 定义需要管理主机信息 参照/etc/ansible/hosts
2)task 定义具体需要执行任务信息 需要依靠各种模块功能完成任务
编写语法规范:
3个要求:
1)满足缩进要求:
举例:
host:
oldboy
oldgirl
task:
name:01
yum:
name:httpd
state:installed
2)满足字典要求(key: value):需要用冒号分割。同一行时冒号后有空格,不同行时冒号后面无需加空格
举例:
host: oldboy
task:
name: xxx
3)满足列表要求:需要将同级别或功能配置参数前加短横线(空格)
举例:
- host: oldboy
task:
- name:01
yum:
name:httpd
state:installed
- name: 02
copy:
- name: 03
file:
编写简单剧本:一键化部署rsync备份
准备环境:剧本执行过程幂等性不强
客户端主机:web01 web02
服务端主机:backup
第一个历程:定义主机清单信息
[root@m01 scripts]# vim /etc/ansible/hosts
[rsyncserver]
172.16.1.41
[rsynclient]
172.16.1.7
172.16.1.8
PS:提前分发公钥文件
第二个历程:编写剧本文件
cat /etc/ansible/ansible_playbook/test-01.yaml
- hosts: rsyncserver
tasks:
- name: 01-下载软件程序
yum:
name: rsync
state: installed
- name: 02-发送配置文件
copy:
src: /etc/ansible/ansibel_playbook/rsyncd.conf.tmplate
dest: /etc/rsyncd.conf
- name: 03-创建虚拟用户信息
user:
name: rsync
shell: /sbin/nologin
create_home: no
- name: 04-创建备份存储目录
file:
path: /backup
state: directory
owner: rsync
group: rsync
- name: 05-创建密码文件信息
copy:
content: rsync_backup:zaizai
dest: /etc/rsync.password
mode: 0600
- name: 06-启动服务程序
service:
name: rsyncd
state: started
enabled: true
- hosts: rsynclient
tasks:
- name: 01-下载软件程序
yum:
name: rsync
state: installed
- name: 05-创建密码文件信息
copy:
content: zaizai
dest: /etc/rsync.password
mode: 0600
第三个历程:检测剧本文件
监测语法信息:
[root@m01 ansible_playbook]# ansible-playbook --syntax-check /etc/ansible/ansible_playbook/test-01.yaml
playbook: /etc/ansible/ansible_playbook/test-01.yaml
执行:
[root@m01 ansible_playbook]# ansible-playbook /etc/ansible/ansible_playbook/test-01.yaml
PLAY [rsyncserver] **************************************************************************
TASK [Gathering Facts] **********************************************************************
ok: [172.16.1.41]
TASK [01-下载软件程序] ****************************************************************************
ok: [172.16.1.41]
TASK [02-发送配置文件] ****************************************************************************
changed: [172.16.1.41]
测试执行效果:
[root@web01 ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
sending incremental file list
hosts
sent 140 bytes received 43 bytes 366.00 bytes/sec
total size is 158 speedup is 0.86
批量管理剧本编写方法
1)在剧本中设置变量信息
作用说明:可以方便剧本中部分关键信息调整变化
需求:需要创建一个目录,并在创建后目录中创建文件 并设置文件权限
第一种方式:在剧本中直接设置变量
第二种方式:在主机清单配置文件中设置变量
主机清单自定义变量方法:
1) 单独设置主机变量(/etc/ansible/host)
172.16.1.7 name_info="oldgirl"
2)对主机组设置变量
[oldboy]
172.16.1.7
172.16.1.8
[oldboy:vars]
172.16.1.7 name_info="oldgirl"
第三种方式:在命令执行过程中设置变量
ansible-playbook -e name_info="oldboy" test-02.yaml
2)在剧本中设置注册信息
作用说明:可以对剧本操作任务有提示输出信息
vim test-03-剧本注册功能.yaml
3)在剧本中设置判断信息
作用说明:可以根据识别不同主机硬件信息或不同主机系统情况,做不同的处理
如何判断:setup模块收集到网络信息做判断
常用判断条件信息:
ansible_all_ipv4_addresses: 仅显示ipv4的信息。
ansible_devices: 仅显示磁盘设备信息。
ansible_distribution: 显示是什么系统,例:centos, suse等。
ansible_distribution_major_version: 显示是系统主版本。
ansible_distribution_version: 仅显示系统版本。
ansible_machine: 显示系统类型,例:32位,还是64位。
ansible_ethx: 仅显示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个数(只显示总的个数)。
例如:不同主机创建不同目录
web
172.16.1.7 创建一个web01目录
172.16.1.8 创建一个web02目录
172.16.1.9 创建一个web03目录
vim test-04-剧本判断功能.yaml
- host: web
tasks:
- name: 不同主机创建不同目录-web01
file:
path: /web01
state: directory
when: ansible_eth37.ipv4.address == "172.16.1.7"
- name: 不同主机创建不同目录-web02
file:
path: /web02
state: directory
when: ansible_eth37.ipv4.address == "172.16.1.8"
- name: 不同主机创建不同目录-web03
file:
path: /web03
state: directory
when: ansible_eth37.ipv4.address == "172.16.1.9"
vim /etc/ansible/hosts
[web]
172.16.1.7
172.16.1.8
172.16.1.9
vim test-04-剧本判断功能.yaml
- host: web
tasks:
- name: 不同主机创建不同目录-web01
file:
path: /web01
state: directory
when: ansible_eth37.ipv4.address == "172.16.1.7"
- name: 不同主机创建不同目录-web02
file:
path: /web02
state: directory
when: ansible_eth37.ipv4.address == "172.16.1.8"
- name: 不同主机创建不同目录-web03
file:
path: /web03
state: directory
when: ansible_eth37.ipv4.address == "172.16.1.9"
vim /etc/ansible/hosts
[web]
172.16.1.7
172.16.1.8
172.16.1.9
单一条件做判断:
when: ansible_eth1.ipv4.address == "172.16.1.7"
多个条件做判断:与 或 关系
ansible_eth1.ipv4.address == "172.16.1.7"
ansible_distribution == "CentOS"
when:(ansible_eth1.ipv4.address == "172.16.1.7") and (ansible_distribution == "CentOS")
when:(ansible_eth1.ipv4.address == "172.16.1.7") or (ansible_distribution == "CentOS")
4)在剧本中设置循环信息
作用说明:可以利用循环功能简化剧本编辑信息
在被管理主机上 创建3个用户 oldbaby01 oldbaby02 oldbaby03
单一变化信息进行循环:
vim test-05-剧本循环功能.yaml
- hosts: 172.16.1.7
tasts:
- name: 创建用户
user:
name: "{{ item }}"
with_items:
- oldbaby01
- oldbaby02
- oldbaby03
在被管理主机上 创建3个用户
olddog01 uid=7771 shell=/bin/bash
olddog02 uid=7772 shell=/sbin/nologin
olddog03 uid=7773 shell=/bin/sh
多个变化信息进行循环
- hosts: 172.16.1.7
tasts:
- name: 创建用户
user:
name: "{{ item.info }}"
uid: "{{ item.id }}"
shell: "{{ item.login }}"
loop:
- { info: 'olddog01', id: '7771', login; '/bin/bash' }
- { info: 'olddog02', id: '7772', login; '/sbin/nologin' }
- { info: 'olddog03', id: '7773', login; '/bin/sh' }
5)在剧本中设置错误忽略
作用说明:提高剧本执行的幂等性
ignore_errors: yes
- hosts: 172.16.1.7
tasts:
- name: 创建用户
user:
name: "{{ item.info }}"
uid: "{{ item.id }}"
shell: "{{ item.login }}"
loop:
- { info: 'olddog01', id: '7771', login; '/bin/bash' }
- { info: 'olddog02', id: '7772', login; '/sbin/nologin' }
- { info: 'olddog03', id: '7773', login; '/bin/sh' }
ignore_errors: yes
- name:创建目录信息
file:
path: /oldboy
state: directory
6)在剧本中设置标签信息
作用说明:可以对指定任务信息做标记
- hosts: 172.16.1.7
tasts:
- name: 创建用户
user:
name: "{{ item.info }}"
uid: "{{ item.id }}"
shell: "{{ item.login }}"
loop:
- { info: 'olddog01', id: '7771', login; '/bin/bash' }
- { info: 'olddog02', id: '7772', login; '/sbin/nologin' }
- { info: 'olddog03', id: '7773', login; '/bin/sh' }
ignore_errors: yes
tags: create_user
- name:创建目录信息
file:
path: /oldboy
state: directory
- name: 安装软件程序
yum:
name: nginx
state: installed
- name: 启动服务程序
service:
name: nginx
state: started
方式一:选择标记的任务进行执行
ansible_playbook -t create_user test-07-剧本标签功能.yaml
方式二:跳过标记功能
ansible_playbook --skip-tags create_user test-07-剧本标签功能.yaml
7)剧本执行加速功能
当剧本有判断功能时不能使用该功能
- hosts: web
gather_facts: no
tasts:
- name: 创建用户
user:
name: "{{ item.info }}"
uid: "{{ item.id }}"
shell: "{{ item.login }}"
loop:
- { info: 'olddog01', id: '7771', login; '/bin/bash' }
- { info: 'olddog02', id: '7772', login; '/sbin/nologin' }
- { info: 'olddog03', id: '7773', login; '/bin/sh' }
ignore_errors: yes
tags: create_user
- name:创建目录信息
file:
path: /oldboy
state: directory
- name: 安装软件程序
yum:
name: nginx
state: installed
- name: 启动服务程序
service:
name: nginx
state: started
8)在剧本中设置触发信息
作用说明:当某个任务信息执行时,才会执行其他某个任务,当某个任务未操作时,其他任务无需执行
需求:创建备份服务剧本:
如果配置文件改动,就需要重启服务程序(A任务执行,B任务才执行)
- hosts: rsyncserver
tasks:
- name: 01-下载软件程序
yum:
name: rsync
state: installed
- name: 02-发送配置文件
copy:
src: /etc/ansible/ansibel_playbook/rsyncd.conf.tmplate
dest: /etc/rsyncd.conf
notify: restarted_rsync
- name: 03-创建虚拟用户信息
user:
name: rsync
shell: /sbin/nologin
create_home: no
- name: 04-创建备份存储目录
file:
path: /backup
state: directory
owner: rsync
group: rsync
- name: 05-创建密码文件信息
copy:
content: rsync_backup:zaizai
dest: /etc/rsync.password
mode: 0600
- name: 06-启动服务程序
service:
name: rsyncd
state: started
enabled: true
handler:
name: restarted_rsync
service:
name:rsyncd
state:restarted
效果: