admin 管理员组

文章数量: 887017

目录

一.ANSIBLE的简要介绍

1.功能介绍

2.ANSIBLE特性

3.Ansible架构

二.Ansible安装和入门

1.本地yum安装

2.编译安装

3.查看基本信息

4.相关文件

5.ansible主配置文件

5.inventory主机清单文件

免密登录脚本

7.ansible相关工具

8.ansible格式和选项

9.ansible命令执行过程

10.ansible-console

三.Ansible模块

1.Command模块

2.shell 模块

3.Script 模块

4.copy模块

5.Get_url 模块

6.Fetch模块

7.File模块

(1)创建空文件

(2)新建目录

(3)新建软链接

(4)删除文件

8.stat 模块

9.unarchive模块

10.Archive模块

11.Hostname模块

12.Cron模块

13.Yum和Apt模块

14.yum_repository模块

15.Service模块

16.mount模块

17.User模块

18.group模块

19.reboot模块

20.Lineinfile模块

21.replace模块

22.setup模块

四.Playbook

1.三种常见的数据格式

2.playbook特点

3.YUML语言介绍

4.playbook核心组件

4.1  host组件

4.2  remote_user组件

4.3  task列表和action组件

(1)在远程主机创建用户test

(2)安装httpd并启动

4.4  handlers 和 notify

4.5  gather_facts

4.6  ignore_errors

5.playbook命令

6.ansible编译安装nginx脚本

7.tags 标签

8.playbook中使用变量

8.1  使用setup模块中变量

8.2  在playbook 命令行中定义变量

8.3  定义变量文件

8.4直接在playbook文件中建立变量

8.5使用独立的变量文件

五.role角色

1.Ansible Roles目录编排

2.建立role


一.ANSIBLE的简要介绍

Ansible 是一个开源的自动化工具,用于配置管理、应用部署、任务自动化以及 IT 编排。它由 Michael DeHaan 于 2012 年创建,并已成为 IT 运维和 DevOps 工具链中的重要组成部分。

1.功能介绍

  1. 配置管理(Configuration Management)

Ansible 能够自动化配置文件的管理和系统设置,确保所有系统具有一致的配置。这包括安装软件包、管理文件和目录、配置网络设置等。

  2. 应用部署(Application Deployment)

Ansible 可以自动化应用程序的部署过程,从代码库中获取代码、编译、打包到最终部署在服务器上。它支持多种语言和框架,可以与 CI/CD 工具集成,实现持续交付。

  3. 编排(Orchestration)

Ansible 可以协调多个节点之间的复杂任务,并确保它们按正确的顺序执行。例如,在多层应用中,可以先部署数据库,再部署应用服务器,最后部署前端。

  4. 任务自动化(Task Automation)

通过剧本(Playbooks),用户可以自动执行重复性的任务,如备份、日志清理、用户管理等。这些任务可以在指定的时间或事件触发时自动运行。

  5. 云管理(Cloud Provisioning)

Ansible 支持多种云平台(如 AWS、Azure、Google Cloud Platform)的资源管理和配置。用户可以使用 Ansible 自动化创建和配置云资源,如虚拟机、存储、网络等。

  6. 网络自动化(Network Automation)

Ansible 提供了专门的网络模块,用于自动化配置网络设备(如路由器、交换机、防火墙)的操作。它支持多种网络供应商和设备类型。

  7. 安全合规(Security and Compliance)

Ansible 可以帮助实施和验证安全策略,确保系统符合企业或法规要求。它可以自动化补丁管理、安全设置和合规检查。

  8. 多租户支持和访问控制(Multi-Tenancy and Access Control)

Ansible Tower(企业版)提供了角色和权限管理功能,支持多租户环境中的细粒度访问控制,确保不同团队或用户只访问他们有权限的资源。

  9. 集成和扩展(Integration and Extensibility)

Ansible 提供了丰富的 API 和插件系统,允许与其他系统和工具集成。用户可以编写自定义模块和插件,以满足特定需求。

  10. 高可用性和弹性(High Availability and Scalability)

Ansible Tower 提供了高可用性和扩展性特性,支持大规模分布式环境中的自动化任务管理。

  11. 报告和审计(Reporting and Auditing)

Ansible Tower 提供了详细的执行报告和审计日志,帮助用户了解每个自动化任务的执行情况和结果,便于问题排查和合规管理。

  12. 可移植性(Portability)

由于 Ansible 使用无代理架构,并通过 SSH 或 WinRM 与目标主机通信,它可以在多种操作系统和环境中工作,包括物理服务器、虚拟机、容器等。

2.ANSIBLE特性

  1. 简单性: Ansible 设计简单直观,使用 YAML 语法描述任务和配置,易于理解和学习。

  2. 无代理: Ansible 不需要在被管理的主机上安装代理,只需通过 SSH 或 PowerShell 远程管理即可,降低了部署和维护的复杂性。

  3. 基于模块: Ansible 使用模块化的方式管理系统,每个任务都是通过调用模块来实现的,支持丰富的模块库。

  4. 声明式语法: 使用 YAML 描述任务和配置的声明式语法,让用户可以清晰地定义系统状态和所需的配置。

  5. 可扩展性: Ansible 可以轻松扩展,支持自定义模块和插件,满足各种复杂环境和特定需求。

  6. 剧本(Playbooks): Ansible 使用 Playbooks 来组织和描述多个任务的执行顺序和条件,支持任务的并行执行和序列化执行。

  7. 强大的社区支持: Ansible 拥有活跃的社区,提供大量的模块和插件,同时有丰富的文档和示例供用户参考。

  8. 多平台支持: Ansible 可以管理多种操作系统和云平台,包括 Linux、Windows、VMware、AWS、Azure 等。

  9. 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性非绝对

3.Ansible架构

  1. 库存 (Inventory):

    • 库存文件定义了受控节点的信息,包括它们的分组和连接方式。
    • 库存文件可以是简单的 INI 格式,也可以是复杂的 YAML 格式,还可以从动态库存脚本中生成。
  2. 模块 (Modules):

    • 模块是完成特定任务的独立脚本,如安装软件包、管理服务和配置文件等。
    • Ansible 在运行过程中将模块临时复制到受控节点并执行。
  3. 插件 (Plugins):

    • 插件扩展了 Ansible 的功能,包括连接插件、回调插件、过滤插件等。
    • 插件在 Ansible 的不同操作阶段提供额外的功能和灵活性。
  4. API:供第三方程序调用的应用程序编程接口

二.Ansible安装和入门

1.本地yum安装

########yum源安装###############
[root@node1 yum.repos.d]#vim CentOS-Base.repo 
#加入 epel源
[epel]
name=gn
baseurl=https://mirrors.aliyun/epel/$releasever/x86_64
        https://mirrors.cloud.tencent/epel/$releasever/x86_64
        https://mirrors.huaweicloud/epel/$releasever/x86_64
        https://mirrors.tuna.tsinghua.edu/epel/$releasever/x86_64
gpgcheck=0


[root@node1 yum.repos.d]#yum info  ansible
已加载插件:fastestmirror, langpacks
base                                                                                | 3.6 kB  00:00:00     
epeel                                                                               | 4.7 kB  00:00:00     
extras                                                                              | 2.9 kB  00:00:00     
updates                                                                             | 2.9 kB  00:00:00     
(1/3): epeel/7/group_gz                                                             |  96 kB  00:00:00     
(2/3): epeel/7/updateinfo                                                           | 1.0 MB  00:00:00     
(3/3): epeel/7/primary_db                                                           | 7.0 MB  00:00:04     
Loading mirror speeds from cached hostfile
 * base: mirrors.163
 * epeel: mirrors.aliyun
 * extras: mirrors.163
 * updates: mirrors.163
可安装的软件包
名称    :ansible
架构    :noarch
版本    :2.9.25
发布    :1.el7
大小    :17 M
源    :epeel/7
简介    : SSH-based configuration management, deployment, and task execution system
网址    :http://ansible
协议    : GPLv3+
描述    : Ansible is a radically simple model-driven configuration management,
         : multi-node deployment, and remote task execution system. Ansible works
         : over SSH and does not require any software or daemons to be installed
         : on remote nodes. Extension modules can be written in any language and
         : are transferred to managed machines automatically.



[root@node1 yum.repos.d]#yum install ansible -y
yum install epel-release.noarch  -y
yum install ansible -y

2.编译安装

#############编译安装#########################
yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
wget https://releases.ansible/ansible/ansible-1.5.4.tar.gz
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible

###############Git方式#######################
yum install git
git clone git://github/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup

3.查看基本信息

[root@localhost yum.repos.d]# ansible --version

4.相关文件

  • /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的ansible.cfg文 件

  • /etc/ansible/hosts 主机清单

  • /etc/ansible/roles/ 存放角色的目录

5.ansible主配置文件

Ansible 的配置文件可以放在多个不同地方,优先级从高到低顺序如下

ANSIBLE_CONFIG #环境变量,注意此项用 ansible --version 看不到,但可以生效
./ansible.cfg   #当前目录下的ansible.cfg
~/.ansible.cfg #当前用户家目录下的.ansible.cfg
/etc/ansible/ansible.cfg  #系统默认配置文件

Ansible 的默认配置文件 /etc/ansible/ansible.cfg ,其中大部分的配置内容无需进行修改

[defaults]
#inventory     = /etc/ansible/hosts     #主机列表配置文件
#library = /usr/share/my_modules/         #库文件存放目录
#remote_tmp = $HOME/.ansible/tmp         #临时py命令文件存放在远程主机目录
#local_tmp     = $HOME/.ansible/tmp     #本机的临时命令执行目录
#forks         = 5                       #默认并发数
#sudo_user     = root                     #默认sudo 用户
#ask_sudo_pass = True                     #每次执行ansible命令是否询问ssh密码
#ask_pass     = True   
#remote_port   = 22
#host_key_checking = False                 #检查对应服务器的host_key,建议取消此行注释,实现第一次连接自动信任目标主机
#log_path=/var/log/ansible.log             #日志文件,建议启用
#module_name = command           、mod        #默认模块,可以修改为shell模块
[privilege_escalation]                     #普通用户提权配置
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

5.inventory主机清单文件

ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory 主机清单文件中将其分组组织

官方文档:How to build your inventory — Ansible Community Documentation

默认的inventory file 位置在:

/etc/ansible/hosts

参数详细说明

ansible_ssh_host 
#将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port 
#ssh端口号.如果不是默认的端口号,通过此变量设置.这种可以使用 ip:端口
192.168.1.100:2222

ansible_ssh_user 
#默认的 ssh 用户名

ansible_ssh_pass 
#ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)

ansible_sudo_pass 
#sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)

ansible_sudo_exe (new in version 1.8)
#sudo 命令路径(适用于1.8及以上版本)

ansible_connection 
#与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.

ansible_ssh_private_key_file
#ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.

ansible_shell_type 
#目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为'csh' 或 'fish'.

ansible_python_interpreter 
#目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python 不是 2.X 版本的Python.之所以不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).与ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....

6.示例:

(1)配置远程主机清单

vim  /etc/ansible/hosts
[web]                  #配置组名
192.168.240.12         #组中成员ip
192.168.240.13

(2)设置免密登录

免密登录脚本

#!/bin/bash
PASS=123
#设置网段最后的地址,4-255之间,越小扫描越快
END=254
 
IP=`ip a s ens33 | awk -F'[ /]+' 'NR==3{print $3}'`
NET=${IP%.*}.
 
rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=3;i<="$END";i++));do
ping -c 1 -w 1  ${NET}$i &> /dev/null  && echo "${NET}$i" >> SCANIP.log &
done
wait
 
ssh-keygen -P "" -f /root/.ssh/id_rsa
rpm -q sshpass || yum -y install sshpass
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP
 
AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
done

7.ansible相关工具

  • /usr/bin/ansible 主程序,临时命令执行工具

  • /usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man ansible-doc -l |grep 关键字 具体模块名字

  • /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本

  • /usr/bin/ansible-pull 远程执行命令的工具

  • /usr/bin/ansible-vault 文件加密工具

  • /usr/bin/ansible-console 基于Console界面与用户交互的执行工具

  • /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台

8.ansible格式和选项

格式:

ansible <host-pattern> [-m module_name] [-a args]
命令     主机或者清单中的组 -m 指定模块      -a  执行的任务

选项

选项说明
--version#显示版本
-m module #指定模块,默认为command
-v #详细过程 -vv -vvv更详细
--list-hosts     #显示主机列表,可简写 --list
-C, --check#检查,并不执行
-T, --timeout=TIMEOUT #执行命令的超时时间,默认10s
-k, --ask-pass#提示输入ssh连接密码,默认Key验证
-u, --user=REMOTE_USER     #执行远程执行的用户,默认root
-b, --become #代替旧版的sudo 切换
--become-user=USERNAME #指定sudo的runas用户,默认为root  vim /etc/sudoers 用户权限
-K,  --ask-become-pass #提示输入sudo时的口令
-f   FORKS, --forks FORKS #指定并发同时执行ansible任务的主机数
ansible-doc -l#查看所有支持的模块
ansible-doc ping#该模块的详细信息
ansible-doc file#查看file模块的详细信息

示例:

在本地执行,指定模块ping 

9.ansible命令执行过程

1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
#[root@node1 ~]#ansible all -a "sleep 100" -f4
#cd /root/.ansible/tmp
2. 加载自己对应的模块文件,如:command
3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
4. 给文件+x执行
5. 执行并返回结果
6. 删除临时py文件,退出

$HOME 为当前用户的家目录

执行返回结果

  • 绿色:执行成功并且不需要做改变的操作

  • 黄色:执行成功并且对目标主机做变更

  • 红色:执行失败

10.ansible-console

ansible-console是 Ansible 提供的一种交互式命令行界面(CLI),允许用户在控制台中直接运行 Ansible 模块和命令。它类似于一个 REPL(Read-Eval-Print Loop)环境,方便用户即时执行和测试 Ansible 命令,而不需要编写和运行完整的 Ansible playbook。

三.Ansible模块

2015年底270多个模块,2016年达到540个,2018年01月12日有1378个模块,2018年07月15日1852个模块,2019年05月25日(ansible 2.7.10)时2080个模块,2020年03月02日有3387个模块虽然模块众多,但最常用的模块也就2,30个而已,针对特定业务只用10几个模块

常用模块帮助文档参考:

https://docs.ansible/ansible/2.9/modules/modules_by_category.html https://docs.ansible/ansible/2.9/modules/list_of_all_modules.html ​​https://docs.ansible/ansible/latest/modules/list_of_all_modules.html https://docs.ansible/ansible/latest/modules/modules_by_category.html

1.Command模块

功能:在远程主机执行命令,此为默认模块,可忽略 -m 选项

注意:此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现

注意:此模块不具有幂等性

注意:不支持一些重定向等功能

示例:

远程执行在12 ,13上创建ky36.txt文件和查看文件

2.shell 模块

功能:和command相似,用shell执行命令,支持各种符号,比如:*,$, >

注意:此模块不具有幂等性

示例:

[root@localhost ~]# ansible web -m shell -a "echo hello > /opt/hello.txt"
#如果没有明确指明文件生成的目录,会默认在家目录下生成
[root@localhost ~]# ansible web -m shell -a "cat /opt/hello.txt"

修改默认模块

vim  /etc/ansible/ansible.cfg

3.Script 模块

功能:在远程主机上运行ansible服务器上的脚本(无需执行权限)

注意:此模块不具有幂等性

示例:

在ansible服务器的/data目录下创建脚本test.sh 

远程执行ansible服务器上的脚本,注意路径为/data目录下,在主目录下应为/root

4.copy模块

功能:从ansible服务器主控端复制文件到远程主机

注意: src=file 如果是没指明路径,则为当前目录或当前目录下的files目录下的file文件

关键字

src       代表源文件路径
dest      代表文件落地路径
owner     属主
group     属组
mode      代表权限
backup  如果复制时有同名文件会先备份再复制

示例:

ansible web -m copy -a "src=/etc/passwd dest=/data/ owner=zhangsan mode=700"
#将ansible服务器主控端复制文件/etc/passwd到远程主机/data/下,属主为zhangsan 权限为700

etc      不加      /       连etc  一起复制
etc       加          /           只复制etc下的文件

5.Get_url 模块

功能: 用于将文件从http、https或ftp下载到被管理机节点上

url: 下载文件的URL,支持HTTP,HTTPS或FTP协议
dest:下载到目标路径(绝对路径),如果目标是一个目录,就用服务器上面文件的名称,如果目标设置了名称就用目标设置的名称
owner:指定属主
group:指定属组
mode:指定权限
force:如果yes,dest不是目录,将每次下载文件,如果内容改变,替换文件。如果否,则只有在目标不存在时才会下载该文件

checksum:对目标文件在下载后计算摘要,以确保其完整性
url_username:用于HTTP基本认证的用户名。对于允许空密码的站点,此参数可以不使用`url_password'
url_password:用于HTTP基本认证的密码。如果未指定`url_username'参数,则不会使用`url_password'参数
validate_certs:如果“no”,SSL证书将不会被验证。适用于自签名证书在私有网站上使用
timeout: URL请求的超时时间,秒为单位

示例:

ansible web -m get_url -a "url=https://nginx/download/nginx-1.18.0.tar.gz dest=/opt"

6.Fetch模块

功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录

示例:

将远程主机上的/etc/passwd文件 提取到ansible的主控端/data/目录下

ansible  web -m fetch -a "src=/etc/passwd  dest=/data"

将远程主机上的/var/log/messages文件 提取到ansible的主控端/data/目录下

ansible服务器切换到目录/data/下,使用tree命令查看文件

7.File模块

功能:设置文件属性,创建软链接等

关键字:

path       指定文件路径
state      文件状态 有:新建(touch) 删除(absent) 文件夹(directory)  连接文件(link)等
src        源文件
mode       权限
owner      属主
group      属组
recurse    递归

示例:

(1)创建空文件
ansible web -m file -a 'path=/mnt/web.txt state=touch owner=zhangsan group=zhangsan mode=755'

(2)新建目录
ansible web -m file -a 'path=/mnt/web state=directory'

(3)新建软链接
ansible web -m file -a 'src=/mnt/web path=/opt/web-link state=link'
#新建软连接 path|dest|name   这三个选项都可以使用

(4)删除文件
ansible web -m file -a 'path=/opt/web-link state=absent'

8.stat 模块

功能:检查文件或文件系统的状态

注意:对于Windows目标,请改用win_stat模块

选项

path:文件/对象的完整路径(必须)

常用的返回值判断:

exists: 判断是否存在
isuid: 调用用户的ID与所有者ID是否匹配

示例:

ansible web -m stat -a 'path=/mnt/test.txt'
查看文件是否存在

9.unarchive模块

功能:解包解压缩

实现有两种用法:

1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes,此为默认值,可省略

2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no

copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为copy=no,会在远程主机上寻找src源文件
remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible主机上
src:源路径,可以是ansible主机上的路径,也可以是远程主机(被管理端或者第三方主机)上的路径,如果是远程主机上的路径,则需要设置copy=no
dest:远程主机上的目标路径
mode:设置解压缩后的文件权限

示例:

将ansible服务器/opt目录上的nginx安装包解压到远程主机上/opt目录下

ansible  web -m unarchive -a "src=/opt/nginx-1.18.0.tar.gz dest=/opt"

10.Archive模块

功能:打包压缩保存在被管理节点

path:指定要创建存档的源路径。可以是文件或目录。

dest:指定存档文件的目标路径,包括文件名和扩展名。如果未指定格式(通过format参数),则根据扩展名自动推断格式。

format:指定存档文件的格式。可选值包括tartar.gztar.bz2tar.xzzip等。如果未指定,Ansible会根据dest的扩展名自动推断格式。

force:如果为yes,强制重新创建存档文件(如果已存在)。默认为no

示例:

将远程主机的/var/log下日志文件打包到/data/下,文件格式为bz2,属主为root,权限为600

ansible  web -m archive -a "path=/var/log  dest=/data/log.tar.bz2 format=bz2 owner=root mode=600"

11.Hostname模块

功能:管理主机名

ansible web -m hostname -a 'name=node3 '
#一般不使用此模块,主机名会一致

12.Cron模块

功能:计划任务

支持时间:minute,hour,day,month,weekday

关键字:

name  会生成一行注释,标题
job   执行的命令

示例:

在远程主机上执行计划任务,每周一至周五的凌晨2:30执行test.sh脚本

删除计划任务

13.Yum和Apt模块

功能:yum 管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本apt 模块管理 Debian 相关版本的软件包

name参数: 必须参数,用于指定需要管理的软件包
state参数: 用于指定软件包的状态 ,默认值为。present,表示确保软件包已经安装,除了。present,其他可用值有 installed, latest、absent、removed,其中 installed 与present 等效,latest 表示安装 yum 中最新的版本,absent 和 removed 等效,表示删除对应的软件包。
disable_gpg_check参数:    用于禁用对 rpm 包的公钥 gpg 验证。默认值为 no,表示不禁用验证,设置为 yes 表示禁用验证,即不验证包,直接安装。在 对应的 yum 源没有开启 gpg 验证的情况下,需要将此参数的值设置为 yes,否则会报错而无法进行安装。
enablerepo参数: 用于指定安装软件包时临时启用的 yum 源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时 将此参数的值设置为 yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源。
disablerepo参数:用于指定安装软件包时临时禁用的 yum 源。某些场景下需要此参数,比如,当多个 yum 源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包。  enablerepo 参数和 disablerepo 参数可以同时使用

参数说明
name所安装的包的名称
state  present--->安装, latest--->安装最新的, absent---> 卸载软件。
update_cache 强制更新yum的缓存
conf_file 指定远程yum安装时所依赖的配置文件(安装本地已有的包)。
disable_pgp_check是否禁止GPG checking,只用于presentor latest。
disablerepo临时禁止使用yum库。 只用于安装或更新时。
enablerepo 临时使用的yum库。只用于安装或更新时

示例:

在远程主机上安装httpd服务

ansible  web -m yum -a "name=httpd state=present"

14.yum_repository模块

功能:建立yum仓库模块

关键字:

name参数:  必须参数,用于指定要操作的唯一的仓库ID,也就是”.repo”配置文件中每个仓库对应的”中括号”内的仓库ID。
baseurl参数:  此参数用于设置 yum 仓库的 baseurl。
description参数: 此参数用于设置仓库的注释信息,也就是”.repo”配置文件中每个仓库对应的”name字段”对应的内容。
file参数: 此参数用于设置仓库的配置文件名称,即设置”.repo”配置文件的文件名前缀,在不使用此参数的情况下,默认以 name 参数的仓库ID作为”.repo”配置文件的文件名前缀,同一个”.repo” 配置文件中 可以存在多个 yum 源。
enabled参数: 此参数用于设置是否激活对应的 yum 源,此参数默认值为 yes,表示启用对应的 yum 源,设置为 no 表示不启用对应的 yum 源。
gpgcheck参数:此参数用于设置是否开启 rpm 包验证功能,默认值为 no,表示不启用包验证,设置为 yes 表示开启包验证功能。
gpgcakey参数: 当 gpgcheck 参数设置为 yes 时,需要使用此参数指定验证包所需的公钥。
state参数: 默认值为 present,当值设置为 absent 时,表示删除对应的 yum 源

示例:

在远程主机上建立本地yum仓库

ansible web -m yum_repository -a 'name=epel description=epel  baseurl=https://download.fedoraproject/pub/epel/$releasever/$basearch/ gpgcheck=no file=epel'

15.Service模块

功能:管理服务

关键字:

name参数:此参数用于指定需要操作的服务名称,比如 nginx。
state参数:此参数用于指定服务的状态,比如,我们想要启动远程主机中的 nginx,则可以将 state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted、reloaded。
enabled参数: 此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。

示例:

将远程主机的httpd服务关闭,并设置为开机自启

ansible web -m service -a 'name=httpd state=stopped enabled=yes'

16.mount模块

功能: 挂载和卸载文件系统

常用参数功能
src指定要挂载的设备或分区路径。
path指定要挂载到的目标路径。
fstype指定要挂载的文件系统类型。
state指定挂载状态,可选值为 mountedunmounted 或 absent
opts指定挂载选项,例如挂载选项或参数。

示例:

将远程主机的光盘永久挂载到/mnt上,文件系统类型为iso9660

ansible web -m mount -a 'src=/dev/sr0 path=/mnt state=mounted fstype=iso9660'

17.User模块

功能:管理用户

comment         用户的描述信息
createhome      是否创建家目录
force           在使用state=absent时, 行为与userdel –force一致.
group           指定基本组
groups          指定附加组,如果指定为(groups=)表示删除所有组
home            指定用户家目录
move_home       如果设置为home=时, 试图将用户主目录移动到指定的目录
name            指定用户名
non_unique      该选项允许改变非唯一的用户ID值
password        指定用户密码,使用 SHA512 hash
remove          在使用state=absent时, 行为是与userdel –remove一致
shell           指定默认shell
state           设置帐号状态,不指定为创建,指定值为absent表示删除
system          当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid             指定用户的uid
update_ password 
  always      如果password参数设置的值与用户当前的加密过的密码字符串不一致,则直接更新用户的密码,默认值即为always
  on_create   如果password参数设置的值与用户当前的加密过的密码字符串不一致,则不会更新用户的密码字符串,保持之前的密码设定

示例:

在远程主机上创建用户

18.group模块

功能管理组

#创建组
ansible web -m group  -a 'name=nginx gid=88 system=yes'
#删除组
ansible web -m group  -a 'name=nginx state=absent'

19.reboot模块

功能:重启主机

20.Lineinfile模块

ansible在使用sed进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时,存在问题,无法正常进行替换 。其实在ansible自身提供了两个模块:lineinfile模块和replace模块,可以方便的进行替换一般在ansible当中去修改某个文件的单行进行替换的时候需要使用lineinfile模块

regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。

功能:相当于sed,可以修改文件内容

如匹配到多行默认替换最后一行

path            指定要操作的文件
regexp            使用正则表达式匹配对应的行
line            修改为新的内容
insertafter        将文本插入到“指定的行”之后
insertbefore    将文本插入到“指定的行”之前
state            删除对应的文本时,需要state=absent
backrefs        1.支持后向引用、2.当未匹配到内容则不操作文件
backup            是否在修改文件之前对文件进行备份
create            当要操作的文件并不存在时,是否创建对应的文件

示例:

匹配到远程主机的/etc/httpd/conf/httpd.conf文件中的以listen开头的行,替换为listen8080

匹配'^listen.*'

21.replace模块

该模块有点类似于sed命令,主要也是基于正则进行匹配和替换,建议使用

当匹配到多行时全部替换

示例:

匹配到远程主机的/etc/httpd/conf/httpd.conf文件中的以listen开头的行,替换为listen8080

22.setup模块

功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度

可以使用 gather_facts: no 来禁止 Ansible 收集 facts 信息

示例:

收集远程主机的主机名等信息

收集远程主机的ip地址信息

四.Playbook

Ansible Playbook 提供了一种声明性的方式来描述系统配置和应用程序部署,使得自动化任务管理变得更加简单和可维护。通过组织 Playbook,可以实现复杂的系统配置管理,同时保持配置的一致性和可重复性。

vim   ~/.vimrc
set ai   #相同缩进换行
set ts=2 #tab键转换为空格的数量

1.三种常见的数据格式

  • XML:Extensible Markup Language,可扩展标记语言,可用于数据交换和配置

  • JSON:JavaScript Object Notation, JavaScript 对象表记法,主要用来数据交换或配置,不支持注释

  • YAML:YAML Ain't Markup Language YAML 不是一种标记语言, 主要用来配置,大小写敏感,不支持tab

2.playbook特点

  • playbook 剧本是由一个或多个"play"组成的列表

  • play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作

  • Playbook 文件是采用YAML语言编写的

3.YUML语言介绍

YAML:YAML Ain't Markup Language,即YAML不是标记语言。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)

YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者,目前很多最新的软件比较流行采用此格式的文件存放配置信息,如:ubuntu,anisble,docker,kubernetes等

YAML 官方网站:The Official YAML Web Site

ansible 官网: YAML Syntax — Ansible Community Documentation

YAML 语言特性

  • YAML的可读性好

  • YAML和脚本语言的交互性好

  • YAML使用实现语言的数据类型

  • YAML有一个一致的信息模型

  • YAML易于实现

  • YAML可以基于流来处理

  • YAML表达能力强,扩展性好

YAML语法简介

  • 在单一文件第一行,用连续三个连字号"-" 开始,还有选择性的连续三个点号( ... )用来表示文件的结尾

  • 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能

  • 使用#号注释代码

  • 缩进必须是统一的,不能空格和tab混用

  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的

  • YAML文件内容是区别大小写的,key/value的值均需大小写敏感

  • 多个key/value可同行写也可换行写,同行使用,分隔

  • key后面冒号要加一个空格 比如: key: value

  • value可是个字符串,也可是另一个列表

  • YAML文件扩展名通常为yml或yaml

支持的数据类型

  • YAML 支持以下常用几种数据类型:

  • 标量:单个的、不可再分的值

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)

  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

4.playbook核心组件

一个playbook 中由多个组件组成,其中所用到的常见组件类型如下:

  • Hosts 执行的远程主机列表

  • Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最少元素需包括 name 和 task,一个name只能包括一个task

  • Variables 内置变量或自定义变量在playbook中调用

  • Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件

  • Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行

  • tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断

ansible-doc yum
#查看模块 用ansible-doc  加上 模块名  可以查看模块的使用方法和例子

4.1  host组件

Hosts: playbook 中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用 于指定要执行指定任务的主机,须事先定义在主机清单中

one.example one.example:two.example 192.168.1.50     192.168.1.*
Websrvs:dbsrvs    #或者,两个组的并集W
ebsrvs:&dbsrvs    #与,两个组的交集
webservers:!dbsrvs    #在websrvs组,但不在dbsrvs组

4.2  remote_user组件

remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户

4.3  task列表和action组件

play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task

task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。 如果未提供name,则action的结果将用于输出。

task两种格式:

action: module arguments    
#示例: action: shell wall hello

module: arguments    
#示例: shell: wall hello

注意:shell和command模块后面跟命令,而非key=value

示例:

(1)在远程主机创建用户test

脚本配置

---
- hosts: web
  remote_user: root
  gather_facts: no

  tasks:
    - name: create user
      user: name=test uid=2000 shell=/sbin/nologin system=yes create_home=no

远程主机查看

(2)安装httpd并启动
---
- hosts: web
  remote_user: root
  gather_facts: no

  tasks:
    - name: install httpd
      yum: name=httpd
    - name: start httpd
      service: name=httpd state=started enabled=yes

4.4  handlers 和 notify

Handlers本质是task list ,类似于MySQL中的触发器触发的行为,其中的task与前述的task并没有本质上的不同,主要用于当关注的资源发生变化时,才会采取一定的操作。而Notify对应的action可用于在每个play的最后被触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作

注意:

  • 如果多个task通知了相同的handlers, 此handlers仅会在所有tasks结束后运行一 次。

  • 只有notify对应的task发生改变了才会通知handlers, 没有改变则不会触发handlers

  • handlers 是在所有前面的tasks都成功执行才会执行,如果前面任何一个task失败,会导致handler跳过执行,可以使用force_handlers: yes 强制执行handler

---
- hosts: web
  gather_facts: no

  tasks:
    - name: add group
      group: name=nginx state=present
    - name: add user
      user: name=nginx state=present group=nginx
    - name: web page
      copy: src=/etc/yum.repos.d/epel.repo  dest=/etc/yum.repos.d
    - name: install nginx
      yum: name=epel-release.noarch
      yum: name=nginx  state=present
    - name: config  file
      copy: src=/data/nginx.conf  dest=/etc/nginx/
      notify:
        - restart nginx
    - name: web page
      copy: src=/data/index.html  dest=/usr/share/nginx/html
    - name: start nginx
      service: name=nginx state=started  enabled=yes
  
  handlers:
    - name: restart nginx
      service: name=nginx state=restarted
   -  name:   stop  nginx
      service: name=nginx state=restarted 
4.5  gather_facts

gather_facts: yes   #收集信息(默认为收集信息)

gather_facts: no     #表示不收集信息, 但是使用变量时需要收集

4.6  ignore_errors

如果一个task出错,默认将不会继续执行后续的其它task

利用 ignore_errors: yes 可以忽略此task的错误,继续向下执行playbook其它task

示例:

---
- hosts: web

  tasks:
    - name: error
      command: /bin/false
      ignore_errors: yes
    - name: continue
      command: wall continue

运行此脚本时前面出错并不会影响接下来的操作

5.playbook命令

--syntax-check      #语法检查,可缩写成--syntax, 相当于bash -n 
-C --check #模拟执行,只检测可能会发生的改变,但不真正执行操作,dry run 
--list-hosts    #列出运行任务的主机
--list-tags #列出tag
--list-tasks #列出task
--limit 主机列表 #只针对主机列表中的特定主机执行
-i INVENTORY        #指定主机清单文件,通常一个项对应一个主机清单文件
--start-at-task START_AT_TASK #从指定task开始执行,而非从头开始,START_AT_TASK为任务的name
-v -vv  -vvv #显示过程

示例:

检查语法,不执行真正的操作

6.ansible编译安装nginx脚本

在执行脚本前需要关闭防火墙,创建nginx用户

useradd -M -s /sbin/nologin nginx

在ansible服务器中向/usr/lib/systemd/system/nginx.service 写入文件

tee /usr/lib/systemd/system/nginx.service   <<eof
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
ExecStart=/apps/nginx/sbin/nginx
ExecReload=/bin/kill -1 $MAINPID
ExecStop=/bin/kill -3 $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
eof
---
- hosts:  web
  gather_facts:  no


  tasks: 
    - name:  install  packages
      yum: 
        name:  
          - gcc 
          - pcre-devel 
          - openssl-devel 
          - zlib-devel 
          - openssl  
          - openssl-devel
        state:  present   
    - name:  unarchive
      unarchive: src=/opt/nginx-1.18.0.tar.gz  dest=/opt
    - name:  bianyi
      command: ./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
      args:
        chdir: /opt/nginx-1.18.0

    - name:   make
      command: make
      args:
        chdir: /opt/nginx-1.18.0
    
    - name:   make  install
      command: make  install
      args:
        chdir: /opt/nginx-1.18.0

    - name: cpoy  service
      copy:  src=/usr/lib/systemd/system/nginx.service    dest=/usr/lib/systemd/system/nginx.service
    
    - name:   reload
      command: systemctl  daemon-reload
    
    - name: link
      shell:  ln -s  /apps/nginx/sbin/nginx   /usr/bin       
      

    - name:  start  nginx
      service:  name=nginx  state=started  enabled=yes
    
    - name:  web page
      tags:  page
      copy:  src=/data/index.html    dest=/apps/nginx/html 

7.tags 标签

在playbook文件中,可以利用tags组件,为特定 task 指定标签,当在执行playbook时,可以只执行特定tags的task,而非整个playbook文件

vim httpd.yml
---
# tags example
- hosts: websrvs
 remote_user: root
 gather_facts: no
  
 tasks:
    - name: Install httpd
     yum: name=httpd state=present
    - name: Install configure file
     copy: src=files/httpd.conf dest=/etc/httpd/conf/
     tags: conf
    - name: start httpd service
     tags: service
      service: name=httpd state=started enabled=yes
      
      
[root@ansible ~]#ansible-playbook –t conf,service httpd.yml

8.playbook中使用变量

变量名:仅能由字母、数字和下划线组成,且只能以字母开头

  vars:   #自定义变量,只能在当前play有效
    - 变量1: 值1  #格式为key: value
    - 变量2: 值2
  tasks:  #在任务列表中引用变量
    -name:
     module: {{变量1}}

变量调用方式:

通过{{ variable_name }} 调用变量,且变量名前后建议加空格,有时用"{{ variable_name }}"才生效

变量来源:

  1. ansible 的 setup facts 远程主机的所有变量都可直接调用

  2. 通过命令行指定变量,优先级最高

ansible-playbook -e varname=value test.yml

8.1  使用setup模块中变量

本模块自动在playbook调用,不要用ansible命令调用,生成的系统状态信息, 并存放在facts变量中

facts 包括的信息很多,如: 主机名,IP,CPU,内存,网卡等

facts 变量的实际使用场景案例

  • 通过facts变量获取被控端CPU的个数信息,从而生成不同的Nginx配置文件

  • 通过facts变量获取被控端内存大小信息,从而生成不同的memcached的配置文件

  • 通过facts变量获取被控端主机名称信息,从而生成不同的Zabbix配置文件

[root@localhost data]#ansible  localhost  -m setup

#查看所有变量

8.2  在playbook 命令行中定义变量

使用 ansible-playbook -e 选项

示例:

在命令中使用变量

安装应用

vim  test2.yml

---
- hosts: websrvs
 remote_user: root
 tasks:
   - name: install package
     yum: name={{ pkname }} state=present
     


ansible-playbook   -e  pkname=httpd  

新建用户

---
- hosts: web
  gather_facts: no


  tasks:
    - name: create  user
      user: name={{ myname }}   system=yes  create_home=no
    - name: create  user
      user: name={{ myname1 }}   system=yes  create_home=no


ansible-playbook   -e  myname=cxk  -e myname1=wyf  playbook名字
8.3  定义变量文件
[root@localhost data]#vim var
# 定义变量  pkname1  pkname2
pkname1: tree
pkname2: telnet


vim   test1.yml
---
- hosts: web
  gather_facts: no
  
  tasks:
    - name: install  {{pkname1}}
      yum:  name={{pkname1}}  state=present
    - name: install {{pkname2}}
      yum: name={{pkname2}}  state=present

[root@localhost data]#ansible-playbook -e "@var"  test1.yml 
#  @代表文件    var 即是文件名
8.4直接在playbook文件中建立变量

使用vars组件

---
- hosts: web
  vars:
    username: test1
    groupname: group1


  tasks:
    - name: create group
      group: name={{ groupname }}  state=present
    - name: create user
      user: name={{ username }} state=present
8.5使用独立的变量文件

可以在一个独立的playbook文件中定义变量,在另一个playbook文件中引用变量文件中的变量,比playbook中定义的变量优化级高

#先写一个变量文件
vim vars.yml
---
# variables file
package_name: mariadb-server
service_name: mariadb

#调用这个文件
vim var5.yml
---
#install package and start service
- hosts: dbsrvs
  remote_user: root
  vars_files:
    - vars.yml
    
tasks:
    - name: install package
      yum: name={{ package_name }}
      tags: install
    - name: start service
      service: name={{ service_name }} state=started enabled=yes

五.role角色

角色是ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中

运维复杂的场景:建议使用 roles,代码复用度高

roles:多个角色的集合目录, 可以将多个的role,分别放至roles目录下的独立子目录中,如下示例

roles/
    mysql/
    nginx/
    tomcat/
    redis/

默认roles存放路径

/root/.ansible/roles
/usr/share/ansible/roles
/etc/ansible/roles

官方文档:

Roles — Ansible Community Documentation

1.Ansible Roles目录编排

roles目录结构如下所示

每个角色,以特定的层级目录结构进行组织

playbook1.yml
playbook2.yml
roles/
  project1/
    tasks/
    files/
    vars/       
    templates/
    handlers/
    default/    
    meta/       
  project2/
    tasks/
    files/
    vars/       
    templates/
    handlers/
    default/    
    meta/

Role各目录作用

  • roles/project/ :项目名称,有以下子目录

  • files/ :存放由copy或script模块等调用的文件

  • templates/:template模块查找所需要模板文件的目录

  • tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含

  • handlers/:至少应该包含一个名为main.yml的文件;此目录下的其它的文件需要在此文件中通过include进行包含

  • vars/:定义变量,至少应该包含一个名为main.yml的文件;此目录下的其它的变量文件需要在此文件中通过include进行包含

  • meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中通过include进行包含

  • default/:设定默认变量时使用此目录中的main.yml文件,比vars的优先级低

2.建立role

创建role的步骤

1 创建role的目录结构.在以roles命名的目录下分别创建以各角色名称命名的目录,如mysql等,在每个角色命名的目录中分别创建相关的目录和文件,比如tasks、files、handlers、templates和vars等目录;用不到的目录可以创建为空目录,也可以不创建

2 编写和准备role的功能文件

3 编写playbook文件调用需要的角色应用于指定的主机

针对大型项目使用Roles进行编排

示例:用 ansible-galaxy 创建角色目录的结构

[root@localhost roles]#mkdir -pv  /etc/ansible/roles/nginx/{tasks,templates,handlers,files} 
mkdir: 已创建目录 "/etc/ansible/roles/nginx/tasks"
mkdir: 已创建目录 "/etc/ansible/roles/nginx/templates"
mkdir: 已创建目录 "/etc/ansible/roles/nginx/handlers"
mkdir: 已创建目录 "/etc/ansible/roles/nginx/files"
[root@localhost roles]#tree
.
└── nginx
    ├── files
    ├── handlers
    ├── tasks
    └── templates

5 directories, 0 files


[root@localhost nginx]#vim tasks/main.yml
[root@localhost nginx]#cat tasks/main.yml 
- include: group.yml
- include: user.yml
- include: install.yml
- include: config.yml
- include: webpage.yml
- include: service.yml


[root@localhost nginx]#vim tasks/group.yml
- name: groups
  group: name=nginx  state=present


[root@localhost nginx]#vim tasks/user.yml
- name: user
  user: name=nginx  state=present


[root@localhost nginx]#vim tasks/install.yml
- name: install epel
  yum: name=epel-release.noarch  state=present
- name: install nginx
  yum: name=nginx   state=present

[root@localhost nginx]#vim tasks/config.yml
- name: web file
  copy: src=/data/index.html   dest=/usr/share/nginx/html/

[root@localhost nginx]#vim  tasks/service.yml 
- name: start nginx
  service: name=nginx state=started


[root@localhost nginx]#tree
.
├── files
├── handlers
├── tasks
│   ├── config.yml
│   ├── group.yml
│   ├── install.yml
│   ├── main.yml
│   ├── service.yml
│   └── user.yml
└── templates

本文标签: ansible