自动化管理工具,不是服务,基于ssh执行python脚本
简单使用
管理机配置
- 配置管理机与其他机器的密钥认证
yum install -y ansible- 配置主机清单 ```bash [data] # 分组,写域名ip都可以 lb01 db01 nfs01 backup web01
[zizu:children] # 后面带children的是子组(给组分组) data
4. 关闭第一次使用时候的主机校验(如果开启了)```bashgrep -n '^host_key' /etc/ansible/ansible.cfg
- 测试
其他:ansible可以使用密码连接其他机器,但还是建议配置并使用密钥认证。ansiable -m ping
ansible命令拆解
示例:ansible all -m command -a 'hostname' # all可以替换为具体的分组、
帮助:ansible-doc -s command
官网文档
| 选项 | 意义 |
|---|---|
| -m module | 指定模块 |
| -a active | 指定选项 |
ANS模块
command
默认模块,可以不指定 -m ,不支持特殊符号ansibls all -a hostname
shell
与command类似,但是支持脚本(被管理端)和特殊符号ansible all -m shell -a 'sh /xx/xx.sh'
roles中直接在shell冒号后面写命令或者放到缩进的 cmd: 下
script
传输脚本到被管理机并执行,执行完删除ansible all -m script -a '/xxx/xxx/xx.sh'
file
文件和目录和软链接相关操作
| 选项 | 意义 |
|---|---|
| path | 路径 |
| src | 指定软连接源文件 |
| state | state=directory state=link(软连接) state=touch state=absent(删除) state=file(默认,文件不存在不会自动创建) |
| owner | |
| group | |
| mode |
copy/template(可以使用jinja2模板)
分发文件,路径不存在会自动创建,支持递归创建
| 选项 | 意义 |
|---|---|
| src | 源文件 |
| dest | 目标目录 |
| backup | backup=yes,会备份目标目录中的同名文件 |
| mode | |
| owner | |
| group |
systemd
| 选项 | 意义 |
|---|---|
| name | 指定服务名字 |
| enabled | 控制是否开机自动启动 |
| state | state=stopped state=started state=reloaded state=restarted |
| daemon_reload | deamon_reload=yes 对应systemctl reload 是否重新加载对应服务的管理配置文件 |
yum
用逗号分割安装多个
或者 -
| 选项 | 意义 |
|---|---|
| name | 指定软件包的名字 |
| state | installed 安装(present) remove 删除(absent) latest 安装或更新 (记这个就够了) |
| validate_certs | yes || no 免认证https |
get_url(wget
| 选项 | |
|---|---|
| url | 指定要下载的地址 |
| dest | 下载到哪个目录(需要已经存在) |
| validate_certs | no |
mount
| 选项 | 意义 |
|---|---|
| fstype | 指定文件系统(nfs) |
| src | 源地址 |
| path | 挂载点 |
| state | absent 卸载(umount)并修改fstab(清理配置) unmounted 卸载不修改/etc/fstab present 仅修改/etc/fstab 不挂载 mounted 挂载(用mount命令)并修改/etc/fstab(永久挂载) remounted 重新挂载 |
cron
不写默认就是*
选项后面需要加上 “”
| 选项 | 意义 |
|---|---|
| name | 注释 |
| minute | |
| hour | |
| day | |
| month | |
| week | |
| job | 命令 |
| state | present 默认 sbsent 删除 |
user
| 选项 | 意义 |
|---|---|
| name | 用户名 |
| uid | 指定用户名 |
| group | 指定组 |
| shell | 指定命令解释器 |
| create_home | 是否创建家目录 |
| state | 默认present absent |
gruop
| 选项 | 意义 |
|---|---|
| name | 指定组名 |
| gid | 指定gid |
| state | present、absent创建或删除 |
lineinfile
| 选项 | 意义 |
|---|---|
| line | 追加文件内容,不会追加重复内容 多行用\n换行,在剧本中不行,用循环实现 |
| path | 指定文件 |
| create | yes || no,自动创建文件 |
| state | present(默认)、absent |
| mode | |
| group | |
| owner |
mysql_user
| 选项 | 意义 |
|---|---|
| name | 用户 |
| host | 用户允许远程登陆的主机 |
| priv | “blog.*:ALL” 解释:blog下所有表的所有权限 |
| login_user | 有root时候要登陆 |
| login_password | 有root时候要登陆 |
| state | present或absent |
| password | 设置密码 |
| update_password | always,和password一起用 |
mysql_db
| 选项 | 意义 |
|---|---|
| name | 指定数据库 |
| state | present或absent dump或import(导入导出 |
| target | 和导入一起用,指定导入文件的目录 |
| login_user | 有root时候要登陆 |
| login_password | 有root时候要登陆 |
| login_host | 指定登录的数据库主机 |
| encoding | 创建数据库的时候指定字符集,如utf8 |
| collation | 指定校验,和字符集一起用,utf8_general_ci |
数据库删除了下回来还是要密码
rm -rf /var/lib/mysql ,记得先停止sql进程
yum_repository(了解,一般直接copy分发)
unarchive
| src | |
| dest | |
| owner | |
| group | |
| create | 有指定的绝对路径文件存在 一开始整个就不执行解压 |
剧本
---
- hosts:
remote_user:root # 发送给root
gather_facts: no # 关闭内置变量
vars: # 剧本变量
file_name:hahaha或./vars.yml # 变量文件
tasks:
- name: 创建一个文件 # 注释
shell:touch /tmp/{{ file_name }} # 模块
register:lalala # 注册上一步的变量
tags: # 标签
- touch
notify:
- restart nfs
- name: 输出变量
debug:
msg:"{{ lalala.stdout }}"
ignore_errors: yes # 忽略错误,这一步错了也要继续执行下去
handlers:
- name:ddd
变量
组变量
/server/ans/playbook/group_vasrs/all/vars.yml
facts变量(内置变量)
常用fact变量
ansible_hostname #主机名
ansible_memtotal_mb #内存大小(总计) 单位mb
ansible_processor_vcpus #cpu数量
ansible_default_ipv4.address #默认的网卡ip eth0
ansible_distribution #系统发行版本名字
CentOS Ubuntu Debian
ansible_processor_cores #核心总数
ansible_date_time.date #当前时间 年-月-日
# 不常用查询
ansible 指定主机清单中的主机名或主机组 -m setup | less
register
register:变量名 # 注册上一步的结果
tasks:
- name: 01.获取主机名
shell: hostname
register: hostname # hostname是变量名
- name: 输出变量内容
debug:
msg: "{{ hostname.stdout }}"
标签
ansible-playbook -i hosts --tags conf 14-tags-nfs-server.yml
ansible-playbook -i hosts --skip-tags install,conf_file 14-tags-nfs-server.yml
include
include文件包含.把一个任务分成多个剧本来实现,书写个总剧本文件,通过include_tasks: 引用子剧本文件.
⚠ 子剧本文件中只需要些模块部分(task部分即可)
part1.yml
part2.yml
---
- host:
tasks:
- include_tasks:part1.yml
- host:
tasks:
- include_tasks:part2.yml
handlers、when、for
- host:
tasks:
- name:
notify:
- 注释
handlers:
- name:注释
---
- hosts: all
tasks:
- name: 配置lb或web的nginx yum源 6 copy:
copy:
src: ./nginx.repo
dest: /etc/yum.repos.d/nginx.repo
backup: yes
when: ( ansible_hostname is match("web|lb"))
---
- hosts: nfs
gather_facts: no
tasks:
- name: restart 多个服务
systemd:
name: "{{ item }}"
state: restarted
with_items:
- crond
- rpcbind
- nfs
- {name:"ee", id:"ee"}
Jinja2
分发文件的时候做解析,文件名后缀改成 .j2
将剧本中的copy用template代替
roles
/server/ansible/playbook/roles/
top.yml
剧本名字/
files/
templates/
xxx.j2
tasks/
main.yml
handlers/
main.yml
# hosts可以指定多个主机或者组,组用:分割,主机用,或者空格分割
- hosts:
roles:
- role:基本目录
mkdir -p /server/ansible/playbook/roles/
touch top.yml
# mkdir xxxx # 对应的目录
mkdir `ls /server/ansible/playbook/roles|grep -v top|sed -n '1p'`/{files,templates,tasks,handlers}
mkdir `ls /server/ansible/playbook/roles|grep -v top|sed -n '2p'`/{files,templates,tasks,handlers}
mkdir `ls /server/ansible/playbook/roles|grep -v top|sed -n '3p'`/{files,templates,tasks,handlers}
# 加强版,必须在roles路径下执行,要删除就把mkdir改成rm -rf。
find . -maxdepth 1 -type d ! -name '.' -exec mkdir {}/{files,templates,tasks,handlers} \;
galaxy
Ansible-vault
ansible-vault encrypt hosts #加密这个文件,设置密码
ansible --ask-vault-pass -i hosts all -m ping #使用ansible命令或ansible-playbook命令需要加上--ask-vault-pass
优化
inventory = /etc/ansible/hosts #指定的默认的主机清单. 未来可以修改为 ./hosts 就可以不用加上-i
forks = 50 #并发数量. 可以增加加这个数量获取更快批量管理效率.
sudo_user = root #配置下被管理端具有sudo权限的用户,并且修改/etc/sudoers 注释掉requiretty
host_key_checking = False #默认是True 连接新的主机要进行验证. 建议关闭,加速.
log_path = /var/log/ansible.log #默认没有开启.
ssh_args = -C -o ControlMaster=auto -o ControlPersist=6d #连接的保持时间. 6d 10d
pipelining = True #加速,加速连接合并不必要的连接. 要求:不能使用sudo,如果使用则不能开启.
排错
Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host.
vim /etc/ansible/ansible.cfg
host_key_checking = False
