[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
  1. 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
  1. 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
posted @ 2019-04-27 23:43  michaelni  阅读(174)  评论(0编辑  收藏  举报