全栈开发:自动化工具 Ansible 基础及进阶使用

Ansible 介绍和基本使用

基本概述

Ansible 是一款好用的 IT 开源自动化工具,基于 Python Paramiko 模块开发,分布式,不需要客户端,只需在服务端进行操作,使用 SSH 来和节点进行通信。

官网网址:https://www.ansible.com

官方文档:

https://docs.ansible.com/ansible/latest/user_guide/become.html

image.png

应用场景

批量执行和分发任务,如:

  • 同时在 1000 台服务器上安装 Apache 服务,并在安装后启动服务。
  • 将某一个文件一次性拷贝到 1000 台服务器上。

特点

  • 部署简单,只需要在 Ansible 控制端部署
  • 默认使用 SSH 协议进行管理
  • 主从集中化管理
  • 配置简单,扩展性强
  • 支持 API 及自定义模块,可通过 Python 扩展
  • 通过 Playbooks 剧本来定制强大的配置

架构图:

在这里插入图片描述

安装

1. 设置 EPEL 仓库(Ansible 仓库默认不在 yum 仓库中,所以要启用 EPEL 仓库):

yum install epel-release -y

2. 使用 yum 进行安装:

yum install ansible -y

3. 查看版本:

ansible --version

Ansible 语法

ansible [-i:主机文件] [-f:批次] [组名] [-m 模块名称] [-a:模块参数]

Ansible 常用参数:

 -v,–verbose               #  详细模式,如果命令执行成功,输出详细的结果 (-vv –vvv -vvvv)
 -i PATH, -inventory=PATH  #  指定 host 文件的路径,默认是在 /etc/ansible/hosts 
inventory  [ˈɪnvəntri]  库存
 -f NUM,-forks=NUM       # NUM 是指定一个整数,默认是 5 ,指定 fork 开启同步进程的个数。
 -m NAME,-module-name=NAM    #   指定使用的 module 名称,默认使用 command 模块
 -a,MODULE_ARGS              #指定 module 模块的参数
 -k,-ask-pass                #提示输入 ssh 的密码,而不是使用基于 ssh 的密钥认证
 -sudo                       # 指定使用 sudo 获得 root 权限
 -K,-ask-sudo-pass           #提示输入 sudo 密码,与 -sudo 一起使用
 -u USERNAME,-user=USERNAME  # 指定移动端的执行用户
 -C,–check                   #测试此命令执行会改变什么内容,不会真正地去执行

使用 ansible-doc:查看各种模块的帮助。

命令格式:

ansible-doc -l        #列出所有的模块列表

ansible-doc -s 模块名  #查看指定模块的参数

ansible-doc 模块名     #查看指定模块的详细参数

示例:

ansible-doc copy #查看 copy 模块的帮助

ansible-doc yum  #查看 yum 模块的帮助

查看 yum 帮助信息:

EXAMPLES:

- name: install the latest version of Apache
  yum:
    name: httpd
    state: latest

- name: ensure a list of packages installed
  yum:
    name: "{{ packages }}"
  vars:
    packages:
    - httpd
    - httpd-tools

- name: remove the Apache package
  yum:
    name: httpd
    state: absent

基本使用

定义主机清单(有两种方式:一种基于端口,用户名密码,一种基于 SSH 密钥)

1. 基于端口、用户名、密码定义清单

格式:

  • ansible_ssh_port:指定 SSH 端口
  • ansible_ssh_user:指定用户
  • ansible_ssh_pass:指定密码
  • ssh_sudo_pass:指明 sudo 时候的密码

2. 基于 SSH 密钥来访问定义清单

在 ansible 服务端生成秘钥,并且复制公钥到节点中
ssh-keygen 一直回车,

#一键生成
ssh-keygen -f ~/.ssh/id_rsa -P '' -q

使用 ssh-copy-id 命令复制 Ansible 公钥到节点:

ssh-copy-id  [email protected]

使用 sshpass 批量分发密钥到服务器
[root@game scripts]# cat scp_isa.sh 
#!/bin/bash
ip=(130 131 132 133)
for i in ${ip[@]}
do
    sshpass -p"Skills39" ssh-copy-id -i /root/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" [email protected].$i 
done

服务端查看效果:

[root@game ~]# cat /root/.ssh/known_hosts 
192.168.228.130 ecdsa-sha2-nistp256 AAAAE2VjZHNhL.....AuHi+n9iVPC0Of9D/MKK8lWuGHg=
192.168.228.131 ecdsa-sha2-nistp256 AAAAE2VjZHNh...d8FX4mqoYCp43E2knM9t8YAZGg/k08=
192.168.228.132 ecdsa-sha2-nistp256 AAAAE2VjZHNhL....y6U2tCs+SU/Sg+rGR8E76lqC316Q=
192.168.228.133 ecdsa-sha2-nistp256 AAAAE2....iTuiJ+0VNOYrhh2gqW36XJVlW1+p6pj2dbo=

服务端测试面密钥登录
ssh 192.168.228.130

配置清单书写:

#/etc/ansible/hosts
  [db-server]
  192.168.186.142
  192.168.186.135

#网段范围写法
  [all]
  192.168.228.[130:133]

#如果写主机名,需要在 /etc/hosts 里面写
  [a]
  k8s-master
#/etc/hosts
[root@game ~]# cat /etc/hosts
192.168.228.130 k8s-master

Ansible 常用模块的使用

提示:在传送命令下载的时候如果此前有操作过,那些会显示执行成功,但是会显示绿色。

传送显示颜色信息说明:

  • 黄色:对远程节点进行相应修改
  • 绿色:对远程节点不进行相应修改
  • 红色:操作执行有问题
  • 紫色:表示对命令执行发出警告信息(可能存在问题)

常见模块概览:

#常用模块            示例
command   #ansible k8s-node -m command -a 'uptime'
shell        #ansible k8s-node -m shell -a "free -m"
scripts      #ansible k8s-node -m script -a "/etc/ansible/init.sh"
copy         #ansible k8s-node -m copy -a "src=/etc/hosts dest=/tmp owner=root group=root mode=0755"
yum             #ansible k8s-node -m yum -a "name=httpd state=latest"
yum_repository    #添加 yum 仓库,用法可 ansible-doc yum_repository 查看帮助
group       #ansible k8s-node -m group -a "name=www gid=666"
user        #ansible k8s-node -m user -a "name=user1 state=present"
service  #ansible k8s-node -m service -a "name=httpd state=restarted"
file        #ansible k8s-node -m file -a "path=/data state=directory owner=www group=www recurese=yes"
              recurese(递归授权) state=touch(创建文件)
sysctl     #ansible k8s-node -m sysctl -a "name=net.ipv4.ip_forward value=1 reload=yes"
stat       #ansible k8s-node -m stat -a "path=/tmp/hosts"
get url #ansible k8s-node -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm  dest=/tmp/ mode=0440 force=yes"
cron       #ansible k8s-node -m cron -a "name=list minute=*/30 job='ls tmp'"
setup
mount
#参数解释:-m:指定模块名,-a:命令参数

command 模块

为默认的模块,不指定 -m 参数时,就是使用 command 模块。

有些命令不能执行,如:<|>& 等。缺点:不支持管道,无法批量执行命令。

示例:检查 Ansible 节点的内核版本。

[root@k8s-master ~]# ansible k8s-node -a 'uname -r'
192.168.86.132 | CHANGED | rc=0 >>
3.10.0-1062.el7.x86_64
192.168.86.133 | CHANGED | rc=0 >>
3.10.0-1062.el7.x86_64
#提示:不指定 hosts 文件,默认使用/etc/ansible/hosts

shell 模块

#在远程命令通过/bin/sh 执行,支持各种命令
[root@k8s-master ~]# ansible k8s-node -m shell -a "free -m"
#提示:
#-a:是指定模块需要执行的命令
#-m:指定模块名
192.168.86.133 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:           1819         190        1391           9         237        1479
Swap:          2047           0        2047
192.168.86.132 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:           1819         194        1366           9         258        1473
Swap:          2047           0        2047

scripts 模块

使用 scripts 模块可以在本地写一个脚本,在远程服务器上执行。

示例:

[root@k8s-master ansible]# cat /etc/ansible/init.sh 
#!/bin/bash
date
hostname

#执行
[root@k8s-master ansible]# ansible k8s-node -m script -a "/etc/ansible/init.sh"
192.168.86.133 | CHANGED => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 192.168.86.133 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to 192.168.86.133 closed."
    ], 
    "stdout": "Sun Apr 26 23:50:48 EDT 2022\r\nnode2\r\n", 
    "stdout_lines": [
        "Sun Apr 26 23:50:48 EDT 2022", 
        "node2"
    ]
}
192.168.86.132 | CHANGED => {
    .....
}

copy 模块

功能:实现主控制端向目标主机拷贝文件,类似 scp 功能。

例如:将 Ansible 主机上的 /etc/hosts 文件复制到主机组中的 /tmp 目录下。

[root@k8s-master ~]# ansible k8s-node -m copy -a "src=/etc/hosts dest=/tmp owner=root group=root mode=0755"
192.168.86.133 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa", 
    "dest": "/tmp/hosts", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "54fb6627dbaa37721048e4549db3224d", 
    "mode": "0755", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 158, 
    "src": "/root/.ansible/tmp/ansible-tmp-1590378818.52-2470-232195177895701/source", 
    "state": "file", 
    "uid": 0
}

#参数解释:
src: 指定源文件
dest: 指定目标文件
owner: 所属主
group: 所属组
mode: 权限

#查看效果
[root@node1 ~]# cd /tmp/
[root@node1 tmp]# ls -l
total 4
-rwxr-xr-x. 1 root root 158 Apr 26 23:53 hosts

yum 模块

yum 模块可以提供的 status 状态:latest、present、installed,更多信息使用 ansible-doc 查看帮助。

例子:安装 httpd。

[root@k8s-master ~]# ansible k8s-node -m yum -a "name=httpd state=latest"
#提示:name=包名

移除
 tasks:
    - name: install  httpd Packages
      yum: name=httpd state=removed

yum_repository 添加仓库模块

[root@game project]# cat task_2.yml 
- hosts: all
  tasks:

    - name: Add Nginx Repo
      yum_repository:
        name:
          CentOS-nginx
        description:
          EPEL Nginx repo
        baseurl:
          http://nginx.org/packages/centos/7/$basearch/
        gpgcheck:
          no
        enabled:
          yes
#更多参数可参考 ansible-doc yum_repository

service 模块

远程主机系统服务管理

service 常用参数:

  • name 参数:用户指定需要操作的服务名称,如:nginx
  • state 参数:指定服务的状态,启动服务为 started,停止位 stopped,重启为 restarted
  • enabled 参数:设置为开启启动,yes 为开机启动,no 不开机启动

例子:重启 httpd 服务。

[root@k8s-master ~]# ansible k8s-node -m service -a "name=httpd state=restarted"

user 用户模块

例如:添加用户
[root@k8s-master ~]# ansible k8s-node -m user -a "name=user1 state=present"

#提示:更多命令查看帮助 ansible-doc user

cron 定时任务模块

设定定时任务:远程主机 crontab 配置。

例子:增加每 30 分钟执行 ls /tmp

[root@k8s-master ~]# ansible k8s-node -m cron -a "name=list minute=*/30 job='ls tmp'"
192.168.86.133 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "list"
    ]
}
192.168.86.132 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "list"
    ]
}
查看效果
[root@node1 ~]# crontab  -l
#Ansible: list
*/30 * * * * ls tmp

setup 模块

setup 模块主要用于收集远程主机的基本信息,可以作为变量来获取。

相关参数:

ansible_all_ipv4_addresses # ipv4 的所有地址
ansible_all_ipv6_addresses # ipv6 的所有地址
ansible_date_time # 获取到控制节点时间
ansible_default_ipv4 # 默认的 ipv4 地址
ansible_distribution # 系统
ansible_distribution_major_version # 系统的大版本
ansible_distribution_version # 系统的版本号
ansible_domain #系统所在的域
ansible_env #系统的环境变量
ansible_hostname #系统的主机名
ansible_fqdn #系统的全名
ansible_machine #系统的架构
ansible_memory_mb #系统的内存信息
ansible_os_family # 系统的家族
ansible_pkg_mgr # 系统的包管理工具
ansible_processor_cores #系统的 cpu 的核数(每颗)
ansible_processor_count #系统 cpu 的颗数
ansible_processor_vcpus #系统 cpu 的总个数=cpu 的颗数*CPU 的核数
ansible_python # 系统上的 python
ansible cache -m setup -a 'filter=*processor*' # 用来搜索

Ansible-Playbook 介绍和使用

Playbook 简单介绍

Playbook 翻译过来就是剧本,以 yml/yaml 为后缀结尾的一个文本文件。

Playbook 组成:分为两部分 play(定义主机的角色)和 task(具体执行什么任务)。

  • play(找谁)如 - hosts: update()
  • tasks(干什么)如:安装软件包括文件

Playbook 命令帮助:

[root@k8s-master ~]# man ansible-playbook
[root@k8s-master ~]# ansible-playbook -h
#语法格式:ansible-playbook [option] playbook.yml  [playbook2 ….]

常用参数:

-C, --check        #检查,运行但是不做任何的操作
-f FORKS, --forks=FORKS    #用来做并发
--list-hosts    #列出主机列表
--syntax-check    #进行语法检查

Playbook 书写格式:

你可能感兴趣的:(全栈开发:自动化工具 Ansible 基础及进阶使用)