一、基本原理介绍

1.1 组成

image.png
1、主机清单
2、模块
3、基于密钥连接主机
4、主机需要关闭selinux
5、软件剧本功能
特点
1、管理端不需要启动服务程序
2、管理端不需要编写配置文件
3、受控端不需要安装软件程序
被管理端selinux服务没有关闭—-影响ansible软件的管理
libselinux-python让selinux开启的状态也可以使用ansible程序
4、受控端不需要启动服务程序(代理agent)
5、服务程序管理操作模块众多
6、利用剧本编写来实现自动化

二、部署

2.1 部署

yum install -y ansible —-依赖epel源
/etc/ansible/ansible.cfg —-服务配置文件
/etc/ansible/hosts —-被管理主机清单文件
/etc/ansible/roles —-角色

2.2 主机清单配置

1、第一种方式
直接将IP地址依次写入配置文件/etc/ansible/hosts文件
172.16.1.31
172.16.1.41
2、第二种方式,主机名符号匹配配置
[web]
172.16.1.[7:9]
[web]
web[01:03]
3、第三种方式,支持跟上非标准端口
[web]
web01:2222
4、主机使用特殊的变量
[web]
172.16.1.7 ansible_ssh_port=2222 ansible_ssh_user=root ansible_ssh_pass=abc123..
[web]
web01 ansible_ssh_host ansible_ssh_port=2222 ansible_ssh_user=root ansible_ssh_pass=abc123..
5、第五种方式:嵌入式配置
合并多个组
[rsync:children]
rsync_server
rsrnc_client
[rsync_server]
172.16.1.41
[rsync_client]
172.16.1.31
嵌入变量信息
[web:vars]
ansible_ssh_host=172.16.1.7
ansible_ssh_port=2222
ansible_ssh_user=root
ansible_ssh_pass=abc123..
[web]
web01

三、模块介绍

image.png
ansible官方网站:https://docs.ansible.com
语法格式介绍:
ansible 主机名称/主机组名称/主机IP地址/all -m(指定模块) 模块名称 -a(指定动作信息) “执行什么动作”
模块帮助手册:
ansible-doc -l —-列出模块使用简介
ansible-doc -s fetch —-指定一个模块简要说明
ansible-doc fetch —-查询详细说明

3.1 command模块

command - Executes a command on a remote node
在一个远程主机上执行一个命令
简单用法:
[root@m01 ~]# ansible 172.16.1.41 -m command -a ‘hostname’
172.16.1.41 | CHANGED | rc=0 >>
backup
扩展用法:
1)chdir在执行命令之前对目录进行切换
默认不指定目录的情况下,创建文件会在家目录当中
[root@m01 ~]# ansible 172.16.1.41 -m command -a ‘chdir=/tmp touch test.file’
172.16.1.41 | CHANGED | rc=0 >>
image.png
2)creates 如果文件存在了,不执行命令操作
[root@m01 ~]# ansible 172.16.1.41 -m command -a ‘creates=/tmp/test.file chdir=/tmp touch test2.file’
image.png
3)removes 如果文件存在了,这个步骤将执行
[root@m01 ~]# ansible 172.16.1.41 -m command -a ‘removes=/tmp/test.file chdir=/tmp touch test2.file’
image.png
image.png
注意事项:
有些特殊符号无法识别,<,>,|,;,and,&

3.2 shell模块(万能模块)

该模块使用方法与command基本一致
如果用该shell模块来执行脚本,还是没有scripts模块方便,因为还需要将写好的脚本推送到被管理主机,添加权限然后运行。

3.3 scripts模块

该模块专门用来执行脚本,无需将脚本推送到目的主机上即可执行

3.4 copy模块

将文件进行批量分发
用法:ansible 172.16.1.31 -m copy -a ‘src=/etc/hosts dest=/etc/hosts_back’

  1. [root@m01 ~]# ansible 172.16.1.31 -m copy -a 'src=/etc/hosts dest=/tmp/'
  2. 172.16.1.31 | CHANGED => { ---对哪一台主机进行操作
  3. "ansible_facts": {
  4. "discovered_interpreter_python": "/usr/bin/python"
  5. },
  6. "changed": true, ---是否对主机信息进行改变
  7. "checksum": "bc79e48e9791c9ab1e2e9aeb9b1e4aa53269a7fe", ---生成一个文件校验码==MD5数值
  8. "dest": "/tmp/hosts", ---显示目标路径
  9. "gid": 0, ---复制后文件gid信息
  10. "group": "root", ---复制后文件属组信息
  11. "md5sum": "107a3cba208ed15b81f0035d2fe36f55", ---生成一个文件校验码==MD5数值
  12. "mode": "0644", ---文件权限
  13. "owner": "root", ---文件属主信息
  14. "size": 351, ---文件大小
  15. "src": "/root/.ansible/tmp/ansible-tmp-1603872199.24-104901-212112972875388/source",
  16. "state": "file", ---原文件类型
  17. "uid": 0 ---显示复制后文件uid信息
  18. }

补充说明:ansible软件输出颜色说明
01.绿色信息:查看主机信息/对主机未做改动
02.黄色信息:对主机数据信息做了修改
03.红色信息:命令执行出错了
04.粉色信息:忠告信息
05.蓝色信息:显示ansib1e命令执行的过程???
扩展用法:
1、在传输文件时修改文件的数主和属组信息
[root@m01 ~]# ansible 172.16.1.31 -m copy -a ‘src=/root/host_ip.txt dest=/tmp owner=xiang group=xiang’
image.png
image.png
2、在传输文件时修改文件的权限信息
[root@m01 ~]# ansible 172.16.1.31 -m copy -a ‘src=/root/host_ip.txt dest=/tmp owner=xiang group=xiang mode=777’
3、在传输文件时对远程主机源文件进行备份
[root@m01 ~]# ansible 172.16.1.31 -m copy -a ‘src=/root/host_ip.txt dest=/tmp owner=xiang group=xiang mode=777 backup=yes’
4、创建一个文件并直接编辑文件的信息content
[root@m01 ~]# ansible 172.16.1.31 -m copy -a ‘content=”abc123..” dest=/tmp/password.txt’
5、src参数指定的文件信息,是从本地查找还是从远端服务器上进行查找,默认为no,即从本地查找复制到远端
[root@m01 ~]# ansible 172.16.1.31 -m copy -a ‘src=/etc/hosts_ip.txt dest=/tmp/hosts_ip.txt remote_src=yes’
复制目录时需要注意的问题:
src后面目录没有/:将目录本身以及目录下面的内容都进行远程传输复制
src后面目录有/:只将目录下面的内容进行远程传输复制,不复制目录本身

3.5 file模块

设置文件属性信息
基本用法:
ansible 172.16.1.31 -m file -a ‘dest=/etc/hosts owner=xiang group=xiang mode=666’
扩展用法:
1、可以利用模块创建数据信息
state 参数
=absent —-删除文件信息
=directory—-创建一个目录信息
=file —-检查创建的数据信息是否存在,绿色存在,红色不存在
=hard —-创建一个硬链接文件
=link —-创建一个软链接文件
=touch —-创建一个文件信息
创建目录信息
ansible 172.16.1.31 -m file -a ‘dest=/tmp/xiang/ state=directory’
ansible 172.16.1.31 -m file -a ‘dest=/tmp/xiang/dir1/dir2/ state=directory’ 创建多级目录
创建文件信息
ansible 172.16.1.31 -m file -a ‘dest=/tmp/xiang/test.txt state=touch’
创建链接文件
ansible 172.16.1.31 -m file -a ‘src=/tmp/xiang/test.txt dest=/tmp/xiang/test_hard.txt state=hard’
ansible 172.16.1.31 -m file -a ‘src=/tmp/xiang/test.txt dest=/tmp/xiang/test_link.txt state=link’
2、可以利用模块删除数据信息
ansible 172.16.1.31 -m file -a ‘dest=/tmp/xiang/test.txt state=absent’
3、recurse递归修改文件属性
ansible 172.16.1.31 -m file -a ‘name=/tmp/dir1/ owner=xiang group=xiang mode=777 recurse=yes’

3.6 fetch模块

将远端被管理主机上的文件拉取到本地
ansible 172.16.1.31 -m fetch -a ‘src=/tmp/xiang/test.txt dest=/tmp/‘

3.7 yum模块

name —-指定安装的软件名称
state —-指定是否安装软件
installed —-安装软件
present
latest
absent —-卸载软件
removed
ansible 172.16.1.3 -m yum -a ‘name=iotop state=installed’

3.8 service模块

管理服务器的运行状态,停止,开启,重启
name —-指定管理的服务名称
state —-指定服务状态
started 启动
restarted 重启
stopped 停止
enabled —-指定服务是否开启自启动 enabled=yes/no
ansible 172.16.1.31 -m service -a ‘name=nfs state=started enabled=yes’

3.9 corn模块

批量设置多个主机的定时任务信息
动作
分 时 日 月 周
minute: # Minute when the job should run ( 0-59,
, /2, etc )
设置分钟
hour: # Hour when the job should run ( 0-23,
, /2, etc )
设置小时
day: # Day of the month the job should run ( 1-31,
, /2, etc )
设置天
month: # Month of the year the job should run ( 1-12,
, /2, etc )
设置月份
weekday: # Day of the week that the job should run ( 0-6 for Sunday-Saturday,
, etc )
设置周
job 用于定时任务需要干的事情
基本用法:
ansible 172.16.1.31 -m cron -a “minutes=0 hour=2 job=’/usr/sbin/ntpdates ntp1.aliyun.com >/dev/null &>/dev/null’”
扩展用法:
1、给定时任务设置注释信息
ansible 172.16.1.31 -m cron -a “name=’time sync ‘ minutes=0 hour=2 job=’/usr/sbin/ntpdates ntp1.aliyun.com >/dev/null &>/dev/null’”
2、删除指定的定时任务
ansible 172.16.1.31 -m cron -a “name=’time sync ‘ state=absent”
PS:ansible可以删除的定时任务,只能时ansible设置好的定时任务
3、如何批量注释定时任务
ansible 172.16.1.31 -m cron -a “name=’time sync’ job=’/usr/sbin/ntpdates ntp1.aliyun.com >/dev/null &>/dev/null’ disabled=yes”

3.10 mount模块

批量进行挂载操作
src:需要挂载的存储设备或文件信息
path:指定目标挂载点目录
fstype:指定挂载时的文件系统类型
state
present/mounted —-进行挂载
present:不会立即挂载,但是会将挂载信息写入fstab文件,实现开机自动挂载
mounted:会立即挂载,同时也会将挂载信息写入fstab文件
absent/unmounted —-进行卸载
absent: —-会实现立即挂载,并且会删除fstab文件信息,禁止开启自动挂载
unmounted:会实现立即卸载,但是不会删除fstab文件信息

3.11 user模块

实现批量创建用户
ansible 172.16.1.31 -m user -a ‘name=user1’
扩展用法
1、指定用户uid信息
ansible 172.16.1.31 -m user -a ‘name=user1 uid=1111’
2、指定用户组信息
ansible 172.16.1.31 -m user -a ‘name=user1 group=user1’ 主组
ansible 172.16.1.31 -m user -a ‘name=user1 groups=user2’ 指定额外组
3、批量创建虚拟用户
ansible 172.16.1.31 -m user -a “name=rsync create_home=no shell=/sbin/nologin”
4、给指定用户创建密码
注:利用ansible程序user模块设置用户密码信息,需要将密码明文信息转换为密文信息进行设置
生成密文密码信息方法
方法一、
ansible all -i localhost,-m debug -a “msg={{‘abc123..’ | password_hash(‘sha512’, ‘123456’)}}”
ansible 172.16.1.31 -m user -a ‘name=user1  password=将上面生成的密文复制到这里’

四、剧本Ansible-Playbook

4.1 编写剧本的基本要求

image.png
剧本编写规范:三点要求
1.合理的信息缩进两个空格表示一个缩进关系
标题一
标题二
标题三
Ps:在ansible中一定不能用tab进行缩进
2.冒号的使用方法
hosts: 172.16.1.41
tasks:
yum: name=xx
Ps:使用冒号时后面要有空格信息
以冒号结尾,冒号信息出现在注释说明中,后面不需要加上空格
3.短横线应用-(列表功能)
-张三

-打游戏
-运动
-李四

学习
湖南
注意:使用短横线构成列表信息,短横线后面需要有空格
mkdir /etc/ ansible/ ansible-playbook
vim rsync server.yaml
说明:剧本文件扩展名尽量写为yaml
1.方便识别文件是一个剧本文件
2.文件编写时会有颜色提示
hosts: 172.16.1.41
tasks:
yum: name=rsync state=installed
copy: src=/ tmp / rsyncd. conf dest=/ etc/
如何执行剧本:
第一个步骤:检查剧本的语法格式
ansible-playbook —syntax-check rsync_server.yaml
第二个步骤:模拟执行
ansible-playbook -C rsync_server.yaml
第三个步骤:直接执行剧本
ansible-playbook rsync_server.yaml
- hosts: 172.16.1.41
tasks:
- name: install iotop
yum: name=iotop state=installed
- name: copy file to etc
copy: src=/etc/fstab /tmp/backup/
剧本编写常见错误:
01.剧本语法规范是否符合(空格冒号短横线)
02.剧本中模块使用是否正确
03.剧本中一个name标识下面只能写一个模块任务信息
04.剧本中尽量不要大量使用shell模块

4.2 Rsync服务剧本编写

  1. - hosts: 172.16.1.41
  2. tasks:
  3. - name: 01-install rsync
  4. yum: name=rsync state=installed
  5. - name: 02-push conf file
  6. copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
  7. - name: 03-create user
  8. user: name=rsync create_home=no shell=/sbin/nologin
  9. - name: 04-create backup dir
  10. file: name=/backup state=directory owner=rsync group=rsync
  11. - name: 05-create password file
  12. copy: content=rsync_backup:abc123.. dest=/etc/rsync.password mode=600
  13. - name: 06-start rsync server
  14. service: name=rsyncd state=started enabled=yes
  15. - hosts: 172.16.1.31
  16. tasks:
  17. - name: 01-install rsync
  18. yum: name=rsync state=installed
  19. - name: 02-create password file
  20. copy: content=abc123.. dest=/etc/rsync.password mode=600
  21. - name: 03-check test data backup
  22. shell: rsync -avz /etc/fstab rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

4.3 剧本设置变量

在剧本中设置变量信息
方式一:直接在剧本文件编写vars:
oldboyo1 : data01oldboy02 : data02
方式二:在命令行中进行指定
ansible-playbook —extra-vars=oldboyo1=datao1
方式三:在主机清单文件编写
[oldboy]
oldboy01=data01
oldboy02=data02
优先级:命令行>剧本中变量>主机清单变量设置

4.4 剧本中设置注册信息

执行剧本时,可以显示输出命令结果信息
-hosts:web
tasks:
- name: check the server-status
shell: ss -tunlp| grep rsync
register: get_rsync_port
- name: show the port info
debug: mgs={{ get_rsync_port.stdout_lines }}
image.png

4.5 when判断

  • hosts: rsync_client
    tasks:
    - name: copy file_nfs01
    copy: src=/etc/fstab dest=/tmp/fstab_nfs01
    when: ansible_hostname == “nfs01”
    - name: copy file_web01
    copy: src=/etc/fstab dest=/tmp/passwd_web01
    when: ansible_hostname == “web01”
    image.png

    4.6 with_items循环

  • hosts: 172.16.1.41
    tasks:
    - name: copy file
    copy: src=/etc/{{item.name}} dest=/tmp/{{item.dir}}/ mode={{item.mode}}
    with_items:
    - {name: ‘fstab’, dir: ‘dir1’, mode: 666}
    - {name: ‘passwd’, dir: ‘dir2’, mode: 777}
    image.png
    image.png

    4.7 错误忽略

    ignore_errors

    4.8 标签tags

4.9 触发notify/handlers

4.10 nfs服务剧本编写

- hosts: nfs
  tasks:
    - name: 01-install nfs software
      yum:
        name: ['nfs-utils','rpcbind']
        state: installed
- hosts: nfs_server
  vars:
    Data_dir: /data
  tasks:
    - name: 01-copy conf file
      copy: src=/etc/ansible/ansible-playbook/nfs-file/nfs-server/exports dest=/etc
      notify: restart nfs server
    - name: 02-create data dir
      file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody
    - name: 03-boot server
      #service: name=rpcbind state=started enabled=yes
      #service: name=nfs state=started enabled=yes
      service: name={{ item }} state=started enabled=yes
      with_items:
        - rpcbind
        - nfs
  handlers: 
    - name: restart nfs server
      service: name=nfs state=restarted
- hosts: nfs_client
  vars:
    Data_dir: /data
  tasks:
    - name: 01-mount
      mount: src=172.16.1.31:{{ Data_dir }} path=/mnt fstype=nfs state=mounted
    - name: check mount info
      shell: df -h | grep data
      register: mount_info
    - name: show the mount info
      debug: msg={{ mount_info.stdout_lines }}

4.11 多剧本整合

  • import_playbook: rsync_server.yaml
    - import_playbook: nfs_server.yaml

    五、角色

    剧本编写问题:
    1、目录结构不够规范
    2、编写好的任务如何重复调用
    3、服务端配置文件改动,客户端参数信息也自动变化
    4、汇总剧本中没有显示主机角色信息
    5、一个剧本内容信息过多,不容进行阅读,如何进行拆分
    第一步、规范目录结构
    cd /etc/ansible/roles
    mkdir {rsync,nfs} —-创建相应角色目录
    mkdir {rsync,nfs}/{vars,tasks,templates,handlers,files} —-创建角色目录下面的子目录
    [root@m01 roles]# tree
    .
    ├── nfs
    │ ├── files —-保存需要分发文件目录
    │ ├── handlers —-保存触发器配置文件信息
    │ ├── tasks —-保存要执行的动作信息文件
    │ ├── templates —-保存需要分发的模板文件
    │ └── vars —-保存变量
    └── rsync
    ├── files
    ├── handlers
    ├── tasks
    ├── templates
    └── vars
    第二步、在roles目录中创建相关文件
    编写文件流程图:
    1)编写tasks目录中的main.yaml文件
    - name: 01-copy conf file
    copy: src=/etc/ansible/ansible-playbook/nfs-file/nfs-server/exports dest=/etc
    notify: restart nfs server
    - name: 02-create data dir
    file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody
    - name: 03-boot server
    #service: name=rpcbind state=started enabled=yes
    #service: name=nfs state=started enabled=yes
    service: name={{ item }} state=started enabled=yes
    with_items:
    - rpcbind
    - nfs
    2)编写vars目录中的main.yaml文件
    vim main.yaml
    Data_dir: /data
    3) 编写files目录中的文件
    [root@m01 files]# ll
    total 4
    -rw-r—r— 1 root root 29 Nov 4 11:20 exports
    4)编写handlers目录中的main.yaml文件
    - name: restart nfs server
    service: name=nfs state=restarted
    目录中文件编写好汇总结构
    [root@m01 nfs]# tree
    .
    ├── files
    │ └── exports
    ├── handlers
    │ └── main.yaml
    ├── tasks
    │ └── main.yaml
    ├── templates
    └── vars
    └── main.yaml
    第三步、编写主剧本文件
    [root@m01 roles]# cat site.yaml
    - hosts: nfs_server
    roles:
    - nfs-server
    - hosts: nfs_client
    roles:
    - nfs-client
    - hosts: rsync_server
    roles:
    - rsync-server
    - hosts: rsync_client
    roles:
    - rsync-client
    [root@m01 roles]# tree
    .
    ├── nfs-client
    │   ├── files
    │   ├── handlers
    │   ├── tasks
    │   │   └── main.yaml
    │   ├── templates
    │   └── vars
    │       └── main.yaml
    ├── nfs-server
    │   ├── files
    │   │   └── exports
    │   ├── handlers
    │   │   └── main.yaml
    │   ├── tasks
    │   │   └── main.yaml
    │   ├── templates
    │   └── vars
    │       └── main.yaml
    ├── rsync-client
    │   ├── files
    │   ├── handlers
    │   ├── tasks
    │   │   └── main.yaml
    │   ├── templates
    │   └── vars
    ├── rsync-server
    │   ├── files
    │   ├── handlers
    │   ├── tasks
    │   │   └── main.yaml
    │   ├── templates
    │   │   └── rsyncd.conf.j2
    │   └── vars
    │       └── main.yaml
    └── site.yaml
    
    附件
    roles.tar.gz