前言:
1、ansible输出结果颜色含义:
绿色: 命令执行成功 没有对远程主机做任何修改
黄色: 命令执行成功 大部分情况表示对远程主机做了改动
红色: 命令执行失败
粉色: 建议进行操作的方法
蓝色: 显示命令或剧本执行的过程
2、ansible帮助文档如何查看:
ansible-doc -l --- 查看所有ansible模块信息
ansible-doc -s 模块 --- 查看指定模块详细说明
ansible-doc 模块 --- 查看指定模块更加详细说明
一、ansible简介:
1、ansible 是基于sshd服务实现的
2、功能简介:
批量管理服务
批量部署服务
批量分发数据
批量采集数据信息
3、ansible软件并行批量管理
二、软件特点
优点
1、管理端不需要启动服务程序
2、管理端不需要编写配置文件
3、功能强大
缺点:
模块太多了
三、ansible程序功能组成
1、主机清单
2、模块功能
3、剧本编写
四、ansible使用前准备
1、基于ssh秘钥方式,将主机秘钥分发至个被管理主机,确保管理主机能直接登录(不用输入密码)
2、确认epel源更新完毕
3、安装ansible (yum install ansible -y)
==============================================================
五、ansible 主机清单配置5种方式的(/etc/ansible/hosts)
1、简单配置
172.16.1.7
172.16.1.31
172.16.1.41
2、分组配置
[web]
172.16.1.31
172.16.1.41
[nfs]
172.16.1.7
172.16.1.6
3、符号匹配主机信息
172.16.1.1 172.16.1.2 .. 172.16.1.200
[data]
172.16.1.[30:45]
4、配置特殊变量信息
特殊变量参照官方文档:https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
[web]
172.16.1.7 ansible_user=root ansible_password=123456 ansible_port=22
[web]
web01 ansible_host=172.16.1.7 ansible_user=root ansible_password=123456 ansible_port=22
5、嵌入式胚子
5.1嵌入子组
[rsync:children]
rsync_server
rsync_client[rsync_server]
172.16.1.41
[rsync_client]
172.16.1.7
172.16.1.31
5.2嵌入变量(剧本)
第二种嵌入式:嵌入变量 (剧本)
[rsync_client]
172.16.1.7
172.16.1.31
[rsync_client:vars]
ansible_user=root
ansible_password=123456
六、管理多台主机语法格式:
ansible 主机信息(可以是组) -m 模块名称 -a "完成动作"
举例:
[root@web01 ~]# ansible server -m command -a "hostname"
172.16.1.41 | CHANGED | rc=0 >>
backup-41
172.16.1.31 | CHANGED | rc=0 >>
nfs01-31
[root@web01 ~]#
七、常用模块介绍
在ansible中 使用ansible-doc <模块名称> 来查看单独模块用法
1、command模块--可批量管理主机执行命令(默认模块)
常用参数
官方模块说明:https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module
参数:chdir--在执行命令操作前进行切换目录
[root@web01 ~]# ansible server -m command -a "chdir=/tmp pwd"
参数:creates--判断一个文件是否存在,如果存在后面的命令就不会执行
[root@web01 ~]# ansible server -m command -a "creates=/tmp/hosts touch /tmp/hosts "
参数:removes--判断一个文件是否存在,如果不存在,后续的命令不会被执行
[root@web01 ~]# ansible server -m command -a "removes=/tmp/test touch /tmp/test"
2、shell模块--可以批量管理主机执行命令(万能模块)
官方模块说明:https://docs.ansible.com/ansible/latest/modules/shell_module.html#shell-module
参数chdir:在执行命令前进行目录切换
[root@web01 ~]# ansible server -m shell -a "chdir=/tmp ls"
172.16.1.41 | CHANGED | rc=0 >>
ansible_command_payload_yJt3M6
hosts
ls
172.16.1.31 | CHANGED | rc=0 >>
ansible_command_payload_G06CEK
hosts
ls
参数:creates----判断一个文件是否存在,如果存在,后续命令不会执行
[root@web01 ~]# ansible server -m shell -a "creates=/tmp/test touch /tmp/test"
[WARNING]: Consider using the file module with state=touch rather than running 'touch'. If you need to use command because file is
insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this
message.
172.16.1.31 | CHANGED | rc=0 >>
172.16.1.41 | CHANGED | rc=0 >>
参数:removes--判断一个文件是否存在,如果不存在则候命的命令不会执行
[root@web01 ~]# ansible server -m shell -a "removes=/tmp/test chdir=/tmp ls"
172.16.1.41 | CHANGED | rc=0 >>
ansible_command_payload_RhVulC
hosts
ls
test
172.16.1.31 | CHANGED | rc=0 >>
ansible_command_payload_WVfVC2
hosts
ls
test
3、script模块--批量执行脚本信息
官网模块说明:https://docs.ansible.com/ansible/latest/modules/script_module.html#script-module
使用这个模块需要注意的
1、保证本地(需要执行脚本的设备端)有脚本文件
2、脚本有执行权限
[root@web01 ~]# ansible server -m script -a "/web_data/install.sh"
4、yum模块--批量部署软件程序
官方模块说明:https://docs.ansible.com/ansible/latest/modules/yum_module.html#yum-module
参数:name--指定安装软件的名称
参数:state--指定软件安装或卸载
在这个模块中卸载使用 removed 安装使用installed;注意看示例
[root@web01 ~]# ansible server -m yum -a "name=ansible state=installed"
5、service模块--批量管理服务的运行状态
官网模块说明:https://docs.ansible.com/ansible/latest/modules/service_module.html#service-module
参数
name:指定服务名称
enabled:设置服务是否开机自动运行 yes:开启开机自动运行 no:关闭开机自动运行
state:指定服务的运行状态(有以下几个状态)restarted 重启
reloaded 重读配置文件(部分服务可用)
stopped 关闭服务
started 开启服务
[root@web01 ~]# ansible server -m service -a "name=sshd state=started"
6、copy模块--将管理端的主机数据文件,分发给被管理端;将管理端目录中的数据移动到其他目录
官网模块说明:https://docs.ansible.com/ansible/latest/modules/copy_module.html#copy-module
参数:src--指定管理端源数据
参数:dest--分发到远程主机的目标路径下
参数:owner--专属文件之后修改文件属主
参数:group--传输文件之后修改文件属组
参数:mode--修改文件的读、写、执行权限
[root@web01 ~]# ansible server -m copy -a "src=/tmp/rsyncd.conf dest=/tmp owner=rsync group=rsync mode=666"
参数:backup--在分发传输文件之前,将源文件进行备份,按照时间信息进行备份
参数remote_src--no表示从管理端找寻数据进行分发;yes 默认从被管理端找寻数据进行分发
参数content--分发文件时在文件中穿件简单信息
[root@web01 /tmp]# ansible server -m copy -a "content='xianjian' dest=/tmp/xianjian remote_src=no mode=666"
注意:在copy模块中不能同时使用content 参数和src参数,否则会出现互斥,报错如下
[root@web01 /tmp]# ansible server -m copy -a "content='xianjian' src=/tmp/xinjian dest=/tmp/xianjian remote_src=no mode=666"
172.16.1.41 | FAILED! => {
"changed": false,
"msg": "src and content are mutually exclusive"
}
172.16.1.31 | FAILED! => {
"changed": false,
"msg": "src and content are mutually exclusive"
}
7、fetch模块--将远程主机数据进行拉取
官网模块说明:https://docs.ansible.com/ansible/latest/modules/fetch_module.html#fetch-module
参数:src--要拉取的远程数据
参数:dest--要保存本地的文件路径
[root@web01 /tmp]# ansible 172.16.1.41 -m fetch -a "src=/tmp/xinjian dest=/tmp/"
172.16.1.41 | CHANGED => {
"changed": true,
"checksum": "d5c2fe81c8a4fc3f532ab2617e6623dc46ce85a8",
"dest": "/tmp/172.16.1.41/tmp/xinjian",
"md5sum": "295b4c158e20855fb1fc47ec8f60600f",
"remote_checksum": "d5c2fe81c8a4fc3f532ab2617e6623dc46ce85a8",
"remote_md5sum": null
}
使用这个模块时注意src=/tmp/xinjian 不得加/;否则会出现如下报错
[root@web01 /tmp]# ansible 172.16.1.41 -m fetch -a "src=/tmp/xinjian/ dest=/tmp/"
172.16.1.41 | FAILED! => {
"changed": false,
"file": "/tmp/xinjian/",
"msg": "unable to calculate the checksum of the remote file"
}
8、file模块--修改文件属性信息用于创建数据信息(文件、目录、连接文件、删除数据)
官方说明:https://docs.ansible.com/ansible/latest/modules/file_module.html#file-module
path:指定路径信息
owner:传输文件之后修改文件属主权限
group:传输文件后修改属组权限
mode:直接修改文件读、写、执行权限
state:touch(创建文件)、directory(创建目录)、hard(创建硬链接文件) link(创建软链接文件)、absent(删除数据)
创建件目录:
[root@web01 /]# ansible 172.16.1.31 -m file -a "path=/mnt/test/ state=directory"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"gid": 65534,
"group": "nfsnobody",
"mode": "0755",
"owner": "nfsnobody",
"path": "/mnt/test/",
"secontext": "system_u:object_r:nfs_t:s0",
"size": 6,
"state": "directory",
"uid": 65534
}
[root@web01 /]#
创建文件:
[root@web01 /]# ansible 172.16.1.31 -m file -a "path=/mnt/test/test state=touch"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dest": "/mnt/test/test",
"gid": 65534,
"group": "nfsnobody",
"mode": "0644",
"owner": "nfsnobody",
"secontext": "system_u:object_r:nfs_t:s0",
"size": 0,
"state": "file",
"uid": 65534
}
[root@web01 /]#
删除数据信息:
[root@web01 /]# ansible 172.16.1.31 -m file -a "path=/tmp/test state=absent"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"path": "/tmp/test",
"state": "absent"
}
9、mount模块--挂载模块
官方说明:https://docs.ansible.com/ansible/latest/modules/mount_module.html#mount-module
参数:src--指定要挂载数据
参数:path--指定挂载点
**参数:fstype--指定挂载后,文件系统类型 如:ext3、ext4、xfs、nfs **
参数:state--指定动作 如:mounted(挂载)、present(永久挂载)、umounted(临时卸载) absent(永久卸载)
动作 | 功能 | 特点 |
---|---|---|
mounted | 挂载 | 1、会立即进行挂载操作2、可实现永久挂载 |
present | 挂载 | 只能永久挂载不会临时挂载 |
unmounted | 卸载 | 只能进行临时卸载 |
absent | 卸载 | 1. 进行临时卸载 2. 进行永久卸载 3. 挂载点目录会被删除 |
挂载:
[root@web01 /]# ansible server -m mount -a "src=172.16.1.31:/web_data path=/mnt fstype=nfs state=mounted"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dump": "0",
"fstab": "/etc/fstab",
"fstype": "nfs",
"name": "/mnt",
"opts": "defaults",
"passno": "0",
"src": "172.16.1.31:/web_data"
}
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dump": "0",
"fstab": "/etc/fstab",
"fstype": "nfs",
"name": "/mnt",
"opts": "defaults",
"passno": "0",
"src": "172.16.1.31:/web_data"
}
10、 cron模块--定时任务模块
官方说明:https://docs.ansible.com/ansible/latest/modules/cron_module.html#cron-module
name: 定义定时任务注释信息
参数:minute --表示分钟信息
参数:hour --表示小时信息
参数:day --表示日期信息
参数:month --表示月份信息
参数:weekday --表示星期信息
参数:job --表示定义任务信息
参数:state --指定动作 如:present(创建定时任务)、absent(删除定时任务)
参数:disabled: 让定时任务临时失效
利用ansible编写时间同步定时任务:每隔5分钟,进行时间同步:
[root@web01 /]# ansible server -m cron -a "name='date sync' minute=*/5 job='ntpdate ntp1.aliyun.com &>/dev/null'"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"date sync"
]
}
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"date sync"
]
}
删除定时任务:
[root@web01 /]# ansible 172.16.1.31 -m cron -a "name='date sync' state=absent"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": []
}
注释定时任务:
[root@web01 /]# ansible 172.16.1.31 -m cron -a "name='date sync' minute=*/5 job='ntpdate ntp1.aliyun.com &>/dev/null' disabled=yes"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"date sync"
]
}
11、 group模块--批量创建用户组
官网说明:https://docs.ansible.com/ansible/latest/modules/group_module.html#group-module
参数:name--指点组名
参数:gid--指定gid
参数:state--指定动作 present(创建) absent(删除)
[root@web01 /]# ansible server -m group -a "name=tese gid=777 state=present"
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"gid": 777,
"name": "tese",
"state": "present",
"system": false
}
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"gid": 777,
"name": "tese",
"state": "present",
"system": false
}
12、user模块--批量创建用户模块
官方说明:https://docs.ansible.com/ansible/latest/modules/user_module.html#user-module
参数:name--指定用户名称
参数:uid--指定用户uid信息
参数:group--指定属组
参数:groups--指定属于附加组
参数:password—-指定用户密码信息(必须密文的信息)
参数:shell—-指定用户shell信息 /sbin/nologin
参数:create_home--no表示不创建家目录
创建用户:
[root@web01 /]# ansible server -m user -a "name=girl uid=888 group=tese shell=/sbin/nologin create_home=no"
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": false,
"group": 777,
"home": "/home/girl",
"name": "girl",
"shell": "/sbin/nologin",
"state": "present",
"system": false,
"uid": 888
}
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": false,
"group": 777,
"home": "/home/girl",
"name": "girl",
"shell": "/sbin/nologin",
"state": "present",
"system": false,
"uid": 888
}
删除用户:
[root@web01 /]# ansible server -m user -a "name=girl state=absent"
172.16.1.41 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"force": false,
"name": "girl",
"remove": false,
"state": "absent"
}
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"force": false,
"name": "girl",
"remove": false,
"state": "absent"
}
[root@web01 /]#
ansible创建用户密文密码
**方法一:利用ansible模块功能
ansible all -i localhost, -m debug -a "msg={{ 'mypassword' | password_hash('sha512', 'mysecretsalt') }}"
mypassword: 指定明文密码信息
mysecretsalt:加密计算方式(辅助加密)
[root@web01 ~]# ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', 'mysecretsalt') }}"
localhost | SUCCESS => {
"msg": "$6$mysecretsalt$ZB9R8AirQYAXhtfhOo2qdJz52FyNI6v3L6Uc3KNRP.arBKIYpcuEyQewT5qBAHoyQFwHkW6Z551Ql.cZ53GeY0"
}
方法二:利用python模块功能
使用这种方法需要安装python-pip
如果安装不上需要更新pip源,更新方法:
更新pip源:
配置方法:在文件
~/.pip/pip.conf
中添加或修改:
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
==============================================================
安装好 :yum install python-pip 后
执行 pip install passlib
然后执行(什么也不用改,直接执行即可) :
python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
[root@m01 ~]# pip install passlib
Collecting passlib
Downloading https://files.pythonhosted.org/packages/ee/a7/d6d238d927df355d4e4e000670342ca4705a72f0bf694027cf67d9bcf5af/passlib-1.7.1-py2.py3-none-any.whl (498kB)
100% |████████████████████████████████| 501kB 13kB/s
Installing collected packages: passlib
Successfully installed passlib-1.7.1
You are using pip version 8.1.2, however version 19.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
[root@m01 ~]# python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
Password:
$6$pYHuK3LNv3OwCytH$MnGUAzTXLH9TdU/Xz.9u9FY2QaZfEtH5l.kEE9hID9sZPrug6fm0M3BWMVjUk81uemTHkZhtg7i982M.05x8T1
[root@m01 ~]# ansible nfs01 -m user -a 'name=test password="$6$pYHuK3LNv3OwCytH$MnGUAzTXLH9TdU/Xz.9u9FY2QaZfEtH5l.kEE9hID9sZPrug6fm0M3BWMVjUk81uemTHkZhtg7i982M.05x8T1"'
172.16.1.31 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": true,
"group": 1001,
"home": "/home/test",
"name": "test",
"password": "NOT_LOGGING_PASSWORD",
"shell": "/bin/bash",
"state": "present",
"system": false,
"uid": 1000
}
[root@m01 ~]# ansible nfs01 -m command -a "id test"
172.16.1.31 | CHANGED | rc=0 >>
uid=1000(test) gid=1001(test) groups=1001(test)
[root@m01 ~]#