一、基本原理介绍
1.1 组成
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
三、模块介绍
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 >>
2)creates 如果文件存在了,不执行命令操作
[root@m01 ~]# ansible 172.16.1.41 -m command -a ‘creates=/tmp/test.file chdir=/tmp touch test2.file’
3)removes 如果文件存在了,这个步骤将执行
[root@m01 ~]# ansible 172.16.1.41 -m command -a ‘removes=/tmp/test.file chdir=/tmp touch test2.file’
注意事项:
有些特殊符号无法识别,<,>,|,;,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’
[root@m01 ~]# ansible 172.16.1.31 -m copy -a 'src=/etc/hosts dest=/tmp/'
172.16.1.31 | CHANGED => { ---对哪一台主机进行操作
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true, ---是否对主机信息进行改变
"checksum": "bc79e48e9791c9ab1e2e9aeb9b1e4aa53269a7fe", ---生成一个文件校验码==MD5数值
"dest": "/tmp/hosts", ---显示目标路径
"gid": 0, ---复制后文件gid信息
"group": "root", ---复制后文件属组信息
"md5sum": "107a3cba208ed15b81f0035d2fe36f55", ---生成一个文件校验码==MD5数值
"mode": "0644", ---文件权限
"owner": "root", ---文件属主信息
"size": 351, ---文件大小
"src": "/root/.ansible/tmp/ansible-tmp-1603872199.24-104901-212112972875388/source",
"state": "file", ---原文件类型
"uid": 0 ---显示复制后文件uid信息
}
补充说明: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’
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 编写剧本的基本要求
剧本编写规范:三点要求
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服务剧本编写
- hosts: 172.16.1.41
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf file
copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
- name: 03-create user
user: name=rsync create_home=no shell=/sbin/nologin
- name: 04-create backup dir
file: name=/backup state=directory owner=rsync group=rsync
- name: 05-create password file
copy: content=rsync_backup:abc123.. dest=/etc/rsync.password mode=600
- name: 06-start rsync server
service: name=rsyncd state=started enabled=yes
- hosts: 172.16.1.31
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-create password file
copy: content=abc123.. dest=/etc/rsync.password mode=600
- name: 03-check test data backup
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 }}
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”
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}
4.7 错误忽略
ignore_errors4.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