6、综合架构详解-批量管理服务

1 ansible简介

ansible服务特点:
管理端不需要启动服务程序(no server)
管理端不需要编写配置文件(/etc/ansible/ansible.cfg)
受控端不需要安装软件程序(libselinux-python)
受控端不需要启动服务程序(no agent)
服务程序管理操作模块众多(module)
利用剧本编写来实现自动化(playbook)


1.1 安装软件

yum -y install ansible

1.2 配置主机清单文件

/etc/ansible/hosts,在文件最下方添加,可以使用域名也可以使用ip地址
1)分组配置

[组名]
ip地址1
ip地址2

2)用列表代表多个地址

172.16.1.[1:10],代表172.16.1.1~172.16.1.10
web[01:03],代表web01~web03

3)加上端口号

ip地址:端口号
域名:端口号

4)支持使用特殊参数附加登录的用户名密码信息

ip地址 ansible_ssh_port=xxx ansible_ssh_user=xxx ansible_ssh_pass=xxx

5)直接在主机清单中做域名到IP地址的映射

域名 ansible_ssh_host=IP地址

6)支持分组的嵌套
可以定义父组来包含子组,直接使用父组名来调用两个子组,定义时写为[父组:children]

[父组:children]
组1
组2
[组1]
ip地址1
ip地址2
[组2]
ip地址3
ip地址4

7)支持变量的嵌入
可以为组定义变量,组成员会调用所有变量

[web:vars]
ansible_ssh_port=xxx
ansible_ssh_user=xxx
ansible_ssh_pass=xxx
[web]
web01
web02

1.3 检查管理联通性

ansible all -a "hostname"

1.4 ansible帮助命令

ansible-doc -l查看所有的模块简介
ansible-doc -s 模块名查看具体的模块参数信息
ansible-doc 模块名查看模块在剧本中的应用方法

2 ansible模块

调用模块的命令:

ansible 主机名称/主机组名称/主机地址信息/all -m  模块名称  -a  "执行什么命令"
-m 指定模块参数
-a 指定执行的动作参数

输出颜色说明:
1.绿色:查看主机信息/对主机未做改动
2.黄色:对主机数据信息做了修改
3.红色:命令执行出错
4.粉色:忠告信息
5.蓝色:显示ansible命令执行的过程

2.1 命令类型模块

2.1.1 command模块(默认模块)

模块做用为在远程主机上执行一个命令,在-a参数之后必须写上一个合法的linux命令信息。
由于是默认模块,可以不写-m command,就能调用。

命令中一些符号无法识别,例如: <, >, |, ;&,变量的引用$也无法识别。

2.1.1.1 chdir参数

chdir=目录在执行命令前对目录进行切换

#切换到/tmp目录,创建f1.txt文件
ansible 172.16.1.31 -m command -a "chdir=/tmp touch f1.txt"

2.1.1.2 creates参数

creates=文件如果指定的文件存在,不执行命令操作

#如果/tmp/f1.txt存在,不创建f2.txt
ansible 172.16.1.31 -m command -a "creates=/tmp/f1.txt chdir=/tmp touch f2.txt"

2.1.1.3 removes参数

removes=文件如果指定的文件存在,就执行命令操作

#如果/tmp/f1.txt存在,创建f2.txt
ansible 172.16.1.31 -m command -a "removes=/tmp/f1.txt chdir=/tmp touch f2.txt"

2.1.2 shell模块(万能模块)

与command模块类似,不过是在节点上执行shell命令,这样就可以识别command无法识别的特殊符号。参数与command类似

2.1.3 script模块(脚本模块)

向远程节点传输并执行本地脚本,-a参数后面直接接上脚本文件,其余参数与command类似

ansible 172.16.1.31 -m script -a "/server/scripts/yum_htop.sh"

2.2 文件类型模块

2.2.1 copy模块

将数据进行批量分发

2.2.1.1 基本用法

-a后面使用参数src=本地文件dest=远程目录

[root@m01 ~]$ ansible 172.16.1.31 -m copy -a "src=/etc/hosts dest=/tmp/host.bak"
172.16.1.31 | CHANGED => {                 ---对哪台主机进行操作
    "ansible_facts": {                     
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true,                       ---是否对主机信息进行改变
    "checksum": "6b0b3f6ccab2f19650542950cec284facd41f74a",           ---生成本地文件校验码==MD5值 
    "dest": "/tmp/host.bak",            ---显示目标路径信息
    "gid": 0,                           ---显示复制后的gid信息
    "group": "root",                    ---显示复制后文件所属组        
    "md5sum": "78c023dd0b6a65d95716c9be005f2084",                     ---生成目标文件校验码==MD5值
    "mode": "0644",                     ---显示复制后文件权限信息
    "owner": "root",                    ---显示复制后文件属主信息
    "size": 335,                        ---显示文件的大小信息
    "src": "/root/.ansible/tmp/ansible-tmp-1608223176.15-6792-178046000464527/source", 
    "state": "file",                    ---显示文件的类型信息
    "uid": 0                            ---显示复制后文件uid信息
}

2.2.1.2 传输文件时修改文件的属主和属组信息

-a命令中使用owner=,group=参数

ansible 172.16.1.31 -m copy -a "src=/etc/hosts dest=/tmp/host.bak owner=sshd group=sshd"

2.2.1.3 传输文件时修改文件的权限信息

-a命令中使用mode=参数

ansible 172.16.1.31 -m copy -a "src=/etc/hosts dest=/tmp/host.bak mode=444"

2.2.1.4 传输文件时对远程主机源文件进行备份

-a命令中使用backup=yes参数

ansible 172.16.1.31 -m copy -a "src=/etc/hosts dest=/tmp/host.bak backup=yes"

2.2.1.5 创建一个文件并直接编辑文件信息

-a命令中使用content=参数

ansible 172.16.1.31 -m copy -a "content=123456 dest=/tmp/host.bak "

2.2.1.6 在远程主机上执行文件拷贝

-a命令中使用remote_src=yes参数,则src=代表的就是远程主机的文件夹

ansible 172.16.1.31 -m copy -a "src=/etc/hostname dest=/tmp/ remote_src=yes "

2.2.2 file模块

设置文件属性信息

2.2.2.1 基本用法

-a后面使用参数path=远程文件owner=属主group=属组mode=XXX

ansible 172.16.1.31 -m file -a "path=/tmp/f1.txt owner=sshd group=sshd mode=777"

2.2.2.2 利用模块创建数据(文件 目录 链接文件)

-a后面使用参数state=

state参数:
absent        删除数据
directory     创建一个目录信息,可以创建多级目录
file          检查创建的数据是否存在,绿色存在,红色不存在
hard          创建一个硬链接文件,需配合src指定源文件
link          创建一个软连接文件,需配合src指定源文件
touch         创建一个文件

#创建文件
ansible 172.16.1.31 -m file -a "path=/tmp/f1.txt state=touch"
#创建2级目录
ansible 172.16.1.31 -m file -a "path=/tmp/dir1/dir2 state=directory"
#创建硬链接
ansible 172.16.1.31 -m file -a "src=/etc/hosts path=/tmp/link_hard state=hard"
#创建软链接
ansible 172.16.1.31 -m file -a "src=/etc/hosts path=/tmp/link_soft state=link"
#删除文件
ansible 172.16.1.31 -m file -a "path=/tmp/f1.txt state=absent"
#删除目录
ansible 172.16.1.31 -m file -a "path=/tmp/dir1/ state=absent"

2.2.2.3 递归修改文件属性

-a后面使用参数recurse=yes,可以配合owner=属主group=属组mode=XXX,递归修改目录及其包含的文件属性

ansible 172.16.1.31 -m file -a "dest=/tmp/dir1 mode=777 group=sshd  recurse=yes"

2.2.3 fetch模块

从远端拉取文件到本地

2.2.3.1 基本用法

-a后面使用参数src=远端文件dest=本地目录,会在本地生成远程主地址/文件路径目录/文件结构的文件

[root@m01 ~]$ ansible 172.16.1.31 -m fetch -a "src=/tmp/f1.txt dest=/tmp"
[root@m01 ~]$ tree /tmp/
/tmp/
├── 172.16.1.31
│   └── tmp
│       └── f1.txt

2.2.4 template模块

使用Ansible的jinja2模板也就是使用template模块,该模块和copy模块一样,都是将文件复制到远端主机上去,但是区别在于,template模块可以获取到playbook文件中的变量,而copy则是原封不动的把文件内容复制过去。在推送脚本时,想把脚本中的变量名改成主机名,如果使用copy模块则推送过去的就是{{ ansible_fqdn }},不变,如果使用template,则会变成对应的主机名。

template推送的是以.j2结尾的Jinja2模板文件

2.2.4.1 Jinja模板基本语法

{{ EXPR }}输出变量值,会输出自定义的变量值或facts
1).playbook文件使用template模块
2).模板文件里面变量使用{{名称}},比如{{PORT}}或使用facts

2.2.4.2 Jinja2模板逻辑判断

#循环表达式
{% for i in EXPR %}
{% endfor %}

#条件判断
{% if EXPR %}
{% elif EXPR %}
{% else %}
{% endif %}

#注释
{# COMMENT #}

2.2.4.3 Ansible Jinja2管理nginx

编辑playbook

[root@m01 ~]$ vim lb.yml
- hosts: lb_group
  vars:
    http_port: 80
    server_name: www.szk.com
  tasks:
    - name: copy
      template:
        src: ./www.szk.com.conf.j2
        dest: /etc/nginx/conf.d/www.szk.com.conf
      notify: reload nginx
  handlers:
    - name: reload nginx
      systemd:
        name: nginx
        state: reloaded

准备推送的.j2模板文件

[root@m01 ~]$ vim www.szk.com.conf.j2
upstream {{ server_name }} {
{% for n in range(21) %}
        server 172.16.1.{{ n }}:{{ up_port }};
{% endfor %}
}

server {
        listen {{ http_port }};
        server_name {{ server_name }};
        location / {
                root /code;
                index index.html;
                proxy_pass http://{{ server_name }};
                proxy_set_header Host $http_host;
        }
}

2.3 安装软件模块

2.3.1 yum模块

给远程主机安装软件

2.3.1.1 基本用法

-a后面使用参数name=软件名state=

state参数:
installed        安装软件
present          安装软件
latest           安装软件
absent           卸载软件
removed          卸载软件

ansible 172.16.1.31 -m yum -a "name=htop state=installed"

2.4 服务管理模块

2.4.1 service模块

控制远程主机上的服务

2.4.1.1 基本用法

-a后面使用参数name=服务名state=指定服务操作enabled=yes/no

state参数:
started          启动
restarted        重启
stopped          停止
absent           卸载软件
removed          卸载软件

ansible 172.16.1.31 -m service -a "name=nfs state=started enabled=yes"

2.5 定时任务模块

2.5.1 cron模块

设置远程主机的定时任务

2.5.1.1 基本用法

-a后面使用参数"时间 job=命令"job后面的命令要使用''括起来,才能将整个命令看作一个整体

时间表示方法,如下如需要表示*,就不写对应的时间参数
day:           # Day of the month the job should run ( 1-31, *, */2, etc )
hour:          # Hour when the job should run ( 0-23, *, */2, etc )
minute:        # Minute when the job should run ( 0-59, *, */2, etc )
month:         # Month of the year the job should run ( 1-12, *, */2, etc )environment 
weekday:       # Day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )

ansible 172.16.1.31 -m cron -a "minute=59 job='echo hello'"

2.5.1.2 给定时任务设置注释

-a后面使用参数"name='注释'",加上注释后相同名称的定时任务无法重复添加。

ansible 172.16.1.31 -m cron -a "minute=59 job='echo hello' name='hello'"

2.5.1.3 删除定时任务

-a后面使用参数"name='注释' state=absent"
注意:只能删除由ansible设置的定时任务

ansible 172.16.1.31 -m cron -a "name='hello' state=absent"

2.5.1.4 注释定时任务

-a后面使用参数"name='注释' job='命令' disabled=yes",disabled=no取消注释

ansible 172.16.1.31 -m cron -a "disabled=yes job='echo hello' name='hello'"

2.6 磁盘挂载模块

2.6.1 mount模块

控制远程主机进行挂载

2.6.1.1 基本用法

-a后面使用参数"src=  path=  fstyep= state="

src:        需要挂载的存储设备或文件
path:       指定目标挂载点目录
fstyep:     指定挂载时的文件系统类型
state:present    不会立即挂载,将挂载信息写入fstab文件
       mounted    立即挂载,同时将挂载信息写入fstab文件
       absent     立即卸载,同时删除fstab文件挂载信息
       unmounted  立即卸载,不会删除fstab文件挂载信息


ansible 172.16.1.7 -m mount -a "src=172.16.1.31:/data path=/mnt state=mounted fstype=nfs"
ansible 172.16.1.7 -m mount -a "src=172.16.1.31:/data path=/mnt state=absent fstype=nfs"

2.7 用户管理模块

2.7.1 user模块

批量创建、管理用户

2.7.1.1 基本用法

-a后面使用参数"name=用户名"

ansible 172.16.1.31 -m user -a "name=oldboy"

2.7.1.2 指定用户uid信息

-a后面使用参数"uid="

ansible 172.16.1.31 -m user -a "name=oldboy uid=6666"

2.7.1.2 指定用户组信息

-a后面使用参数"group="设定用户主组,"groups="设定用户附加组

ansible 172.16.1.31 -m user -a "name=oldboy group=oldgirl"
ansible 172.16.1.31 -m user -a "name=oldboy01 groups=oldgirl"

2.7.1.3 创建虚拟用户

-a后面使用参数"create_home=no shell=/sbin/nologin"

ansible 172.16.1.31 -m user -a "name=oldboy02 create_home=no shell=/sbin/nologin"

2.7.1.4 给指定的用户创建密码

用user模块给用户创建密码,需要将明文的密码转换为密文进行设置
生成密文的命令

ansible all -i localhost, -m debug -a "msg={{ '密码' | password_hash('sha512', '加盐') }}"

-a后面使用参数'password=',设置密码时-a后面的参数使用'',因为密文密码中经常有特殊符号,为了防止特殊符号转译,使用''

-a 后面使用单引号
ansible 172.16.1.31 -m user -a 'name=oldboy password=$6$12345$yQ1Yqih.1bEGf/6MwVLlceCSJrzJeIW7BAVSb3n3n8CGLqJj/ual83/BZmGhzbyc/Izzeqo07BhepPa57o1h20'

2.7.1.5 删除指定的用户

-a后面使用参数"state=absent",需要同时删除家目录时添加remove=yes

ansible 172.16.1.31 -m user -a "name=oldboy state=absent remove=yes"

2.8 网络模块

2.8.1 ping模块

测试远程主机的连通性

ansible 172.16.1.41 -m ping

2.9 setup模块

显示目标主机的信息
ansible hosts -m setup显示全部信息
ansible hosts -m setup -a "filter=key"显示key所对应的信息

3 剧本的编写

3.1 剧本的组成

hosts:执行任务的主机
tasks:需要执行的任务

3.2 剧本书写规范

3.2.1 yaml语法

剧本文件的扩展名要写为.yamlyml,方便vim进行语法校验
剧本使用yaml语句,有3点要求:
1)合理的缩进,2个空格表示一级缩进,不要使用tab键

标题1
  标题2
    标题3

2)对象,使用冒号代表,格式为key: value,冒号后面要加一个空格。以冒号结尾,冒号出现在注释说明中时,后面不要加空格。

hosts: 172.16.1.1
tasks: 

3)列表的应用,列表中的所有成员都开始于相同的缩进级别, 并且使用一个横杠-加一个空格,作为开头。列表的一个成员如果由多个对象组成,则第一个成员前加-,其余成员不加-,所有成员使用相同的缩进级别。

---
- 张三: 123
  性别: 
    - 打游戏: 123
    - 旅游: 456
- 李四
- 王五

对应的json格式为
[
  {
    "张三": 123,
    "性别": [
      {
        "打游戏": 123
      },
      {
        "旅游": 456
      }
    ]
  },
  "李四",
  "王五"
]

4)常量的表示,常量有3种,数字、布尔值、字符串。数字是整数或浮点数,布尔值是true或false,字符串用''或""括起来。

3.2.2 剧本书写样例

剧本的语序顺序如下

- hosts: IP地址
  tasks:
    - name: 任务描述1
      模块1: 模块参数
    - name: 任务描述2
      模块2: 模块参数
      模块2: 模块参数

注意:一个name描述只能跟随一种模块操作!!

有两种书写方式:
1)ansible格式,模块中的所有参数写在一行

- name: 05-stop rsyncd
  service: name=rsyncd state=stopped

2)saltstack格式,模块中的操作写成键值对

- name: 05-stop rsyncd
  service: 
    name: rsyncd 
    state: stopped

3.2.3 剧本中设置变量

生效优先级:命令行>剧本>主机清单

3.2.3.1 直接在剧本中编写

每个hosts下可以定义vars,定义的变量只能够本hoststasks操作使用。变量的引用使用{{变量名}}

- hosts: IP地址
  vars:
    var1: x
    var2: y
  tasks:
    - name: 任务描述1
      模块1: 模块参数{{var1}}
    - name: 任务描述2
      模块2: 模块参数{{var2}}

3.2.3.2 在执行ansible-playbook命令时附加参数

ansible-playbook -e var1=x -e var2=y xxx.yaml,脚本文件中依旧可以写{{var}}来调用变量,且所有的hosts均可以调用。

3.2.3.2 在主机清单中设置的变量

/etc/ansible/hosts主机清单中为不同组设置的变量,剧本文件中对应的hosts可以直接调用

#主机清单
[web:vars]
var1=x
var2=y

#剧本文件
- hosts: web
  tasks:
     - name: abc
       模块: {{var1}} {{var2}}

3.2.4 在剧本中显示输出信息

可以用于显示对端服务器的端口信息等

- name: check server port
  shell: ss -tnlp | grep 22                     #带有输出的shell命令                   
  register: get_server_port                     #将输出信息注册到一个字典get_server_port
- name: display port info
  debug: msg={{get_server_port.stdout_lines}}   #调用字典get_server_port的键进行标准输出

3.2.5 在剧本中设置判断

能够进行判断的变量必须是setup模块显示的主机信息。

常见主机信息

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个数(只显示总的个数)

进行判断的语句样式为when: 主键==xxx,如果需要判断主键的子健when: 主键[子键]==xxx。判断语句需要放到tasks子任务的最后一句

tasks:
  -name: 01 xxxx
   yum: name=rsync state=installed
   when: ansible_distribution == 'CentOS'
  -name: 02 xxxx

3.2.6 在剧本中执行循环

利用循环,在一个name子句中执行同一个模块的多个任务。使用with_items:定义循环条件,with_items:语句需要放到tasks子任务的最后一句。

例1:
item是一个列表,内容是两个字典,循环时分别使用每个字典的键值
- name: 02-copy server confi & password
  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}


例2:
item列表中的内容是字符串,循环时直接调用列表本身
- name: 01-install software
  yum: name={{item}} state=installed
  with_items:
    - 'rpcbind'
    - 'nfs'

3.2.7 在剧本中忽略错误

tasks的子任务最后配置ignore_errors: yes

- name: 01-install software
  yum: name={{item}} state=installed
  with_items:
    - 'rpcbind'
    - 'nfs'
  ignore_errors: yes

3.2.8 在剧本中设置标签信息

用于在剧本中跳过或单独执行某个tasks子任务,在tasks的子任务最后配置tags: 标签字符串

- name: 01-install rsync
  yum: 
    name: 'rsync'
    state: 'installed'
  tags: '01'

执行指定标签ansible-playbook -t/--tags 标签 xxx.yaml
略过指定标签ansible-playbook --skip-tags 标签 xxx.yaml

3.2.9 在剧本中设置触发信息

tasks子任务中设置notify: 触发信息,当子任务被执行时触发。
配置handlers:handlers:的子任务包含names: 触发信息模块: 模块参数,用于接收tasks中的触发信息,从而执行相应操作

tasks:
  - name: 02-copy server confi & password
    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                              #name匹配触发器名称
    service: name='rsyncd' state=restarted

3.2.10 在剧本中跳过目标主机的信息收集,加快剧本运行

如果剧本中用不到when语句,则可以在hosts:后添加gather_facts: no取消默认setup模块收集信息的调用

- hosts: nfs
  gather_facts: no
  tasks:
    - name: 01-install nfs
      yum: name='nfs-utils' state=installed

3.3 剧本的整合

可以使用import_playbook进行多个剧本的整合执行

目前目录下有两个服务剧本

[root@m01 ansible-playbook]$ ll
-rw-r--r-- 1 root root 1061 Dec 20 17:44 nfs_server.yaml
-rw-r--r-- 1 root root 1373 Dec 20 18:01 rsync_server.yaml

创建一个总剧本同时调用两服务个剧本

[root@m01 ansible-playbook]$ vim main.yaml
- import_playbook: nfs_server.yaml
- import_playbook: rsync_server.yaml

3.4 如何执行剧本

3.4.1 检查剧本格式语法

ansible-playbook --syntax-check 剧本文件

3.4.2 模拟剧本执行

ansible-playbook -C 剧本文件

3.4.3 真实执行剧本

ansible-playbook 剧本文件

3.4.4 显示剧本执行的详细过程

ansible-playbook -v/vv/vvv/vvvv 剧本文件,加的v越多,显示的信息越详细

4 ansible程序roles

4.1 目录结构

/etc/ansible/roles目录下创建相应角色目录,每个角色都拥有files,handlers,tasks,templates,vars文件夹

# 以nfs_server和rsync_server为例
cd /etc/ansible/roles
mkdir -p {nfs,rsync}_server/{files,handlers,tasks,templates,vars}

├── nfs_server
│   ├── files                       #保存需要分发的文件
│   ├── handlers                    #保存触发器文件信息
│   ├── tasks                       #保存要执行的动作信息
│   ├── templates                   #保存需要分发的模板文件,模板文件中可以调用变量信息
│   └── vars                        #保存变量信息文件
└── rsync_server
    ├── files
    ├── handlers
    ├── tasks
    ├── templates
    └── vars

4.2 在roles目录创建相关文件

4.2.1 编写tasks目录中的main.yml文件

推荐将tasks的多个task拆分成不同的yml文件

#将多个task拆分成不同yml文件
copy_file.yml
install_nfs.yml
install_rpcbind.yml
make_dir.yml
start_service.yml

#每个yml执行一种task
[root@m01 tasks]$ cat copy_file.yml 
- name: 02-copy config file
  copy: src=/etc/ansible/ansible-playbook/nfs-file/nfs-server/exports dest=/etc/
  notify: restart nfs service

main.yml文件用inclued_tasks:来调用不同的task.yml文件

[root@m01 tasks]$ cat main.yml 
- include_tasks: install_nfs.yml
- include_tasks: install_rpcbind.yml
- include_tasks: copy_file.yml
- include_tasks: make_dir.yml
- include_tasks: start_service.yml 

4.2.2 编写vars目录中的main.yml文件

main.yml定义了可以被taskstemplates调用的变量

[root@m01 vars]$ cat main.yml 
data_dir: /data
  变量名 : 变量内容

4.2.3 编写files或templates目录中的文件

1.copy模块将用到files文件夹下的文件
2.template模块将用到templates文件夹下的文件,templates文件夹下的文件可以使用vars/main.yml中定义的变量

[root@m01 nfs_server]$ cat templates/exports 
{{data_dir}}    172.16.1.0/24(rw,sync)

4.2.4 编写handlers目录中的main.yml文件

handlers中有多个要执行的task时,也可以拆分文件,main.yml中使用include_tasks:来调用。
下面演示的是不拆分的情况

[root@m01 nfs_server]$ cat handlers/main.yml 
- name: restart nfs service
  service: name=nfs state=restarted

4.2.5 编写roles目录的主剧本文件

roles目录下编写主剧本文件,以nfs为例

[root@m01 roles]$ cat site.yml 
- hosts: nfs_server                         #主机组
  gather_facts: no                          #不收集信息
  roles:
    - nfs_server                            #roles目录下的角色文件夹
- hosts: nfs_client
  gather_facts: no
  roles:
    - nfs_client

5 ansible远程主机无法管理问题分析

可能的原因:

  1. 管理端没有分发好主机的公钥
  2. 被管理端sshd服务出现问题
  3. 被管理端进程出现僵死情况(sshd: root@notty进程)
被管理端的3种sshd进程:

/usr/sbin/sshd -D     #负责建立远程连接
sshd: root@pts/0      #用于维护远程连接(linux--linux)(windox--linux)
sshd: root@notty      #用于维护远程连接(ansible--被管理端)

你可能感兴趣的:(6、综合架构详解-批量管理服务)