《Ansible:自动化运维的“魔法棒”,让繁琐任务一键搞定!》

一、概况

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"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值