一、概况
1、什么是Ansible
Ansible 是一款开源的自动化运维工具,广泛应用于配置管理、应用部署、任务执行和编排等领域。它以其简单易用、高效稳定和强大的功能而受到众多企业和开发者的青睐。
2、Ansible的背景
在传统运维工作中,服务器配置、软件部署、系统更新等任务通常需要人工手动操作。随着企业规模的扩大和业务的复杂化,手动运维不仅效率低下,还容易出错。Ansible 的出现正是为了解决这些问题,通过自动化的方式实现高效、可靠的运维管理。
3、Ansible的起源
Ansible 由 Michael DeHaan 在 2012 年创建,最初是为了简化服务器配置管理而设计的工具。它借鉴了 Puppet、Chef 等其他自动化工具的优点,并结合了 Python 编程语言的强大功能。Ansible 在 2015 年被 Red Hat 公司收购,进一步推动了其在开源社区和企业中的发展。
4、自动化运维时代
应用一、批量执行命令;应用二、批量安装服务;应用三、批量配置同步;应用四、批量任务执行;应用五、批量代码部署
1、提高工作效率 2、提高工作准确率 3、减少维护成本 4、减少重复性工作
二、Ansible的核心特点
1、无客户端
1.1、特点说明
Ansible 不需要在目标主机上安装任何客户端软件。它通过 SSH(Secure Shell)协议与目标主机进行通信,利用 SSH 的身份验证和加密机制来确保通信的安全性。这种方式大大简化了部署和管理过程,降低了运维成本。
1.2、优势
(1)无需在目标主机上安装额外的软件,减少了系统的复杂性和潜在的兼容性问题。
(2)对于一些受限环境(如不允许安装第三方软件的服务器),Ansible 依然可以正常工作。
2、基于Python开发
2.1、特点说明
Ansible 使用 Python 编程语言开发,Python 是一种广泛使用的高级编程语言,具有简洁易读的语法和丰富的库支持。Ansible 的模块和插件也大多使用 Python 编写,这使得开发者可以轻松扩展和定制 Ansible 的功能。
2.2、优势
(1)开发者可以利用 Python 的强大功能来编写复杂的任务逻辑,实现高度定制化的自动化脚本。
(2)Python 社区的活跃性为 Ansible 提供了丰富的资源,例如可以方便地集成第三方库来扩展功能。
3、使用 YAML 编写配置文件
3.1、特点说明
Ansible 的配置文件(Playbook)使用 YAML(YAML Ain't Markup Language)格式编写。YAML 是一种简洁、易读的标记语言,用于数据序列化。它以清晰的层次结构和缩进方式表示数据,使得配置文件易于编写和理解。
3.2、优势
(1)对于非技术背景的运维人员来说,YAML 格式的配置文件更容易上手,减少了学习成本。
(2)YAML 的层次结构清晰,可以直观地表示任务的执行顺序和依赖关系,便于维护和管理。
4、模块化设计
4.1、特点说明
Ansible 的操作是通过模块来实现的。Ansible 提供了大量内置的模块,涵盖了系统管理、网络配置、云服务等多个领域。每个模块都封装了特定的功能,例如文件操作、服务管理、软件安装等。用户可以通过简单的命令调用这些模块来完成复杂的任务。
4.2、优势
(1)模块化设计使得 Ansible 的功能非常灵活,用户可以根据需要选择合适的模块来构建自动化任务。
(2)社区贡献了大量的模块,用户可以方便地获取和使用这些模块来扩展 Ansible 的功能。
三、Ansible的工作原理
1、基本架构
1.1、控制节点 (Control Node)
控制节点是运行 Ansible 的主机,它负责管理其他主机(被管理节点)。控制节点上安装了 Ansible 软件,并配置了相关的 Playbook 和主机清单文件。
1.2、被管理节点(Managed Node)
被管理节点是需要进行自动化操作的目标主机,例如服务器、虚拟机等。控制节点通过 SSH 连接到被管理节点,执行自动化任务。
1.3、主机清单(Inventory)
主机清单是一个文件,用于定义被管理节点的列表和分组信息。控制节点根据主机清单文件来确定需要管理的主机范围。用户可以将主机按照功能、环境等因素进行分组,便于批量操作。
1.4、Playbook
Playbook 是 Ansible 的核心配置文件,它使用 YAML 格式编写,定义了一系列的任务和执行顺序。通过 Playbook,用户可以描述复杂的自动化流程,例如安装软件、配置服务、部署应用等。Playbook 可以包含多个任务,每个任务调用一个或多个模块来完成特定的操作。
2、安装Ansible (Kylin系统)(Ansible服务器)
2.1、 卸载/tmp目录
umount /tmp
2.2、安装Ansible
yum -y install python3-pip
pip3 install ansible
2.3、在/etc/ansible目录下创建ansible.cfg和hosts文件
mkdir /etc/ansible/ansible.cfg
mksir /etc/ansible/hosts
2.4、编辑ansible.cfg文件
[defaults]
host_key_checking = False
deprecation_warnings = False
interpreter_python = /usr/bin/python3
[inventory]
[privilege_escalation]
[paramiko_connection]
[ssh_connection]
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]
四、Ansible的使用
1、实验服务器清单
服务器web01 10.0.0.9 172.16.1.9 用户:root 密码:lyx123.com
服务器web02 10.0.0.10 172.16.1.10 用户:root 密码:lyx123.com
Ansible控制服务器 10.0.0.61 172.16.1.61 用户:root 密码:lyx123.com
2、Ansible主机清单
2.1、使用用户名和密码形式
2.1.1、编写主机清单
vim /etc/ansible/hosts
10.0.0.9 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass='lyx123.com'
2.1.2、测试
ansible 10.0.0.9 -m ping
2.2、使用别名的形式
2.2.1、编写主机清单
vim /etc/ansible/hosts
web01 ansible_ssh_host=10.0.0.7 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass='lyx123.com'
2.2.2、测试
ansible web01 -m ping
2.3、基于秘钥方式
2.3.1、生成密钥对
ssh-keygen
2.3.2、将生成的公钥发送到服务端
ssh-copy-id root@10.0.0.9
ssh -copy-id root@10.0.0.10
2.3.3、Ansible服务器测试免密钥连接
ssh root@10.0.0.9
ssh root@10.0.0.10
2.3.4、定义主机清单
vim /etc/ansible/hosts
web01 ansible_ssh_host=10.0.0.9
web02 ansible_ssh_host=10.0.0.10
2.3.5、测试
ansible web01 -m ping
ansible web02 -m ping
ansible all -m ping
3、Ansible ad-hoc
3.1、Ansible执行命令模式
ansible 主机名称 -m 指定模块名称 -a 具体执行的命令动作
3.2、YUM模块
3.2.1、模式动作
name: 软件包名称
state: 执行动作
present #安装
absent #卸载
3.2.2、演示案例
案例一:web01服务器安装nginx服务
ansible web01 -m yum -a 'name=nginx state=present'
案例二: web01服务器安装ntpdate服务
ansible web01 -m yum -a 'name=ntpdate state=present'
3.3、COPY模块
3.3.1、模式动作
src: 源文件(ansible服务器上的位置)
dest: 拷贝到目标服务器哪个位置
owner: 文件属主
group: 文件属组
mode: 文件权限
backup: yes 给当前文件做一个以时间命名的备份
3.3.2、演示案例
案例一:将本机root目录下的rsyncd.conf文件拷贝到web01服务器的/etc/下
ansible web01 -m copy -a 'src=/root/rsyncd.conf dest=/etc/rsyncd.conf'
案例二:将content后的字符串直接写到目标文件中
ansible web01 -m copy -a 'content=“rsync_backup:123456” dest=/etc/rsync.passswd mode=0600'
3.4、USER模块
3.4.1、模式动作
uid: 指定UID
group: 指定组
shell: 指定解释器 /bin/bash /sbin/nologin
create_home: false #默认不写此参数就是创建家目录
stste: 状态信息
present #创建用户
absent #删除用户
remove: yes #删除用户并且删除家目录
3.4.2、演示案例
案例一:在web01服务器上创建一个虚拟用户www
ansible web01 -m user -a 'uid=666 group=www shell=/sbin/nologin create_home=false state=present'
3.5、GROUP模块
3.5.1、模式动作
name: 组名
gid: 指定GID
stste: 状态信息
present #创建组
absent #删除组
3.5.2、演示案例
案例一:在web01服务器上创建www组
ansible web01 -m group -a 'name=www gid=666 state=present'
3.6、FILE模块
3.6.1、模式动作
path: 目标主机要修改的文件路径
state: touch(文件) directory(目录) absent (删除文件或者目录)
owner: 属主
group: 属组
mode: 权限
recurse: yes 递归修改属主和属组
3.6.2、演示案例
案例一:在web01服务器/root目录创建普通文件a.txt
ansible web01 -m file -a 'path=/root/a.txt state=touch'
案例二:修改web01服务器/root目录下的a.txt的属主和属组以及权限
ansible web01 -m file -a 'path=/root/a.txt state=a.txt owner=www group=www mode=0600'
案例三:在web01服务器根下创建名为app的目录
ansible web01 -m file -a 'path=/app state=directory'
案例四:递归修改web01服务器/app的属主和属组
ansible web01 -m file -a 'path=/app state=directory owner=www group=www recurse=yes'
案例五:删除web01服务器/root目录下的a.txt文件
ansible web01 -m file -a 'path=/root/a.txt state=absent'
案例六:删除web01服务器/app目录
ansible web01 -m file -a 'path=/app state=absent'
3.7、SYSTEMD模块
3.7.1、模式动作
name: 运行动作名称
state: started (启动) stopped(停止) restarted(重启) reloaded(重新加载)
enabled: yes 加入开机自启动
3.7.2、演示案例
案例一:在web01服务器中启动nginx并加入开机自启动
ansible web01 -m systemd -a 'name=nginx state=started enabled=yes'
3.8、YUM_REPOSITORY模块
3.8.1、模式动作
name: 扩展仓库名
description: 描述信息
baseurl: 扩展仓库安装地址连接
gpgcheck: 是否自检
enabled: 是否开机自启动
3.8.2、演示案例
案例一:在web01服务器上安装扩展仓库
ansible web01 -m yum_repository -a 'name=epel description=EPELYUMrepo baseurl=https://mirrors.aliyun.com/repo/epel-7.repo enabled:yes'
3.9、GET_URL模块
3.9.1、模式动作
url: 下载的url
dest: 要下载到的目标主机路径
3.9.2、演示案例
案例一:下载tomcat软件到web01服务器
ansible web01 -m get_url -a 'url=https://downloads.apache.org/tomcat/tomcat-9/v9.0.98/bin/apache-tomcat-9.0.98.tar.gz.asc dest=/root/'
3.10、MOUNT模块
3.10.1、模式动作
path: 目标主机上的目录
src: 目标挂载机上的目录
fstype: 文件挂载类型
state: mounted(挂载) present(挂载只写入开机自动挂载文件) umounted(卸载但开机自动挂载中还有) absent(直接卸载连同开机自动挂载文件内一并清除)
3.10.2、演示案例
案例一:将web01服务器上的/app挂载到web02服务器的/root下
ansible web01 -m mount -a 'path=/app src=172.16.1.10: /root fstype=nfs state=mounted'
4、Ansible-Playbook
4.1、模式动作
vim /etc/ansible/playbook.yml
- hosts: 指定主机清单中的主机
tasks: 命令
- name: 动作名称
yum: 模块名称
ansible-playbook --syntax-check playbook.yml 检查是否有语法错误
ansible-playbook playbook.yml 执行动作
4.2、演示案例
案例一:在web01服务器中部署rsync服务
vim /etc/ansible/rsync.yml
- hosts web01
tasks:
- name: Install rsync server
yum:
name: rsync
state: present
- name: copy file server
copy:
src: /root/rsyncd.conf
dest: /etc/rsyncd.conf
- name: create group server
group:
name: www
gid: 666
state: present
- name: create user server
user:
uid: 666
group: www
shell: /sbin/nologin
create_home: false
state: present
- name: create directory server
file:
path: /backup
state: directory
owner: www
group: www
- name: copy mima-file server
copy:
content: rsync_backup:123456
dest: /etc/rsync.passwd
mode: 0600
- name: start rsync server
systemd:
name: rsyncd
state: started
enabled: yes
ansible-playbook --syntax-check rsync.yml 检查是否有语法错误
ansible-playbook rsync.yml 执行命令
5、Ansible变量
5.1、变量概述
变量提供了便捷的方式来管理Ansible playbook的每一个项目的动态值,将内容设置为动态值,方便其他的playbook调用,这样会方便维护减少维护成本。
5.2、变量的定义方式
(1)通过命令行进行变量定义
(2)通过play文件进行变量定义
(3)通过Inventory主机信息文件进行变量定义
5.3、变量优先级
(1)通过命令行进行变量定义 #优先级高
(2)通过play文件进行变量定义 #优先级其次
(3)通过Inventory主机信息文件进行变量定义 #优先级最低
5.4、使用vars定义变量
5.4.1、定义单个变量
vim /etc/ansible/vars.yml
- hosts: web01
vars:
software: wget
tasks:
- name: Install server
yum:
name: "{ { software }}"
state: present
ansible-playbook --syntax-check vars.yml
ansible-playbook vars.yml
5.4.2、定义多个变量
vim /etc/ansible/vars.yml
- hosts: web01
vars:
software:
- wget
- lrzsz
tasks:
- name: Install server
yum:
name: "{ { software }}"
state: present
ansible-playbook --syntax-check vars.yml
ansible-playbook vars.yml
5.4.3、定义路径变量
vim /etc/ansible/vars.yml
- hosts: web01
vars:
- name1: 10.0.0.9
- name2: web02
tasks:
- name: create file server
file:
path: /root/{ { name1 }} #变量单独调用必须加双引号,如果变量前后有路径则不需要引号
state: touch
ansible-playbook --syntax-check vars.yml
ansible-playbook vars.yml
5.5、在vars_files中文件中定义变量
5.5.1、平行调用多个变量
1、创建存放变量的文件
vim /root/variable.txt
name1: web01
name2: 10.0.0.10
2、在ansible中创建变量文件
vim /etc/ansible/variable.yml
- hosts: web01
vars_files: /root/variable.txt
tasks:
- name: create file server
file:
path: /root/{ { name1 }}_{ { name2 }}
state: directory
5.5.2、使用列表调用多个变量
1、创建存放变量的文件
vim /root/variable.txt
software1: wget
software2: tree
2、在ansible中创建变量文件
vim /etc/ansible/variable.yml
- hosts: web01
vars_files: /root/variable.txt
tasks:
- name: Install software server
yum:
name:
- "{ { software1 }}"
- "{ { software2 }}"
state: present
ansible-playbook --syntax-check variable.yml
ansible-playbook variable.yml
5.6、使用Ansible的内置变量
5.6.1、查看ansible的内置变量
ansible + 主机清单中的主机名 -m setup 查看
常用变量:
ansible_hostname #仅显示主机名
ansible_default_ipv4.address #仅显示IPV4的信息
ansible_devices #仅显示磁盘设备信息(不可用)
ansible_distribution #显示是什么系统,例如centos,kylin
ansible_distribution_version #仅显示系统版本
ansible_eth0 #仅显示eth0的信息
ansible_kernel #仅显示内核版本
ansible_memtotal_mb #显示系统总内存
ansible_memfree_mb #显示可用系统内存
ansible_memory_mb #详细显示内存情况
ansible_mounts #显示磁盘系统挂载情况
ansible_processor #显示CPU个数(具体显示每个cpu的型号)
ansible_processor_vcpus #显示CPU个数(只显示总个数)
5.6.2、在ansible中创建变量文件
vim /etc/ansible/variable.yml
- hosts: web01
tasks:
- name: create file server
file:
path: /root/{ { ansible_hostname }}_{ { ansible_default_ipv4.address }}
state: directory
ansible-playbook --syntax-check variable.yml
ansible-playbook variable.yml
5.7、变量注册
ansible在执行命令式会有一些返回结果无法显示,可通过变量注册查看
vim /etc/ansible/li.yml
- hosts: web01
tasks:
- name: list root
command: ls -l
register: ls_re
- name: print ls_re
debug:
msg: "{ { ls_re }}"
ansible-playbook --syntax-check li.yml
ansible-playbook li.yml
5.8、when判断
5.8.1、定义主机清单
vim /etc/ansible/hosts
[lnmp]
web01 ansible_ssh_host=10.0.0.9
web02 ansible_ssh_host=10.0.0.10
backup ansible_ssh_host=10.0.0.41
5.8.2、操作一个组,只在web01服务器上安装wget
vim /etc/ansible/w.yml
- hosts: lnmp
tasks:
- name: Install software server
yum:
name: wget
state: present
when: ansible_hostname == "web01"
ansible-playbook --syntax-check w.yml
ansible-playbook w.yml
5.8.3、操作一个组只在ip=10.0.0.10的服务器上安装wget
vim /etc/ansible/w.yml
- hosts: lnmp
tasks:
- name: Install software server
yum:
name: wget
state: present
when: ansible_default_ipv4.address == "10.0.0.10"
ansible-playbook --syntax-check w.yml
ansible-playbook w.yml
5.8.4、操作一个组只在ip=10.0.0.9和web02服务器上安装wget
vim /etc/anisble/w.yml
- hosts: lnmp
tasks:
- name: Install software server
yum:
name: wget
state: present
when:
- ansible_hostname == "web02"
- ansible_default_ipv4.address == "10.0.0.9"
ansible-playbook --syntax-check w.yml
ansible-playbook w.yml
5.8.5、操作一个组只在ip=10.0.0.9或者web02服务器上安装wget
vim /etc/ansible/w.yml
- hosts: lnmp
tasks:
- name: Install software server
yum:
name: wget
state: present
when: (ansible_hostname == "web02") or (ansible_default_ipv4.address == "10.0.0.9")
ansible-playbook --syntax-check w.yml
ansible-playbook w.yml
5.8.6、操作一个组只在web01和web02服务器上安装wget
vim /etc/ansible/w.yml
- hosts: lnmp
tasks:
- name: Install software server
yum:
name: wget
state: present
when: ansible_hostname in [ 'web01', 'web02' ]
ansible-playbook --syntax-check w.yml
ansible-playbook w.yml
5.9、Handlers
5.9.1、定义主机清单
vim /etc/ansible/hosts
web01 ansible_ssh_host=10.0.0.9
web02 ansible_ssh_host=10.0.0.10
backup ansible_ssh_host=10.0.0.41
5.9.2、在ansible中编辑变量文件
vim /etc/ansible/nginx.yml
- hosts: web01
tasks:
- name: Install nginx.repo server
yum_repository
name: nginx
description: Nginx YUM repo
baseurl: http://nginx.org/packages/centos/7/$basearch/
gpgcheck: no
enabled: yes
- name: Install nginx server
yum:
name: nginx
state: present
- name: configure nginx server
copy:
src: /root/nginx.conf
dest: /etc/nginx/nginx.conf
notify: restart nginx server
- name: check nginx.conf
command: nginx -t
ignore_errors: yes
register: ng_re
- name: print ng_re
debug:
msg: "{ { ng_re }}"
- name: create group
group:
name: www
gid: 666
state: present
- name: create user
user:
uid: 666
group: www
create_home: false
shell: /sbin/nologin
state: present
- name: start nginx server
systemd:
name: nginx
state: started
enable: yes
handlers:
- name: restart nginx server
systemd:
name: nginx
state: restarted
when: ng_re.stderr_lines is search "ok"
5.10、字典循环
5.10.1、启动多个服务
vim /etc/ansible/cycle.yml
- hosts: lnmp
tasks:
- name: Install software server
yum:
name: "{ { item }}"
state: present
when: ansible_default_ipv4.address == "web02"
loop:
- lrzsz
- wget
ansible-playbook --syntax-check cycle.yml
ansible-playbook cycle.yml
5.10.2、创建多个文件
vim /etc/ansible/cycle.yml
- hosts: lnmp
tasks:
- name: create file server
file:
path: "{ { item }}"
state: touch
loop:
- a.txt
- b.txt
ansible-playbook --syntax-check cycle.yml
ansible-playbook cycle.yml
5.10.3、创建文件的属主和属组不同
vim /etc/ansible/cycle.yml
- hosts: lnmp
tasks:
- name: create file server
file:
path: "{ { item.name }}"
state: touch
owner: "{ { item.owner }}"
group: "{ { item.group }}"
mode: "{ { item.mode }}"
when: ansible_hostname == "web01"
loop:
- { name: /root/c.txt,owner: www,group: www,mode: '0600' }
- { name: /root/b.txt,owner: www,group: www,mode: '0644' }
ansible-playbook --syntax-check cycle.yml
ansible-playbook cycle.yml
5.10.4、拷贝多个文件
vim /etc/ansible/cycle.yml
- hosts: lnmp
tasks:
- name: copy file server
copy:
src: "{ { item.src }}"
dest: "{ { item.dest }}"
owner: "{ { item.owner }}"
group: "{ { item.group }}"
mode: "{ { item.mode }}"
loop:
- { src: /root/a.txt,dest: /etc/root/,owner: www,group: www,mode: '0600' }
- { src: /root/b.txt,dest: /etc/root/,owner: www,group: www,mode: '0644' }
ansible-playbook --syntax-check cycle.yml
ansible-playbook cycle.yml
5.11、标签
vim /etc/ansible/tags.yml
- hosts: lnmp
tasks:
- name: Install software server
yum:
name: rsync
state: present
tags: lv
ansible-playbook --list-tags tags.yml #查看标签
ansible-playbook tags.yml -t lv #执行标签
5.12、使用include将多个tasks组合
1、准备两个文件/etc/ansible/rsync.yml和/etc/ansible/nginx.yml
vim /etc/ansible/rsync.yml
- name: Install rsync server
yum:
name: rsync
state: present
vim /etc/ansible/nginx.yml
- name: Install nginx server
yum:
name: nginx
state: present
2、在/etc/ansible/下创建include.yml文件
vim /etc/ansible/include.yml
- hosts: lnmp
tasks:
- include_tasks: rsync.yml
- include_tasks: nginx.yml
ansible-playbook --syntax-check include.yml
ansible-playbook include.yml
5.13、jinja模板
5.13.1、使用for循环生成lb配置文件
1、使用for循环生成lb配置文件
vim /etc/ansible/lb.j2
upstream { { server_name }} {
{% for n in rage(7,9) %}
server 172.16.1.{ { n }}:{ { lb_port }};
{% endfor %}
}
server {
listen 80;
server_name { { server_name }};
location / {
root /app;
index index.html;
proxy_pass http://{ { server_name }};
proxy_set_header HOST $http_host;
}
}
2、调用配置文件
vim /etc/ansible/lb.yml
- hosts: lnmp
vars:
- server_name: www.wp.com
- lb_port: 80
tasks:
- name: Copy motd
template:
src: /etc/ansible/lb.j2
dest: /etc/nginx/conf.d/lb.conf
when: ansible_hostname == "web01"
5.13.2、使用jinja模板配置rsync服务
1、在/etc/ansible/中创建文件rsync.j2
vim /etc/ansible/rsync.j2
uid = { { user }}
gid = { { user }}
port = { { rsync_port }}
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[backup]
path = { { rsync_dir }}
2、在/etc/ansible/下创建调用文件rsync.yml
- hosts: backup
vars:
- user: www
- rsync_port: 873
- rsync_dir: /backup
tasks:
- name: Install rsync Server
yum:
name: rsync
state: present
- name: Configure rsync Server
template:
src: "{ { item.src }}"
dest: "{ { item.dest }}"
owner: "{ { item.owner }}"
group: "{ { item.group }}"
mode: "{ { item.mode }}"
loop:
- { src: /etc/ansible/rsync.j2,dest: /etc/rsyncd.conf,owner: root,group: root,mode: '0644' }
- { src: /etc/ansible/rsync.passwd,dest: /etc/rsync.passwd,owner: www,group: www,mode: '0600' }
notify: Restart rsync Server
- name: Create group "{ { user }}"
group:
name: "{ { user }}"
gid: 666
- name: Create user "{ { user }}"
user:
name: "{ { user }}"
uid: 666
create_home: fales
shell: /sbin/nologin
- name: Create "{ { rsync_dir }}" Server
file:
path: "{ { rsync_dir }}"
owner: "{ { user }}"
group: "{ { user }}"
state: directory
- name: Start rsync Server
systemd:
name: rsyncd
state: started
enabled: yes
handlers:
- name: Restart rsync Server
systemd:
name: rsyncd
state: restarted
3、ansible-playbook --syntax-check rsync.yml
4、ansible-playbook rsync.yml
5.14、roles角色
1、在/etc/ansible/中创建roles目录
mkdir /etc/ansible/roles
2、根据对应项目在roles目录下创建roles角色对应目录
ansible-galaxy init rsync
3、tree rsync
├── defaults #低优先级变量
│ └── main.yml
├── files #使用copy模块会将文件放在这个目录中
├── handlers #触发器文件
│ └── main.yml
├── meta #依赖关系文件
│ └── main.yml
├── README.md
├── tasks #工作任务文件
│ └── main.yml
├── templates #jinja模板文件
├── tests #测试文件
│ ├── inventory
│ └── test.yml
└── vars #变量文件
└── main.yml
4、cd /etc/ansible/roles
5、vim tasks/main.yml
- name: Install rsync Server
yum:
name: rsync
state: present
- name: Configure rsync Server
template:
src: "{ { item.src }}"
dest: "{ { item.dest }}"
owner: "{ { item.owner }}"
group: "{ { item.group }}"
mode: "{ { item.mode }}"
loop:
- { src: /etc/ansible/jinja/rsync.j2,dest: /etc/rsyncd.conf,owner;root,group: www,mode: '0644' }
- { src: /etc/ansible/jinja/rsync.passwd,dest: /etc/rsync.passwd,owner: www,group: www,mode: '0600' }
notify: Restart rsync Server
- name: Create group "{ { user }}"
group:
name: "{ { user }}"
gid: 666
- name: Create user "{ { user }}"
user:
name: "{ { user }}"
uid: 666
group: "{ { user }}"
create_home: false
shell: /sbin/nologin
- name: Create "{ { rsync_dir }}" Server
file:
path: "{ { rsync_dir }}"
state: directory
owner: "{ { user }}"
group: "{ { user }}"
- name: Start rsync Server
systemd:
name: rsyncd
state: started
enabled: yes
6、vim handlers/main.yml
- name: Restart rsync Server
systemd:
name: rsyncd
state: restarted
7、vim vars/main.yml
user: www
rsync_dir: /data
rsync_port: 873
8、vim templates/rsync.j2
uid = { { user }}
gid = { { user }}
port = { { rsync_port }}
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[backup]
path = { { rsync_dir }}
9、vim templates/rsync.passwd
rsync_backup:123456
10、cd /etc/ansible/roles
vim rsync.yml
- hosts: all
roles:
- role: rsync
when: ansible_hostname == "backup"