[Ansible]-02 剧本编写服务项目.
第一章 Ansible剧本介绍
1.1 什么是playbook剧本
Ansible剧本:
一系列的任务按照我们期望的结果编排在一起
playbook组成:
hosts: 定义主机角色
tasks: 具体执行的任务
简单理解:不同的模块去完成一件事
举例:
- 需要执行的主机: nfs
任务:
- 任务1: 创建用户
动作: 创建用户的命令
- 任务2: 创建目录
动作: 创建目录的命令
1.2 playbook剧本的优势
1.减少重复命令的书写:ansible backup -m
2.简洁清晰好理解
3.功能强大,可以控制流程,比如:判断,循环,变量,标签
4.可以复用
5.提供语法检查以及模拟执行
1.3 剧本编写项目规划
1)基础环境配置规划:
下载源文件信息优化
常用软件包安装优化
安全服务的关闭优化
用户信息的统一规划
系统目录信息的统一
总之是每台主机都需要完成的工作
2)应用服务部署规划
3)日常批量操作规划
4)日常信息收集规划
第二章 剧本的格式书写要求
2.1 YAML格式特点
1.严格的缩进表示层级关系
2.不要使用tab缩进
3.: 后面一定要有空格
4.- 后面一定要有空格
5.文件后缀名需要改为yaml或yml,vim可以智能高亮提示
2.2 剧本的组成及编写规范
组成:
hosts: 需要执行的主机
tasks: 需要执行的任务
name: 任务名称
编写规范:
1.合理的书写缩进,一般两个空格表示一个缩进关系
标题一:
标题二:
标题三:
2.冒号的使用方法:
hosts: 192.168.81.162
task:
yum: name=xx
PS:使用冒号时后面要有空格信息;以冒号结尾,冒号信息出现在注释说明中,后面不需要加上空格
3.短横线应用 -(列表功能)
- 张三
男
- 爱打游戏
- 爱运动
- 江苏
PS:当具有并列属性时可以使用短横线构成列表,横线后面要有空格
2.3 剧本执行使用方法
1)检查剧本语法
ansible-playbook --syntax-check test.yml
2)剧本模拟执行
ansible-playbook -C test.yml
3)剧本真实运行
ansible-playbook test.yml
4)识别主机清单
ansible-playbook -i /etc/ansible/hosts_rsync test.yml
5)检查这个任务执行的主机对象
ansible-playbook --list-hosts test.yaml
6)检查这个剧本需要执行哪些任务
ansible-playbook --list-tasks test.yaml
2.4 剧本执行错误排查思路
1)找出剧本中出现问题关键点
2)将剧本中的操作转换成模块进行操作
3)将模块的功能操作转换成linux命令
-> 在本地管理主机上执行命令测试
-> 远程被管理主机上执行命令测试
第三章 实战演练-编写Rsync剧本
3.0 环境准备
主机清单模拟:
vim /etc/ansible/hosts
[rsync:children]
rsync_server
rsync_client
[rsync_server]
192.168.81.165
[rsync_client]
192.168.81.162
192.168.81.163
目录规划:
[root@m01:/etc/ansible]# tree
.
├── ansible.cfg
├── ansible-playbook
│ └── rsync_install.yml
├── hosts
├── roles
└── server_file
└── rsync_server
├── rsyncd.conf
└── rsync.password
3.1 命令行模式的编写
rsync服务端操作:
#1.安装rsync软件
ansible backup -m yum -a "name=rsync state=installed"
#2.拷贝编写的配置文件
ansible backup -m copy -a "src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/"
#3.创建用户
ansible backup -m user -a "name=rsync create_home=no shell=/sbin/nologin"
#4.创建数据目录并更改授权
ansible backup -m file -a "dest=/backup state=directory owner=rsync group=rsync"
#5.创建密码文件
ansible backup -m copy -a "content='rsync_backup:123456' dest=/etc/rsync.password mode=600"
#6.启动服务
ansible backup -m systemd(service) -a "name=rsyncd state=started enabled=yes"
客户端操作:
ansible 客户端地址 -m copy -a "content='123456' dest=/etc/rsync.password mode=600"
3.2 改写成剧本
#创建剧本存放目录
# mkdir /etc/ansible/ansible-playbook
# vim /etc/ansible/ansible-playbook/rsync_install.yaml
- hosts: rsync_server
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf file
copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
- name: 03-create user
user: name=rsync create_home=no shell=/sbin/nologin
- name: 04-create backup dir
file: path=/backup state=directory owner=rsync group=rsync
- name: 05-create password file
copy: content='rsync_backup:123456' dest=/etc/rsync.password mode=600
- name: 06-start rsync server
systemd: name=rsyncd state=started enabled=yes
- hosts: rsync_client
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-create password file
copy: content=123456 dest=/etc/rsync.password mode=600
- name: 03-start rsync server
systemd: name=rsyncd state=started enabled=yes
- name: 04-create test file
file: dest=/tmp/test.txt state=touch
- name: 05-check test
shell: rsync -avz /tmp/test.txt rsync_backup@192.168.81.165::backup --password-file=/etc/rsync.password
3.3 模拟执行
ansible-playbook -C rsync_install.yaml
3.4 执行
ansible-playbook rsync_install.yaml
3.5 剧本编写常见错误:
01. 剧本语法规范是否符合(空格 冒号 短横线)
02. 剧本中模块使用是否正确
03. 剧本中一个name标识下面只能写一个模块任务信息
04. 剧本中尽量不要大量使用shell模块
第四章 剧本高级特性-变量(vars)
4.1 简介
自定义某个变量,在任务中被多次引用
从主机收集到系统信息里提取某个变量,比如IP地址,主机名
变量可以由字母、数字、下划线组成,必须以字母开头,且不能以ansible内置的关键字作为变量名。
4.2 设置变量的三种方法
方式一:直接在剧本文件编写(常用)
# vim /etc/ansible/ansible-playbook/rsync_install-变量信息.yaml
- hosts: rsync_server
vars:
backupdir: /backup
passfile: rsync.password
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf file
copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
- name: 03-create user
user: name=rsync create_home=no shell=/sbin/nologin
- name: 04-create backup dir
file: path={{ backupdir }} owner=rsync group=rsync
- name: 05-create password file
copy: content=rsync_backup:123456 dest=/etc/{{ passfile }} mode=600
- name: 06-start rsync server
systemd: naem=rsyncd state=started enabled=yes
- hosts: rsync_client
passfile: rsync.password
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-create password file
copy: content=123456 dest=/etc/{{ passfile }} mode=600
- name: 03-start rsync server
systemd: naem=rsyncd state=started enabled=yes
- name: 04-create test file
file: dest=/tmp/test.txt state=touch
- name: 05-check test
shell: rsync -avz /tmp/test.txt rsync_backup@192.168.81.165::backup --password=file=/etc/{{ passfile }}
方式二:在命令行中进行指定
#将方式一剧本中设置的变量注释掉
#方式二为临时变量
ansible-playbook -e backupdir=/data -e passfile=rsync-password rsync_server-变量信息.yaml
方式三:在主机清单文件编写
vim /etc/ansible/hosts
[rsync:children]
rsync_server
rsync_client
[rsync_server]
192.168.81.165
[rsync_server:vars]
backupdir=/data
passfile=rsync-password
[rsync_client]
192.168.81.162
192.168.81.163
[rsync_client:vars]
passfile=rsync.password
4.3 三种变量设置方式优先级
三种变量设置方式都配置了,三种方式的优先级:
最优先: 命令行变量设置
次优先: 剧本中变量设置
最后: 主机清单变量设置
4.4 ansible内置变量
1)获取内置变量方法:
ansible web01 -m setup -a "filter=ansible_hostname"
2)内置变量:
其他ansible内置变量
ansible_facts.eth0.ipv4.address
ansible_facts.eth1.ipv4.address
ansible_nodename 节点名字
ansible_form_factor 服务器类型
ansible_virtualization_role 虚拟机角色(宿主机或者虚拟机)
ansible_virtualization_type 虚拟机类型(kvm)
ansible_system_vendor 供应商(Dell)
ansible_product_name 产品型号(PowerEdge R530)
ansible_product_serial 序列号(sn)
ansible_machine 计算机架构(x86_64)
ansible_bios_version BIOS版本
ansible_system 操作系统类型(linux)
ansible_os_family 操作系统家族(RedHat)
ansible_distribution 操作系统发行版(CentOS)
ansible_distribution_major_version 操作系统发行版主版本号(7)
ansible_distribution_release 操作系统发行版代号(core)
ansible_distribution_version 操作系统发行版本号(7.3.1611)
ansible_architecture 体系(x86_64)
ansible_kernel 操作系统内核版本号
ansible_userspace_architecture 用户模式体系(x86_64)
ansible_userspace_bits 用户模式位数
ansible_pkg_mgr 软件包管理器
ansible_selinux.status selinux状态
#--------------------------------------------
ansible_processor CPU产品名称
ansible_processor_count CPU数量
ansible_processor_cores 单颗CPU核心数量
ansible_processor_threads_per_core 每个核心线程数量
ansible_processor_vcpus CPU核心总数
ansible_memtotal_mb 内存空间
ansible_swaptotal_mb 交换空间
ansible_fqdn 主机的域名
ansible_default_ipv4.interface 默认网卡
ansible_default_ipv4.address 默认IP地址
ansible_default_ipv4.gateway 默认网关
********* json 格式 ********
ansible_devices 硬盘设备名
ansible_devices.vendor 硬盘供应商
ansible_devices.model 硬盘整列卡型号
ansible_devices.host 硬盘整列卡控制器
ansible_devices.size 设备存储空间
********* json 格式 ********
ansible_interfaces 网卡
ansible_{interfaces}.ipv4.address 网卡IP地址
ansible_{interfaces}.ipv6.0.address 网卡IPv6地址
ansible_{interfaces}.macaddress 网卡mac地址
3)常见主机信息
ansible_all_ipv4_addresses: 仅显示ipv4的信息。
ansible_devices: 仅显示磁盘设备信息。
ansible_distribution: 显示是什么系统,例:centos,suse等。
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个数(只显示总的个数)。
#获取子信息方法:
方法一:
- hosts: rsync
tasks:
- name: touch file
file: path=/etc/test01.txt state=touch
when: (ansible_eth1.ipv4.address == "192.168.81.165")
方法二:
- hosts: rsync
tasks:
- name: touch file
file: path=/etc/test01.txt state=touch
when: (ansible_eth1["ipv4"]["address"] == "192.168.81.165")
第五章 剧本高级特性-注册变量
5.0 功能介绍
默认情况下,playbook中的模块运行后返回值并不显示。如果我们需要显示,就可以使用注册变量的方法。用register关键字把返回值保存到变量中,再用debug模块显示该变量的值即可
5.1 应用场景
调试,回显命令执行的内容
把状态保存成变量,其他任务可以进行判断或引用
5.2 实战演练-注册信息
示例1:将rsync服务安装后输出其端口信息
vim /etc/ansible/ansible-playbook/rsync_install-注册变量.yaml
- hosts: rsync_server
tasks:
......省略.......
- name: 07-check server port info
shell: netstat -lntup|grep 873 #端口信息
register: get_server_port #注册端口信息变量
- name: display port info
debug: msg={{ get_server_port.stdout_lines }} #显示进程信息,表示服务已经正常启动
PS: 设置变量不能有空格信息
第六章 剧本高级特性-判断(when)
6.0 应用场景
对操作管理的主机信息进行判断
需要利用setup模块获取内置变量进行判断
6.1 官方地址
https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html
6.2 指定判断条件方法
(ansible_hostname == "nfs01")
(ansible_hostname == "web01")
#setup模块中显示被管理主机系统的详细信息
6.3 实战演练-rsync-判断
示例1:在rsync客户端中根据不同的主机名创建不同的备份测试文件
#首先修改rsync服务端模板文件,增加:
[web]
comment = "backup dir by nsthink"
path = /web
# vim /etc/ansible/ansible-playbook/rsync_server-判断.yaml
..........省略............
- hosts: rsync_client
passfile: rsync.password
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-create password file
copy: content=123456 dest=/etc/{{ passfile }} mode=600
- name: 03-start rsync server
systemd: naem=rsyncd state=started enabled=yes
- name: 03-create test nfs file
file: dest=/tmp/test_nfs.txt state=touch
when: (ansible_hostname == "nfs01")
- name: 04-create test web file
file: dest=/tmp/test_web.txt state=touch
when: (ansible_hostname == "web01")
- name: 05-check test backup
shell: rsync -avz /tmp/test_nfs.txt rsync_backup@192.168.81.165::backup --password-file=/etc/{{ passfile }}
when: (ansible_hostname == "nfs01")
- name: 06-check test web01
shell: rsync -avz /tmp/test_web.txt rsync_backup@192.168.81.165::web --password-file=/etc/{{ passfile }}
when: (ansible_hostname == "web01")
6.4 实战演练-nfs-判断
- hosts: nfs_client
tasks:
- name: create file for backup host
file: path=/tmp/192.168.81.165 state=directory
when: (ansible_hostname == "backup")
- name: create file for web01 host
file: path=/tmp/192.168.81.163 state=directory
when: (ansible_hostname == "web01")
#判断主机名是否为自己对应的主机名 最好先用ansible命令测试一下。
- hosts: 192.168.81.165
tasks:
- name: create file for 165 host
file: path=/tmp/centos state=directory
when: (ansible_distribution == "CentOS")
#判断系统是为是centos
6.5 注册变量和判断场景
场景:
判断所有机器/tmp/下有没有ip.txt的文件
如果有,打印出来内容并且格式为:
例如:web01 has ip.txt
内容为:
如果不存在:输出内容:nfs is nofile
参考解决方案:
- hosts: all
vars:
path1: /tmp/ip
tasks:
- name: test1
shell: 'cat {{path1}}'
register: retval
ignore_errors: true
- name: test2
debug:
msg: '{{ansible_hostname}} has {{path1}} , content is: {{retval.stdout}}'
when: retval is success
- name: test3
debug:
msg: '{{path1}} is nofile'
when: retval is failed
第七章 剧本高级特性-循环(with_items)
7.0 循环简介
1)定义完成多件相同任务可以循环,比如用到了多个相同的模块,可以进行合并同类项操作
2)在2.5版本之前的ansible中,大多数人习惯使用"with_X"风格的关键字操作循环,从2.6版本开始,官方开始推荐使用"loop"关键字代替"with_X"风格的关键字
功能:递归遍历数组,把每一个元素循环地赋值给item变量,每循环一次,就执行一次所在的task。
用法:with_items: 数组对象
7.1 官方文档
https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html?highlight=loop
7.2 应用场景
安装多个软件
创建多个目录
创建多个用户
复制多个目录
复制多个文件到不同的目录
不同的文件权限不一样
7.3 实战演练-rsync-循环
# vim /etc/ansible/ansible-playbook/rsync_server-循环.yaml
.........省略...........
- name: 02-push conf file & 05-create password file
#copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
#copy: content=rsync_backup:123456 dest=/etc/{{ passfile }} mode=600
copy: src=/etc/ansible/server_file/rsync_server/{{ item.src }} dest={{ item.dest }} mode={{ item.mode }}
with_items:
- { src: 'rsyncd.conf', dest: '/etc/', mode: '644' }
- { src: 'rsync.-password', dest: '/etc/', mode: '600' }
7.4 循环书写风格1:单行模式
- name: create_data
file: path=/data state=directory owner=www group=www
7.5 循环书写风格2:缩进模式
需求: 创建2个目录/data和/backup
以前的写法:
- name: create_data
file:
path: /data
state: directory
owner: www
group: www
- name: create_data
file:
path: /backup
state: directory
owner: www
group: www
循环实现:
- name: create_data
file:
path: "{{ item }}"
state: directory
owner: www
group: www
loop:
- /data
- /backup
7.6 循环书写风格3: 混合风格
- name: create_data
file: path="{{ item }}" state=directory owner=www group=www
loop:
- /data
- /backup
7.7 循环书写风格3: 多参数循环模式
- hosts: backup
tasks:
- name: create_data
file:
path: "{{ item.path }}"
state: directory
owner: www
group: www
mode: "{{ item.mode }}"
loop:
- { path: '/data' , mode: '755' }
- { path: '/backup', mode: '777' }
7.8 循环书写风格4: saltstack格式
- name: intall software
yum:
name: ['rsync', 'tree', 'wget' ]
state: installed
7.9 注意
注意1:with_items必须要与所在的task中的模块名对齐,而不能与tasks关键字对齐。
注意2:task中的模块经with_items循环执行后,执行结果会保存在results变量中,再利用with_items循环依次访问results中对应的元素即可
第八章 剧本高级特性-忽略错误(ignore_errors)&忽略采集
8.0 应用场景
默认playbook会检查命令和模块的返回状态,如遇到错误就中断playbook的执行
可以加入ignore_errors: yes忽略错误,继续解决下面的问题
8.1 实战演示-忽略错误
vim test_ignore_errors.yml
- hosts: all
remote_user: root
tasks:
- name: Ignore False
command: /bin/false
ignore_errors: yes
- name: touch new file
file: path=/tmp/nsthink_ignore state=touch
8.2 实战演示-忽略采集
cat test_忽略采集.yaml
- hosts: 192.168.81.165
gather_facts: no//关闭采集功能
tasks:
- name: 01:安装软件
yum: name=rsync state=installed
ignore_errors: yes
- name: 02:创建用户
user: name=rsync create_home=no shell=/sbin/nologin
ignore_errors: yes
tags: create_user
- name: 03:创建目录
file: path=/backup state=directory
tags: create_dir
#说明: 可以提升剧本执行效率; 如果剧本中有判断功能,不能使用此参数
第九章 剧本高级特性-选择标签(tags)
9.0 作用介绍
我们用ansible-playbook来执行yaml文件时,默认是把tasks下面的所有任务都执行。tags用来给tasks中的任务打上标签,这样我们再用ansible-playbook来执行yaml文件时,就可以利用标签来有选择性的执行某些任务了
9.1 添加标签-(参考)
# vim /etc/ansible/ansible-playbook/rsync_server-tag.yaml
- hosts: rsync_server
vars:
backupdir: /backup
passfile: rsync-password
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
tags: 01-install rsync
- name: 02-push conf file
copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
tags: 02-push conf file
- name: 03-create user
user: name=rsync create_home=no shell=/sbin/nologin
tags: 03-create user
.............省略..................
9.2 打印出playbook里要执行的所有标签
ansible-playbook --list-tags rsync_server-tag.yaml
9.3 指定运行某个标签
ansible-playbook -t '03-create user' rsync_server-tag.yaml
9.4 指定运行多个标签
ansible-playbook -t 01-install rsync,03-create user rsync_server-tag.yaml
9.5 指定不运行某个标签
ansible-playbook --skip-tags 03-create user rsync_server-tag.yaml
9.6 指定不运行多个标签
ansible-playbook --skip-tags 01-install rsync,03-create user rsync_server-tag.yaml
第十章 剧本高级特性-触发信息(handlers)
10.0 官方文档
https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html#handlers-running-operations-on-change
10.1 应用场景
如果配置文件发生了变化,就重启服务
如果配置文件没发生变化,不重启
10.2 实战演练-rsync中设置触发信息
需求:只要文件内容有改动,就会调用通知,然后就会将通知发送给触发handlers,执行重启操作
# vim /etc/ansible/ansible-playbook/rsync_server-触发.yaml
- hosts: rsync_server
vars:
backupdir: /backup
passfile: rsync-password
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf & pass file
copy: src /etc/ansible/server_file/rsync_server/{{ item.src }} dest={{ item.dest }} mode={{ item.mode }}
with_items:
- { src: 'rsyncd.conf', dest: '/etc/', mode: '644' }
- { src: 'rsync.password', dest: '/etc/', mode: '600' }
notify: restart rsync server //配置的参数 监控有没有变化 当由变化的时候进行重启
handlers:
- name: restart rsync server
service: name=rsyncd state=restarted
//整体任务执行完毕,才会执行触发功能
10.3 错误总结
handlers必须放在最后执行
notify里的服务名称必须和handlers里定义的一样
第十一章 剧本高级特性-选择tasks
11.1 应用场景
从某个任务开始往下依次执行
11.2 查看task列表
ansible-playbook --list-tasks rsync_server.yaml
11.3 选择从哪一个task开始执行
ansible-playbook --start-at-task '05-create data dir' rsync_server.yaml
第十二章 剧本高级特性-include
12.1 功能介绍
当项目规模较大时,playbook也将会写的很臃肿,不便于阅读和维护。ansible借鉴了apache、nginx等开源软件的配置文件的组织方式,允许使用include来把一个庞大的playbook文件分散成多个较小的文件,文件之间可以使用include关键字来相互调用。
include调用的对象可以是tasks、handlers或者整个playbook
12.2 示例介绍
1)include关键字调用tasks
#第一步:们把需要调用的tasks单独写在一个文件中(比如是tasks.yaml)
cat tasks.yml
- name: create a directory
file: name=/test state=directory
- name: create a file
file: name=/test/test.txt state=touch
#第二步:在playbook中(比如是a.yml)使用include来调用这些tasks
cat a.yml
------
- hosts: t2
remote_user: root
gather_facts: no
tasks:
- include: tasks.yml
- include关键字调用handlers
#第一步:我们把需要调用的handlers单独写在一个文件中(比如是handlers.yml)
cat handlers.yml
- name: create a file
file: name=/test/handlers.txt state=touch
#第二步:在playbook中(比如是a.yml)使用include来调用这些handlers
cat a.yml
---
- hosts: t2
remote_user: root
gather_facts: no
tasks:
- file: name=/test state=directory
notify: create a file
handlers:
- include: handlers.yml
- include关键字调用playbook
#第1步:先写好待调用的playbook(比如是play.yaml)
cat play.yml
---
- hosts: t3
remote_user: root
tasks:
- name: create a directory
file: name=/test state=directory
#第2步:在playbook中(比如是a.yaml)使用include来调用这个playbook
cat a.yml
---
- hosts: t2
remote_user: root
gather_facts: no
tasks:
- file: name=/test state=directory
- include: play.yml
#注意:
在ansible 2.8以前的版本中,调用其他playbook文件既可以使用include关键字,还可以使用import_playbook关键字。但是,在ansible 2.8以后的版本中,调用其他playbook文件则必须要使用import_playbook关键字(取代include关键字)。
第十三章 传统剧本实战演练-rsync整合部署
##主机清单模拟
vim /etc/ansible/hosts
[rsync:children]
rsync_server
rsync_client
[rsync_server]
192.168.81.165
[rsync_client]
192.168.81.162
192.168.81.163
##编写剧本
#创建剧本存放目录
# mkdir /etc/ansible/ansible-playbook
# vim /etc/ansible/ansible-playbook/rsync_install.yml
- hosts: rsync_server
vars: #变量
backupdir: /backup
passfile: rsync.password
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf & pass file
copy: src=/etc/ansible/server_file/rsync_server/{{ item.src }} dest={{ item.dest }} mode={{ item.mode }} #循环
loop:
- { src: 'rsyncd.conf', dest: '/etc/', mode: '644' }
- { src: 'rsync.password', dest: '/etc/', mode: '600' }
notify: restart rsync server #触发信息
- name: 03-create user
user: name=rsync create_home=no shell=/sbin/nologin
ignore_errors: yes #忽略错误
tags: 03-create user #标签
- name: 04-create backup dir
file: path={{ backupdir }} state=directory owner=rsync group=rsync
- name: 05-start rsync server
systemd: naem=rsyncd state=started enabled=yes
handlers: ##触发动作
- name: restart rsync server
systemd: name=rsyncd state=restarted
- hosts: rsync_client
vars: #变量
passfile: rsync.password
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-create password file
copy: content=123456 dest=/etc/{{ passfile }} mode=600
- name: 03-create test nfs file
file: dest=/tmp/test_nfs.txt state=touch
when: (ansible_hostname == "nfs01") #判断
- name: 04-create test_web file
file: dest=/tmp/test_web.txt state=touch
when: (ansible_hostname == "web01") #判断
- name: 05-check test_nfs
shell: rsync -avz /tmp/test_nfs.txt rsync_backup@192.168.81.165::backup --password-file=/etc/{{ passfile }}
when: (ansible_hostname == "nfs01") #判断
- name: 06-check test_web
shell: rsync -avz /tmp/test_web.txt rsync_backup@192.168.81.165::backup --password-file=/etc/{{ passfile }}
when: (ansible_hostname == "web01") #判断
##模拟执行
ansible-playbook -C rsync_install.yaml
##执行
ansible-playbook rsync_install.yaml
第十四章 传统剧本实战演练-NFS整合部署
#环境准备:主机清单模拟
vim /etc/ansible/hosts
[nfs:children]
nfs_server
nfs_client
[nfs_server]
192.168.81.162
[nfs_client]
192.168.81.163
192.168.81.164
#第一步:创建文件目录
[root@m01 ~]# cd /etc/ansible/ansible-playbook
[root@m01 ~]# mkdir nfs #放置文件数据
#第二步:编写剧本信息
[root@m01:/etc/ansible/ansible-playbook/nfs]# vim nfs.yml
- hosts: nfs
tasks:
- name: 01-install nfs software
yum:
name: ['nfs-utils','rpcbind'] #ansible官方推荐书写格式,yum比较特殊
state: installed
- hosts: nfs_server
vars:
Data_dir: /data
tasks:
- name: 01-copy conf file
copy: src=/etc/ansible/ansible-playbook/nfs/exports dest=/etc
notify: restart nfs server
- name: 02-create data dir
file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody
#file:
# path: ['data01','data02','data03']
# state: directory
# owner: nfsnobody
# group: nfsnobody
- name: 03-boot server
service: name={{ item }} state=started enabled=yes
loop:
- rpcbind
- nfs-utils
handlers:
- name: restart nfs server
service: name-nfs state=restarted
- hosts: nfs_client
vars:
Data_dir: /data
tasks:
- name: 01-mount
mount: src=192.168.81.165:{{ Data_dir }} path=/mnt fstype=nfs state=mounted
- name: 02-check mount_info
shell: df -h|grep /data
register: mount_info
- name: display mount_info
debug: msg={{ mount_info.stdout_lines }}
#第三步:编辑nfs配置文件
[root@m01 ansible-playbook]# cd /nfs/
[root@m01 nfs]# echo '/data 192.168.81.0/24(rw,sync)' >exports
注:在剧本文件中使用的变量,只会到本hosts中去查找
第十四章 剧本整合
方式一:include_tasks: f1.yml --- 角色使用
```bash
- hosts: all
remote_user: root
tasks:
- include_tasks: f1.yml //平级在一个路径下。
- include_tasks: f2.yml
#将主机清单信息 删掉 保留只是任务的信息。
#在角色中可以灵活的调用主机,相比第二中和第三种。
方式二:include: f1.yml
- include:f1.yml
- include:f2.yml
方式三:- import_playbook:***
[root@m01 ansible-playbook]# cat main.yml
- import_playbook: base.yml
- import_playbook: rsync.yml
- import_playbook: nfs.yml
- import_playbook: oxxx.yml
- import_playbook: rsync.yml
- import_playbook: nfs.yml