自动化管理工具,不是服务,基于ssh执行python脚本

简单使用

管理机配置

  1. 配置管理机与其他机器的密钥认证
  2. yum install -y ansible
  3. 配置主机清单 ```bash [data] # 分组,写域名ip都可以 lb01 db01 nfs01 backup web01

[zizu:children] # 后面带children的是子组(给组分组) data

  1. 4. 关闭第一次使用时候的主机校验(如果开启了)
  2. ```bash
  3. grep -n '^host_key' /etc/ansible/ansible.cfg
  1. 测试
    ansiable -m ping
    
    其他:ansible可以使用密码连接其他机器,但还是建议配置并使用密钥认证。

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分发)

选项 意思
name yum源名字
description yum源注释描述
baseurl yum源中下载软件包的地址(可以访问到repodata目录)
enable~~=yes 或no ~~
gpgcheck=yes或no
file~~ (可以不加)~~ 指定yum源的文件 自动添加 ~~.repo~~ 默认与模块名字一致

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

写好的roles剧本

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