自动化运维管理---Ansible

一、Ansible 简介

  1. ansible 是什么

  ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
  ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远
程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。

  2. ansible 特点

  1. 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
  2. 默认使用SSH协议对设备进行管理;
  3. 有大量常规运维操作模块,可实现日常绝大部分操作;
  4. 配置简单、功能强大、扩展性强;
  5. 支持API及自定义模块,可通过Python轻松扩展;
  6. 通过Playbooks来定制强大的配置、状态管理;
  7. 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
  8. 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。

  3. ansible 架构图

二、Ansible 部署配置

  1. 安装ansible

yum install epel-release -y       # 安装epel源
yum install ansible -y            # 安装ansible批量管理软件
yum install libselinux-python -y  # Python依赖包

  2.  配置hosts文件

[root@m01 ~]cat /etc/ansible/hosts  # 在文件最下面配置主机列表

#定义可以管理的主机信息
[web]
172.16.1.7  ansible_ssh_user=root ansible_ssh_pass=123456
172.16.1.8  ansible_ssh_user=root ansible_ssh_pass=123456

[nfs]
172.16.1.31 ansible_ssh_user=root ansible_ssh_pass=123456

 注:如果使用SSH密钥方式也可以不输入密码进行控制,SSH分发密钥方式查看SSH分发密钥文档

Ansible 主机文件参数信息
参数信息 参数类型 参数说明
ansible_host 通用连接参数 将要连接的远程主机名与想要设定的主机的别名不同的话,可通过此变量设置
ansible_port 通用连接参数 设置SSH服务端口号,如果是默认22端口可以不设置
ansible_ssh_user 通用连接参数 指定默认使用什么用户身份登录
ansible_ssh_pass 通用连接参数 指定远程连接的主机密码信息

  3. 使用ansible管理

[root@m01 ~]# ansible web -m command -a "hostname"

172.16.1.8 | CHANGED | rc=0 >>
web02

172.16.1.7 | CHANGED | rc=0 >>
web01

三、Ansible 批量管理命令

  1. ansible语法格式

  2. 命令参数

命令参数 命令说明
-a(MODULE_ARGS) 指定使用模块的哪些参数,一般可以接操作的命令
-c 不做任何改变,而是尝试预测一些可能发生的变化,就是测试
-f 指定使用并行执行的进程数量(默认是5个),机器数量多时使用
-i 指定被管理主机的列表清单文件路径信息(默认为/etc/ansible/hosts)或者用逗号分隔主机列表
--list-hosts 输出匹配的主机列表信息,并不执行其他操作
-m 指定使用的模块(默认不指定,使用command)
--syntax-check 在剧本上执行语法检测,但并不执行剧本
-k 提示输入远程主机SSH的密码信息
-u 指定用户身份远程进行操作,此用户在远程主机必须存在

  3.  ansible-doc 命令

ansible-doc -l          # 列出所有ansible支持的模块
ansible-doc -s command  # 查看某个模块的帮助参数

四、Ansible 常用模块

  1. command 模块

command 模块功能参数
选项参数 选项说明
chdir 在执行命令之前,通过cd命令进入到指定目录中
creates 定义一个文件是否存在,如果不存在,则运行相应命令;如果存在则跳过相应命令
free_from (必有参数) 参数信息中可以输入任何系统命令信息,实现远程管理

removes

定义一个文件是否存在,如果存在,则运行相应命令;如果不存在则跳过相应命令
说明:命令中不能包含类似$HOME和参数类似"<",">","|",";" 和"&"等信息,如需使用请使用shell模块

  例1:

[root@m01 ~]#ansible web -m "command" -a "uptime"

172.16.1.8 | CHANGED | rc=0 >>
 18:07:33 up 37 min,  2 users,  load average: 0.00, 0.01, 0.05

172.16.1.7 | CHANGED | rc=0 >>
 18:07:33 up  5:14,  4 users,  load average: 0.00, 0.01, 0.05

  例2:

[root@m01 ~]# ansible web -m "command" -a "removes=/tmp ls /tmp"

172.16.1.8 | CHANGED | rc=0 >>
ansible_command_payload_ZeIcUx
rsync_fail_log.sh

172.16.1.7 | CHANGED | rc=0 >>
ansible_command_payload_bzbNln
rsync_fail_log.sh

  2. shell 模块

shell 模块功能参数
选项参数 选项说明
chdir 在执行命令之前,通过cd命令进入到指定目录中
creates 定义一个文件是否存在,如果不存在,则运行相应命令;如果存在则跳过相应命令
free_from (必有参数) 参数信息中可以输入任何系统命令信息,实现远程管理

removes

定义一个文件是否存在,如果存在,则运行相应命令;如果不存在则跳过相应命令

  例1:

[root@m01 ~]# ansible web -m shell -a "ps -ef|grep sshd|grep -v grep"

172.16.1.8 | CHANGED | rc=0 >>
root       1415      1  0 17:30 ?        00:00:00 /usr/sbin/sshd -D
root       1699   1415  0 17:33 ?        00:00:00 sshd: root@pts/0
root       2221   1415  0 18:14 ?        00:00:00 sshd: root@pts/1

172.16.1.7 | CHANGED | rc=0 >>
root       1384      1  0 12:53 ?        00:00:00 /usr/sbin/sshd -D
root       2015   1384  0 14:05 ?        00:00:02 sshd: root@pts/1
root       5268   1384  0 16:52 ?        00:00:00 sshd: root@pts/0

  例2:

[root@m01 ~]# ansible servers -m shell -a "tmp/check_disk.sh"

172.16.5.193 | CHANGED | rc=0 >>
disk_size=32%
unhealth


172.16.5.181 | CHANGED | rc=0 >>
disk_size=43%
unhealth

说明:执行脚本命令时,远程主机必须有此脚本才可使用

  3. script 模块

script 模块功能参数
选项参数 选项说明
creates 定义一个文件是否存在,如果不存在,则运行相应命令;如果存在则跳过相应命令
free_from (必有参数) 参数信息中可以输入任何系统命令信息,实现远程管理

removes

定义一个文件是否存在,如果存在,则运行相应命令;如果不存在则跳过相应命令

  例1:

[root@m01 ~]# ansible web -m script -a "tmp/check_disk.sh"

172.16.1.7 | CHANGED | rc=0 >>
disk_size=32%
unhealth


172.16.1.8 | CHANGED | rc=0 >>
disk_size=43%
unhealth

说明:执行脚本命令时,脚本不需要在远程主机存在和授权

  4. copy 模块

copy 模块功能参数
选项参数 选项说明
src 指定源文件路径,可以是相对路径,也可以是绝对路径,可以是目录
dest (必有参数) 指定目标文件路径,只能是绝对路径,如果src是目录,此项必须是目录
owner 定义文件/目录属主,类似于chown

group

定义文件/目录属组,类似于chown
mode 定义文件/目录权限,可以以数字指定比如0644
backup 创建备份文件并且包含时间戳信息,以便能够还原文件。默认配置为no,并且指定信息为yes|no
content 当使用代替参数时,将文件的内容直接设置为指定值。远端创建有指定内容的文件,并且只能设置简单值。
force

默认为yes,如果目标主机包含该文件,但内容不同,则强制覆盖

如果为no,则只有当目标主机的目标位置不存在该文件时,才复制

remote_src

如果为False,将搜索源信息在本地/管理及机器上

如果为True,将到远程/目标主机的机器上搜索

默认为false,目前不支持递归复制

  例1:
[root@m01 ~]# ansible web -m copy -a "src=./anaconda-ks.cfg  dest=/data owner=www group=www mode=0644"
172.16.1.7 | CHANGED => {
    "changed": true, 
    "checksum": "9d791df2961e299fac1206c2e1c6ab1cde2c86a2", 
    "dest": "/data/anaconda-ks.cfg", 
    "gid": 1086, 
    "group": "www", 
    "md5sum": "221e5656c9b59aec6c7596568fff8ad3", 
    "mode": "0644", 
    "owner": "www", 
    "size": 1499, 
    "src": "/root/.ansible/tmp/ansible-tmp-1548230667.08-106764271060692/source", 
    "state": "file", 
    "uid": 1086
}

  例2:

[root@m01 ~]# ansible web -m copy -a "src=/etc/hosts  dest=/data backup=yes"
172.16.1.7 | CHANGED => {
    "backup_file": "/data/anaconda-ks.cfg.4263.2019-01-23@15:52:43~", 
    "changed": true, 
    "checksum": "9d791df2961e299fac1206c2e1c6ab1cde2c86a2", 
    "dest": "/data/anaconda-ks.cfg", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "221e5656c9b59aec6c7596568fff8ad3", 
    "mode": "0644", 
    "owner": "root", 
    "size": 1499, 
    "src": "/root/.ansible/tmp/ansible-tmp-1548229931.86-180942706957431/source", 
    "state": "file", 
    "uid": 0
}

  例3:

[root@m01 ~]# ansible web01 -m copy -a "content=test  dest=/data/anaconda-ks.cfg "
172.16.1.7 | CHANGED => {
    "changed": true, 
    "checksum": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", 
    "dest": "/data/anaconda-ks.cfg", 
    "gid": 1086, 
    "group": "www", 
    "md5sum": "098f6bcd4621d373cade4e832627b4f6", 
    "mode": "0644", 
    "owner": "www", 
    "size": 4, 
    "src": "/root/.ansible/tmp/ansible-tmp-1548231000.52-150895010308573/source", 
    "state": "file", 
    "uid": 1086
}

  5. fetch 模块

fetch 模块功能参数
选项参数 选项说明
src 指定远程主机源文件路径,必须是文件,而不是目录
dest 指定本地主机文件路径,只能是绝对路径,必须是目录

  例1: 

[root@m01 ~]# ansible web -m fetch -a "src=/etc/hosts dest=/tmp"
172.16.1.7 | CHANGED => {
    "changed": true, 
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "dest": "/tmp/hosts", 
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e", 
    "remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "remote_md5sum": null
}

  6. file 模块

file 模块功能参数
选项参数 选项说明
src 要链接的文件路径(只能应用state=link),创建连接文件时使用
path (必有参数) 文件路径管理:别名方式—:dest,name
owner 定义文件/目录属主,类似于chown

group

定义文件/目录属组,类似于chown
mode 定义文件/目录权限,可以以数字指定比如0644
state directory:所有不存在的子目录将会被创建
file:如果文件不存在将不能被创建
link:符号链接文件将被创建或更改
hard:创建硬链接文件
touch:如果文件不存在,则会创建一个空文件,如果文件或目录已存在,接收更新文件访问和修改时间
absent:目录将被递归删除以及文件,而链接将被取消

  例1:

[root@m01 ~] ansible web -m file -a 'path=/root/test owner=www mode=755'
172.16.1.7 | CHANGED => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0700", 
    "owner": "mariadb", 
    "path": "/root/test", 
    "size": 0, 
    "state": "file", 
    "uid": 997
}

  7. yum 模块

yum 模块功能参数
选项参数 选项说明
name 需要安装的软件包名称信息,或包的版本标识信息
state 是否安装(present or installed latest)或者移除(absent or removed)一个包

  例1:

[root@m01 ~] ansible web -m yum -a "name=vsftpd state=installed"
172.16.1.7 | CHANGED => {
    "ansible_facts": {
        "pkg_mgr": "yum"
    }, 
    "changed": true, 
    "msg": "Repository 'cdrom' is missing name in configuration, using id\n", 
"rc": 0, ##rc返回值为0代表执行成功
......

  8. service/systemd 模块

service/systemd 模块功能参数
选项参数 选项说明
name 定义所要管理的服务名称
state

started/stopped 两个参数属于激活操作命令

restarted 重启操作将是始终支持的服务

reloaded 表示进行平滑重启

enable 确认是否系统启动时运维指定的服务

  例1:

[root@m01 ~] ansible web -m service  -a 'name=httpd state=started enable=yes'
172.16.1.7 | CHANGED => {
    "changed": true, 
    "name": "httpd", 
    "state": "started", 
    "status": {
        "ActiveEnterTimestampMonotonic": "0", 
        "ActiveExitTimestampMonotonic": "0",
......

  9. cron 模块

cron 模块功能参数
选项参数 选项说明
minute 分钟(0-59,*,*/2,……),不写默认为*
hour 小时(0-23,*,*/2,……),不写默认为*
day 日(1-31,*,*/2,……),不写默认为*
month 月(1-12,*,*/2,……),不写默认为*
weekday 周(0-7,*,……),不写默认为*
job 执行相应的命令
name 定时任务条目的描述信息
state 确认job或环境变量的开启或者关闭;即创建定时任务或删除定时任务
disabled

如果job应该关闭(被注释掉)。只能影响状态是开启状态的定时任务条目

user 指定修改与编写定时任务的用户信息

  例1:

[root@m01 ~]# ansible web -m cron -a "name='ntpdate time' minute=*/5 job='/usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null' "
172.16.1.7 | CHANGED => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "None", 
        "ntpdate time"
    ]
}

  10. mount 模块

mount 模块功能参数
选项参数 选项说明
src 要挂载的设备
path 挂载点
fstype 挂载的文件系统类型
opts 挂载的参数选项
state

present:不会挂载,只会修改fstab文件

mounted:会进行挂载,会修改fstab文件

unmounted:会进行卸载,不会修改fstab文件

absent:会进行卸载,也会修改fstab文件信息

  例1:

[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data/  path=/mnt fstype=nfs state=present"
#以上信息只是在/etc/fstab文件中添加了配置信息,不会真正进行挂载(mount -a)
[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data/  path=/mnt fstype=nfs state=mounted"
#以上信息是在/etc/fstab文件中添加了配置信息,并且也会真正进行挂载

  11. user 模块

user 模块功能参数
选项参数 选项说明
create_home 创建家目录,除非设置no,则不创建家目录
group 创建用户组(主组)
name 创建的用户名
password 创建用户的密码
uid

创建用户的UID

shell 创建用户登录的shell
state

absent,移除远端主机的用户

present,创建远端的用户

  例1:

[root@m01 ~]# ansible 172.16.1.31 -m user -a "name=rsync create_home=no  shell=/sbin/nologin"
172.16.1.7 | CHANGED => {
    "changed": true, 
    "comment": "", 
    "create_home": true, 
    "group": 1001, 
    "name": "mysql", 
    "shell": "/sbin/nologin", 
    "state": "present", 
    "system": false, 
    "uid": 1001
}

  12. group 模块

group 模块功能参数
选项参数 选项说明
name 指定创建的组名
gid

指定组的GID

state

absent,移除远端主机的组

present,创建远端的主机组(默认)

  例1:

[root@m01 ~] ansible web -m group -a 'name=tomcat state=present'
172.16.1.7 | CHANGED => {
    "changed": true, 
    "gid": 1000, 
    "name": "tomcat", 
    "state": "present", 
    "system": false
}

五、Ansible 剧本功能

  1. 基本语法

- hosts: web            # 管理的目标主机
  tasks:                # playbook所有的任务集合信息
    - name: creategroup   # 定义任务的名称,非必须
      group: name=Tom     # 定义一个任务的具体操作动作
    - name: cretaeuser
      user: name=Andey 

  2. hosts的定义方式:

方式一:定义所管理的主机IP
- hosts: 172.16.1.7
  tasks:

方式二:定义所管理的主机名称信息
- hosts: web01
  tasks:

方式三:定义所管理的多主机信息
- hosts: 172.16.1.6, web01
  tasks:

  3. tasks的定义方式:

方式一:采用变量格式设置任务
tasks:
  - name: make sure apache is running
    service: name=httpd state=started

方式二:采用字典格式设置任务
tasks:
  - name: make sure apache is running
    service:
           name: httpd
           state: started

  4. 变量使用方式

方式一:将变量直接写在文件中
- hosts: nfs_server
  vars:
      Data_dir: /data
  tasks:
    - name: create data dir
      file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody

方式二:将变量写在变量文件中
- hosts: nfs_server
  vars_files:
    - vars/server_vars.yml
  tasks:
    - name: create data dir
      file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody

  5. 剧本其他使用方式

#1. 在剧本中设置判断信息
- hosts: oldboy
  remote_user: root
  tasks:
    - name: Check File
      file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch
      when: (ansible_hostname == "nfs") or (ansible_hostname == "backup")

#2. 在剧本中设置循环信息
- hosts: all
  remote_user: root
  tasks:
    - name: Add Users
      user: name={{ item.name }} groups={{ item.groups }} state=present
      with_items: 
	    - { name: 'testuser1', groups: 'bin' }
	    - { name: 'testuser2', groups: 'root' }

#3. 在剧本中设置忽略错误
- hosts: all
  remote_user: root
  tasks:
    - name: Ignore False
      command: /bin/false
	  ignore_errors: yes

#4. 在剧本中设置标签功能
- hosts: oldboy
  remote_user: root
  tasks:
    - name: Check File
      file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch
      when: (ansible_hostname == "nfs01") or (ansible_hostname == "backup")
	  tags: t1
#指定执行哪个标签任务: ansible-playbook --tags=t1 test.yml 
#跳过指定标签任务:     ansible-playbook --skip-tags=t1 test.yml

#5. 在剧本中设置触发功能
- hosts: backup
  remote_user: root
  tasks:
    - name: Install rsync
      yum: name=rsync state=present
      notify: restart rsync server

  handlers:
    - name: restart rsync server
      service: name=rsyncd state=restarted 

  6. 剧本整合

方式一:include_tasks: f1.yml  
- hosts: all
  remote_user: root
  tasks:
    - include_tasks: f1.yml
    - include_tasks: f2.yml

方式二:- import_playbook:
[root@m01 ansible-playbook]# cat main.yml 
- import_playbook: base.yml     
- import_playbook: rsync.yml    
- import_playbook: nfs.yml      
- import_playbook: oxxx.yml
- import_playbook: rsync.yml
- import_playbook: nfs.yml

  7. 规范剧本目录

[root@m01 nfs]mkdir /etc/ansible/roles/nfs/{vars,tasks,templates,handlers,files}  --- 创建角色目录下面的子目录
[root@m01 nfs]# tree
    .
    ├── files         # 存放需要传输的文件
    │   └── exports
    ├── handlers      # 保存触发器配置文件信息
    │   └── main.yml
    ├── tasks         # 保存要执行的动作信息文件
    │   └── main.yml
    ├── templates     # 保存需要分发模板文件 模板文件中可以设置变量信息
    └── vars
        └── main.yml  # 保存变量信息文件

  8. 执行剧本

ansible-playbook --syntax-check  rsync_server.yaml  # 检查剧本的语法格式命令
ansible-playbook -C rsync_server.yaml   # 模拟执行剧本命令
ansible-playbook rsync_server.yaml      # 执行剧本命令

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章