Ansible管理工具

什么是Ansible?

ansible是轻量级自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能 ansible基于ssh来和远程主机通讯的,所以不需要在远程主机上安装client/agents

Ansible特点:

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

Ansible基本架构
Ansible:Ansible核心程序
Host Inventory:记录由Ansible管理的主机信息(默认是在Ansible的hosts配置文件中定义被管理主机),包括端口、密码、ip等
Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能
Core Modules:核心模块,主要操作是通过调用核心模块来完成管理任务
Custom Modules:自定义模块,完成核心模块无法完成的功能,支持多种语言
Connection Plugins:连接插件,Ansible和Host通信使用

TOC

一、安装配置ansible

注意:ansible版本和python版本的兼容性
配置文件目录:/etc/ansible
执行文件目录:/usr/bin
Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible
Help文档目录:/usr/share/doc/ansible-X.X.X
Man文档目录:/usr/share/man/man1
1.安装依赖包和ansible

CentOS安装

yum -y install epel-release
yum -y install ansible

Ubuntu安装

apt -y install ansible

我们可以通过ansible --version命令查看版本和配置文件路径,默认都是/etc/ansible路径下

root@test:~# ansible --version
ansible 2.10.8
  config file = /etc/ansible/ansible.cfg                                    
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.10.6 (main, Mar 10 2023, 10:55:28) [GCC 11.3.0]

ubuntu安装可能存在默认没有配置文件需要我们手动下载

wget https://raw.githubusercontent.com/ansible/ansible/stable-2.9/examples/ansible.cfg -O /ect/ansible/ansible.cfg

我们需要修改一下配置项

vim /etc/ansible/ansible.cfg
------------------------------
[default]
inventory = /etc/ansible/hosts
host_key_checking = False
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False

2.配置主机清单:

vim /etc/hosts
-------------------
[webserver]
192.168.31.101
192.168.31.102 ansible_ssh_port=1022 ansible_user=root
[dbserver]
192.168.31.103

3.配置无密码登陆

ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa root@192.168.31.101
ssh-copy-id -i /root/.ssh/id_rsa root@192.168.31.102
ssh-copy-id -i /root/.ssh/id_rsa root@192.168.31.103

二、Ansible命令使用

ansible常用模块命令格式

基础命令选项
-h:来查看帮助,下面我们列出一些比较常用的选项,并解释其含义:
-a:MODULE_ARGS#模块的参数,如果执行默认COMMAND的模块,即是命令参数,如: “date”,“pwd”等等
-k:–ask-pass:#ask for SSH password,登录密码,提示输入SSH密码而不是假设基于密钥的验证
–ask-su-pass:#ask for su password,su切换密码
-K:–ask-sudo-pass#ask for sudo password,提示密码使用sudo,sudo表示提权操作
–ask-vault-pass#ask for vault password,假设我们设定了加密的密码,则用该选项进行访问
-B:SECONDS#后台运行超时时间
-C:#模拟运行环境并进行预运行,可以进行查错测试
-c:CONNECTION#连接类型使用
-f:FORKS#并行任务数,默认为5
-i:INVENTORY#指定主机清单的路径,默认为/etc/ansible/hosts
–list-hosts:#查看有哪些主机组
-m:MODULE_NAME#执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数
-o:压缩输出,尝试将所有结果在一行输出,一般针对收集工具使用
-S:用su命令
-R:SU_USER#指定 su 的用户,默认为 root 用户
-s:用sudo命令
-U:SUDO_USER#指定 sudo 到哪个用户,默认为 root 用
-T:TIMEOUT#指定 ssh 默认超时时间,默认为10s,也可在配置文件中修改
-u:REMOTE_USER#远程用户,默认为 root 用户
-v:查看详细信息,同时支持-vvv,-vvvv可查看更详细信息
查看模块:ansible-doc -l
查看具体模块的信息:ansbile-doc -s command

ansible常用模块

注意:除了raw模块和script模块,其他模块都要依赖于目标服务器安装Python环境,否则无法正常使用!!!

1.command模块

用于在被管理主机上运行命令

ansible webserver -m command -a 'date'

2.cron模块

用于在被管理主机上管理计划任务
persent:添加
absent:移除,其使用的语法跟我们的crontab文件中的语法一致,同时,可以指定以下选项:
day:日应该运行的工作( 1-31, , /2, )
hour:小时 ( 0-23, , /2, )
minute:分钟( 0-59, , /2, )
month:月( 1-12, *, /2, )
weekday:周 ( 0-6 for Sunday-Saturday, )
job:指明运行的命令是什么
name:定时任务描述

ansible dbserver -m cron -a 'name="host reboot" minute="30" hour="22" job="/usr/sbin/reboot"' 

3.user模块

用于创建用户

ansible all -m user -a 'name="test"'

4.group模块

用于创建组

ansible all -m group -a 'name=test'

5.copy模块

用于复制本地文件到管理的服务器

ansible all -m copy -a 'src=/etc/fstab dest=/home/fstab.test owner=root  mode=744'

6.file模块

用于修改文件属性

ansible all -m file -a 'owner=test group=test mode=644 path=/home/fstab.test'

7.ping模块

用于ping测试

ansible all -m ping

8.service模块

用于设置修改服务状态

ansible webserver -m service -a 'enabled=true name=httpd state=started'

9.shell模块

shell模块可以在远程主机上调用shell解释器运行命令

ansible dbserver -m shell -a 'echo 123456 | passwd --stdin zhangsan'

10.script模块

用于将本地脚本复制到被管理主机进行运行

ansible webserver -m script -a '/root/ping.sh'

11.yum模块

用于yum安装软件

ansible webserver -m yum -a 'name=httpd state=present'

12.setupt模块

该模块主要用于收集信息,是通过调用facts组件来实现的
比如查看内存:

ansible webserver -m setup -a 'filter="*mem*"'

13.fetch 模块

该模块用于从远程某主机获取(复制)文件到本地

ansible webserver -m fetch -a 'src=/data/hello dest=/data'

三、playbook的使用

playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活,主要可以用来多机部署,你可以把它理解成一种脚本,可以一次性运行一系列操作

playbook格式

playbook采用的是yaml语言
语法说明

  • YAML 的配置文件后缀为.yml
  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • #表示注释,从这个字符一直到行尾,都会被解析器忽略

核心元素
hosts:指定要执行指定任务的主机
remote_user:指定执行任务的时候使用的用户
tasks:任务集,一个脚本文件有一个或者多个task,所有主机完成一个task后,再开始下一个task
variables:内置变量或自定义变量,用于playbook中调用
templates:模板
handlers和notify
handlers和notify配合使用,由特定条件触发的操作,满足条件则执行,否则不执行
tags:标签
例如:指定服务器yum安装nginx
shell脚本:

#!/bin/bash
yum -y install openssl openssl-devel pcre-devel curl-devel freetype-devel
yum -y install nginx
cp /tmp/nginx.conf /etc/nginx/
mkdir -p /var/www/html
cp /tmp/index.conf /var/www/html/
systemctl start nginx && systemctl enable nginx

playbook脚本:

---
- hosts: web_server
  remote_user: root
  tasks:
    - name: "安装依赖包"
      shell: yum -y install openssl openssl-devel pcre-devel curl-devel freetype-devel
    - name: "yum install nginx"
      yum:
         name: nginx
    - name: "复制配置文件"
      copy:
         src: /tmp/nginx.conf
         dest: /etc/nginx/
    - name: "创建网页存放目录"
      file:
         dest: /var/www/html
         state: directory
    - name: "复制网页文件"
      copy: src=/tmp/index.html dest=/var/www/html/
    - name: "启动nginx,并设置开机启动"
      service: name=nginx state=started enable=yes

playbook安装实例

1.使用playbook远程安装httpd

vim installhttpd.yaml
--------------------------------
---
- hosts: webserver
  remote_user: root
  tasks:
    - name: install Apache
      yum:
        name: httpd
        state: installed
    - lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: '^Listen '
        line: 'Listen 8080'
    - replace:
        path: /etc/httpd/conf/httpd.conf
        regexp: '^#(ServerName).*'
        replace: '\1 localhost'
    - service:
        name: httpd
        enabled: yes
        state: restarted
    - name: Create wwwroot directory
      file:
        dest: /var/www/html
        state: directory
    - copy:
        src: /root/index.html
        dest: /var/www/html/index.html

运行playbook直接远程管理安装

ansible-playbook installhttpd.yaml

2.使用playbook远程安装nginx

vim installnginx.yaml
----------------------------
---
  tasks:
  - name: add repo
    yum_repository:
      name: nginx
      description: nginx repo
      baseurl: http://nginx.org/packages/centos/7/$basearch/
      gpgcheck: no
      enabled: 1
  - name: install centos plungins
    shell: yum -y install zlib zlib-devel openssl openssl-devel pcre-devel wget gcc gcc++ autoconf automake
  - name: Install nginx
    yum:
      name: nginx
      state: installed
  - name: Copy nginx configuration file
    copy:
      src: /root/nginx.conf
      dest: /etc/nginx/nginx.conf
  - name: Create wwwroot directory
    file:
      dest: /var/www/nginx
      state: directory
  - name: Create test page index.html
    shell: echo "<h1>Congratulations on the successful installation of Nginx!!!</h1>" > /var/www/nginx/index.html
  - name: Start nginx
    service:
      name: nginx
      state: started

运行playbook直接远程管理安装

ansible-playbook installnginx.yaml