ansible使用

ansible简介

什么是ansible

  • ansible是2013年推出的一款IT自动化和DevOps软件,2015年被RedHat收购。是基于Python研发,糅合很多老运维工具的优点,实现了批量操作系统配置,批量程序部署,批量运行命令等功能

ansible可以实现:

  • 自动化部署APP
  • 自动化管理配置项
  • 自动化持续交付
  • 自动化(AWS)云服务管理

为什么选择ansible
选择一款配置管理软件,无外乎从以下几点来权衡利弊

  • 活跃度(社区)
  • 学习成本
  • 使用成本
  • 编码语言
  • 性能
  • 使用是否广泛

ansible优点

  • 只需要SSH和Python即可使用
  • 无客户端
  • ansible功能强大,模块丰富
  • 上手容易,门槛低
  • 基于Python开发,做二次开发更容易
  • 使用公司比较多,社区活跃

ansible特性

  • 模块化设计,调用特定的模块完成特定任务
  • 基于Python语言实现
  • paramiko
  • PyYAML (半结构化语言)
  • Jinja2
  • 其模块支持JSON等标准输出格式,可以采用任何编程语言重写
  • 部署简单
  • 主从模式工作
  • 支持自定义模块
  • 支持playbook
  • 易于使用
  • 支持多层部署
  • 支持异构IT环境

ansible安装

软件依赖关系

对管理主机

  • 要求Python 2.6 或Python 2.7

ansible 使用以下模块,都需要安装

  • paramiko
  • PyYAML
  • Jinja2
  • httplib2
  • six

对于被托管主机

  • ansible默认通过SSH协议管理机器
  • 被管理主机要开启ssh服务,允许ansible主机登录
  • 在托管节点上也需要安装Python2.5或以上的版本
  • 如果托管节点上开启了SElinux,需要安装libselinux-python

启动6台虚拟机
2cpu,1.5G 以上内存,10G 以上硬盘,1块网卡

主机名 Ip地址 角色
ansible 192.168.1.40 管理主机
web1 192.168.1.41 托管主机
web2 192.168.1.42 托管主机
db1 192.168.1.43 托管主机
db2 192.168.1.44 托管主机
cache 192.168.1.45 托管主机

ad-hoc主机管理

主机定义与分组

安装ansible之后可以做一些简单的任务
ansible配置文件查找顺序

  • 首先检测ANSIBLE_CONFIG变量定义的配置文件
  • 其次检查当前目录下的 ./ansible.cfg 文件
  • 再次检查当前用户家目录下 ~/ansible.cfg 文件
  • 最后检查/etc/ansible/ansible.cfg文件
  • /etc/ansible/ansible.cfg是ansible的默认配置文件路径

ansible.cfg 配置文件

  • inventory 定义托管主机地址配置文件路径名
  • inventory 指定的配置文件,写入远程主机的地址。

格式

  • # 表示注释
    [组名称]
    主机名称或ip地址,其他参数

ansible.cfg 配置文件

  • ssh 主机 key 验证配置参数
  • host_key_checking = False
  • 如果为 False,不需要输入 yes
  • 如果为 True,等待输入 yes

(1)修改配置文件

[root@ansible ~]# vim /etc/ansible/ansible.cfg 
...	...
inventory      = /etc/ansible/hosts
...	...
host_key_checking = False
...	...

[root@ansible ~]# vim /etc/ansible/hosts

...	...
[web]
web1
web2

[db]
db[1:2]

[other]
cache

(2)配置本机的域名解析

[root@ansible ~]# vim /etc/hosts
...	...
192.168.1.40 ansible
192.168.1.41 web1
192.168.1.42 web2
192.168.1.43 db1
192.168.1.44 db2
192.168.1.45 cache

ansible 主机集合 -m 模块名称 -a 模块参数

  • 主机集合 主机名或分组名,多个使用"逗号"分隔
  • -m 模块名称,默认 command 模块
  • -a

or --args 模块参数
其他参数

  • -i inventory文件路径,或可执行脚本
  • -k 使用交互式登录密码
  • -e 定义变量
  • -v 显示详细信息

列出要执行的主机

  • ansible all --list-hosts

批量检测主机

  • ansible all -m ping -k

(3)列出要执行的主机

[root@ansible ~]# ansible web --list-hosts
  hosts (2):
    web1
    web2
[root@ansible ~]# ansible web,cache --list-hosts
  hosts (3):
    web1
    web2
    cache
[root@ansible ~]# ansible all --list-hosts
  hosts (5):
    web1
    web2
    cache
    db1
    db2

(4)交互式ssh所有主机,需要输入密码

[root@ansible ~]# ansible all -m ping -k

(5)配置公钥,可以远程无密码登录

  1. 创建一对密钥
[root@ansible ~]# cd /root/.ssh
[root@ansible ~]# ssh-keygen -t rsa -b 2048 -N '' -f key
  1. 给所有主机部署密钥
[root@ansible ~]# ssh-copy-id -i key.pub web1/web2/db1/db2/cache
  1. 无密码检测ssh
[root@ansible ~]# ansible all -m ping

(6)统计所有主机的负载

[root@ansible ~]# ansible all -m command -a 'uptime'

inventory 扩展参数
inventory 参数说明

  • ansible_ssh_port
  • ssh端口号:如果不是默认的端口号,通过此变量设置
  • ansible_ssh_user
  • 默认的ssh用户名
  • ansible_ssh_pass
  • ssh密码(这种方式并不安全,我们强烈建议使用–ask-pass或SSH密钥)
  • ansible_ssh_private_key_file
  • ssh使用的私钥文件,适用于有多个密钥,而你不想使用SSH代理的情况

vars 变量定义,用于组名后面
例如:

[all:vars]
ansible_ssh_private_key_file="/root/.ssh/key"

children 子组定义,用于引用其他组名称
例如:

[app:children]
web
db

分组定义、范围定义样例
子组定义

[app:children]
web
db

变量引用

[other]
cache ansible_ssh_port=222
[all:vars]
ansible_ssh_private_key_file="/root/.ssh/key"

(1)修改web1的默认ssh端口22为222

[root@web1 ~]# vim /etc/ssh/sshd_config

...	...
Port 222
...	...

[root@web1 ~]# systemctl restart sshd

(2)修改ansible执行的主机的端口

[root@ansible ~]# vim /etc/ansible/hosts 
...	...
[web]
web1 ansible_ssh_port=222
web2
...	...

(3)测试

[root@ansible ~]# ansible all -m ping

(5)统一修改ansible主机ssh远程时的秘钥文件

[root@ansible ~]# mv /root/.ssh/id_rsa /root/.ssh/id_rsa.ansible

...	...
[all:vars]    //定义所有主机都执行这个文件
ansible_ssh_private_key_file="/root/.ssh/id_rsa.ansible"
...	...

(6)测试

[root@ansible ~]# ansible all -m ping

子组定义

[app:children]
web
db

(8)测试

[root@ansible ~]# ansible app --list-hosts
  hosts (4):
    web1
    web2
    db1
    db2

自定义配置文件

[root@ansible ~]# mkdir myansible
[root@ansible ~]# cd myansible/
[root@ansible myansible]# vim ansible.cfg

[defaults]
inventory = myhost
host_key_checking = False


[root@ansible myansible]# vim myhost

[app1]
web1
db1
[app2]
web2
db2
[other]
cache

在当前文件夹下检测执行的主机,会报错,因为会先在当前文件夹下寻找ansible.cfg配置文件,如果找到,就执行该配置文件

[root@ansible myansible]# ansible web --list-hosts

 [WARNING]: Could not match supplied host pattern, ignoring: web

 [WARNING]: No hosts matched, nothing to do

  hosts (0):

检测app1,会列出myhost配置文件中的主机

[root@ansible myansible]# ansible app1 --list-hosts
  hosts (2):
    web1
    db1

动态主机

无限可能

  • ansible Inventory包含静态和动态的Inventory,静态
    Inventory指在文件/etc/ansible/hosts中指定的主机和组,
    动态Inventory指通过外部脚本获取主机列表,按照其要求
    格式返回给ansilbe命令

Json

  • JSON(JavaScript Object Notation,JavaScript对象表示
    法),一种基于文本独立于语言的轻量级数据交换格式

批量配置管理

模块

(1) ansible-doc和ping模块

  • ansible-doc
    模块的手册相当与shell的man,很重要

  • ansible-doc -l
    列出所有模块

  • ansible-doc modulename 查看帮助
    ping 模块

  • 测试网络连通性, ping模块没有参数

  • 注:测试ssh的连通性
    ansible host-pattern -m ping

(2) command模块
command模块

  • 默认模块,远程执行命令

  • 用法
    ansible host-pattern -m command -a '[args]'

  • 查看所有机器负载
    ansible all -m command -a 'uptime'

  • 查看日期和时间
    ansible all -m command -a 'date +%F_%T'

command模块注意事项

  • 该模块通过-a跟上要执行的命令可以直接执行,若命令里有如下字符则执行不成功
  • “<” , “>” , “|” , “&”
  • command 模块不能解析系统变量
  • 该模块不启动shell直接在ssh进程中执行,所有使用到shell的命令执行都会失败
  • 下列命令执行会失败
ansible all -m command -a 'ps aux|grep ssh'
ansible all -m command -a 'set'

(3) shell模块
shell

  • shell 模块用法基本和command一样,区别是shell模块是通过/bin/sh进行执行命令,可以执行任意命令
  • 不能执行交互式的命令,例如 vim top 等
  • 查看所有机器的负载
ansible all -m shell -a 'uptime'

执行以下命令查看结果,并说明原因

ansible web -m shell -a "echo ${HOSTNAME}"
ansible web -m shell -a 'echo ${HOSTNAME}'

testfile 文件在哪里

ansible cache -m shell -a 'cd /tmp'
ansible cache -m shell -a 'touch testfile'

问题解答
变量解析

  • ansible 执行命令是二次解析
  • 第一次在本机解析, 第二次在执行机器解析
  • 需要第二次解析的变量要转移()

文件在哪里

  • 文件在 用户家目录
  • ansible 是使用 ssh 多次连接执行
  • 连接退出以后之前的状态就全部失效了
  • 解决方法:使用 chdir 代替 cd 命令
    ansible cache -m shell -a 'chdir=/tmp touch testfile'
    或者
    ansible cache -m shell -a 'cd /tmp;touch testfile'

给web1,db2主机添加用户nb并设置登录密码为123

[root@ansible ~]# ansible web1,db2 -m shell -a 'useradd nb;echo 123 |passwd --stdin nb'

(4) script模块

  • 命令太复杂?
  • 在本地写脚本,然后使用script模块批量执行
    ansible t1 -m script -a 'urscript'
  • 注意:该脚本包含但不限于shell脚本,只要指定Sha-bang解释器的脚本都可运行

添加用户

  • 给所有 web 主机添加用户 wk
  • 要求 nb 用户与 wk 用户不能出现在同一台主机上
  • 设置 wk 用户的 密码是 456

创建执行脚本

[root@ansible ~]# vim ss.sh

#!/bin/bash
id nb
if [ !  $? -eq 0  ];then
   useradd wk
   echo 456 | passwd --stdin wk
fi

ansible远程批量执行脚本

[root@ansible ~]# ansible web -m script -a '/root/ss.sh'

(5) yum模块

  • 使用yum包管理器来管理软件包
  • name:要进行操作的软件包名字
  • state: 动作(installed, removed)
  • install === installed
  • remove === removed

给db组主机安装mariadb并设置开机自启

[root@ansible ~]# ansible db -m yum -a 'name="mariadb-server" state="installed"'
[root@ansible ~]# ansible db -m shell -a 'systemctl restart mariadb;systemctl enable mariadb'

cache上移除lrzsz

[root@ansible ~]# ansible cache -m yum -a 'state="removed" name="lrzsz"'

(6) service模块

  • name:必选项,服务名称
  • enabled:是否开机启动 yes|no
  • sleep:执行restarted,会在stop和start之间沉睡几秒钟
  • state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)

停止db组下的主机的mariadb服务并取消开机自启

[root@ansible ~]# ansible db -m service -a 'name="mariadb" enabled="no" state="stopped"'

关闭other组下的主机的sshd服务

[root@ansible ~]# ansible other -m service -a 'name=sshd enabled=no state=stopped'

(7) copy模块

  • 复制文件到远程主机
  • src:复制本地文件到远程主机,绝对路径和相对路径都可,路径为目录时会递归复制。若路径以"/“结尾,只复制目录里的内容,若不以”/"结尾,则复制包含目录在内的整个内容,类似于rsync
  • dest:必选项。远程主机的绝对路径,如果源文件是一个目录,那该路径必须是目录
  • backup:覆盖前先备份原文件,备份文件包含时间信息。有两个选项:yes|no
  • force:若目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,设为no,则只有当目标主机的目标位置不存在该文件时才复制。默认为yes

将本机的/etc/resolv.conf覆盖到所有主机的相同目录下

[root@ansible ~]# ansible all -m copy -a 'src="/etc/resolv.conf" dest="/etc/resolv.conf"'

同步yum文件

[root@ansible ~]# ansible all -m copy -a 'src=/etc/yum.repos.d/ dest=/etc/yum.repos.d/'

给所有db组下的主机开启binlog日志

在本机编写修改后的my.cnf

[root@ansible ~]# vim my.cnf
[mysqld]
log_bin=mysql-bin
binlog-format=mixed
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

批量覆盖到所有db组下的主机

[root@ansible ~]# ansible db -m copy -a 'src=/root/my.cnf dest=/etc/my.cnf'

(8) lineinfile模块

  • 类似sed的一种行编辑替换模块
  • path目标文件文件
  • regexp 正则表达式,要修改的行
  • line最终修改的结果
  • 例如修改 my.cnf,中 bin-log 的格式
  • mixed --> row

批量修改db组下的主机的binlog日志的模式为row

[root@ansible ~]# ansible db -m lineinfile -a '
> path="/etc/my.cnf"
> regexp="^binlog-format"
> line="binlog-format = row"'

(9) replace模块

  • 类似sed的一种行编辑替换模块
  • path 目的文件
  • regexp 正则表达式
  • replace 替换后的结果
  • 替换指定字符 row --> mixed

批量修改db组下的主机的binlog日志的模式为mixed

[root@ansible ~]# ansible db -m replace -a '
> path="/etc/my.cnf"
> regexp="= row$"
> replace="= mixed" '

(10) setup模块

  • 主要用于获取主机信息,playbooks里经常会用的另一个参数gather_facts与该模块相关,setup模块下经常用的是filter参数
  • filter过滤所需信息

获取cache主机的所有信息

[root@ansible ~]# ansible cache -m setup

过滤这些信息中的dns信息

[root@ansible ~]# ansible cache -m setup -a 'filter=ansible_dns'

你可能感兴趣的:(云计算,Linux云计算)