ansible自动部署

Ansible是一种IT自动化工具。它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部署,滚动更新。Ansible适用于管理企业IT基础设施,从具有少数主机的小规模到数千个实例的企业环境。Ansible也是一种简单的自动化语言,可以完美地描述IT应用程序基础结构。

1.简介

  1. Ansible可以同时管理Redhat系的Linux,Debian系的Linux,以及Windows主机。管理节点只在执行脚本时与远程主机连接,没有特别的同步机制,所以断电等异常一般不会影响ansbile。

  2. ansible 基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:

    • 连接插件connection plugins:负责和被监控端实现通信;
    • host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
    • 各种模块核心模块、command模块、自定义模块;
    • 借助于插件完成记录日志邮件等功能;
    • playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
  3. 示意图

    image-20230427145616259

2.安装与使用

  1. 环境

    服务主机名称IP地址
    服务端master192.168.2.3
    客户端node1192.168.2.4
    客户端node2192.168.2.5
  2. 服务端安装ansible

    1
    2
    3
    4
    5
    6
    7
    8
    9
    yum install -y epel-release
    yum install ansible -y

    //查看ansible的版本
    ansible --version

    yum install -y tree
    tree /etc/ansible/

  3. 配置公私钥

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
       ssh-keygen -t rsa

    将生成的公钥发给所有机器,包括自己
    ssh-copy-id root@192.168.2.3
    ssh-copy-id root@192.168.2.4
    ssh-copy-id root@192.168.2.5

    ---这样的话从3访问4和5就都不要输入密码了

    4. 配置hosts文件

    ```shell
    vim /etc/ansible/hosts

    [webserver]
    192.168.2.4
    192.168.2.5
  4. 主机连通测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ansible webserver -m ping

    [root@c1 ~]# ansible webserver -m ping
    192.168.2.4 | SUCCESS => {
    "changed": false,
    "ping": "pong"
    }
    192.168.2.4 | SUCCESS => {
    "changed": false,
    "ping": "pong"
    }

  5. 常用命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    ansible-doc -l  #查看支持的模块
    ansible-doc -s MODEL_NAME #查看模块用法
    ansible命令应用基础
    ansible <host-pattern> [options]
    -f fork:启动并发 线程数
    -m model_name:要使用的模块
    -a args:特有的参数

    ansible all -m ping #查看client端是否正常ping通
    ansible webserver -m setup #查看客户端信息
    ansible webserver -m copy -a 'src=/root/git_test/code.txt dest=/root/test' #copy文件到client端
    ansible webserver -m user -a "name=test state=present" #创建test用户
    ansible webserver -m user -a "name=test state=absent" #删除test用户
    ansible webserver -m yum -a 'name=epel-relese state=latest' #yum安装
    ansible webserver -m systemd -a 'name=httpd state=stopped enabled=no' #停止httpd服务
    ansible webserver -m script -a '/tmp/test,sh' #运行脚本
    ansible webserver -m command 'date' #查看时间

3. playbook

  • 执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作的时候,执行的ad-hoc命令是不合适的,这时候最好使用playbook。
  • 就像执行shell命令与写shell脚本一样,也可以理解为批处理任务,不过playbook有自己的语法格式
  • 使用playbook可以方便的重复使用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。在你使用Ansible的过程中,你也会发现,你所处理的大部分操作都是编写playbook。可以把常见的应用都编写playbook,之后管理服务器会变得很简单。

例如一个安装并运行nginx的任务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
---
- hosts: web
remote_user: root
tasks:

- name: install nginx ##安装模块,需要在被控主机里加上nginx的源
yum: name=nginx state=present
- name: copy nginx.conf ##复制nginx的配置文件过去,需要在本机的/tmp目录下编辑nginx.conf
copy: src=/tmp/nginx.conf dest=/etc/nginx/nginx.conf backup=yes
notify: reload #当nginx.conf发生改变时,通知给相应的handlers
tags: reloadnginx #打标签
- name: start nginx service #服务启动模块
service: name=nginx state=started
tags: startnginx #打标签

handlers:
- name: reload
service: name=nginx state=restarted

运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@ansible ansible]# ansible-playbook nginx.yml 

PLAY [web] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.2.3]

TASK [install nginx] ***********************************************************
changed: [192.168.2.3]

TASK [copy nginx.conf] *********************************************************
ok: [192.168.2.3]

TASK [start nginx service] *****************************************************
changed: [192.168.2.3]

PLAY RECAP *********************************************************************
192.168.2.3 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0


##查看被控主机上的nginx服务
[root@ansible ansible]# ansible web -m shell -a 'netstat -natp | grep nginx'
192.168.2.3 | CHANGED | rc=0 >>
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2720/nginx: master

以上只是一个简单的实现,使用ansible还能做更加复杂的事情。