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语法
剧本文件的扩展名要写为.yaml
或yml
,方便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
,定义的变量只能够本hosts
的tasks
操作使用。变量的引用使用{{变量名}}
- 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
定义了可以被tasks
和templates
调用的变量
[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远程主机无法管理问题分析
可能的原因:
- 管理端没有分发好主机的公钥
- 被管理端sshd服务出现问题
- 被管理端进程出现僵死情况(
sshd: root@notty
进程)
被管理端的3种sshd进程:
/usr/sbin/sshd -D #负责建立远程连接
sshd: root@pts/0 #用于维护远程连接(linux--linux)(windox--linux)
sshd: root@notty #用于维护远程连接(ansible--被管理端)