欢迎访问我的博客,你的支持,是我最大的动力!

Ansible使用指南-01-基础/Ad-Hoc

Ansible 小马奔腾 751℃ 评论
目录:
[显示]

Ansible基础

ansible 是一款极其简单的IT自动化工具

ansible内置模块非常多,可使用 ansible-doc -l 查看
项目地址:https://github.com/ansible/ansible
模块查询:https://docs.ansible.com/ansible/latest/modules/modules_by_category.html
示例参考:https://github.com/stanleylst/ansibleUI

ansible 没有客户端,底层通信基于系统软件,linux下基于openssh,windows下基于powershell
管理端必须是linux,命令执行完毕后会自动删除产生的临时文件

使用者:
1、通过CMDB配置管理数据库直接下发指令调用ansible工具集完成操作
2、通过api接口被其他语言调用
3、直接使用Ad-Hoc临时命令集调用
4、执行playbooks中预先编排好的任务集

ansible无需任何daemon维护进程即可实现相互间通信,ansible无需在远程主机端安装任何额外进程

ansible ssh 工作机制

ansible执行命令时,通过底层传输连接模块,将一个或数个文件,或一个play或command命令传输到远程服务器/tmp目录的昨时文件,并在远程执行这些play或command,然后删除这些临时文件,同时回传整体命令执行结果

ansible 通信方式发展

1、Paramiko 是python的一个第三方库,性能较低
2、openssh 支持controlpersist (保持会话 避免每次都经过最初的握手过程)
3、加速模式 需要python-keyczar包
对Ad-Hoc命令不友好,对playbook效果明显,ssh初始化后,带着初始化连接信息通过端口5099执行命令传输文件
使用sudo时需要额外配置
1)/etc/sudoers文件需关闭requiretty功能,注释掉或者设置每个用户的默认值为 username !requiretty  #默认没有这项
2)禁用sudo的PASSWORD交互认证,NOPASSWD: ALL  加速模式已被废弃
4、Faster OpenSSH
需在/etc/ansible/ansible.cfg的[ssh_connection]区域开启pipelining=True
pipelining=True需结合sudo的requiretty配置方可生效,需保证requiretty为注释状态
加速模式官方推荐Pipelining方式

Ansible 安装

Ansible可以安装在python2.7 或python 3.5 的机器上
对目标机器的要求:python 环境,若启用了selinux 需要安装 libselinux-python

wget https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/p/python-keyczar-0.71c-2.el7.noarch.rpm
wget https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/a/ansible-2.7.5-1.el7.noarch.rpm
yum install python-keyczar-0.71c-2.el7.noarch.rpm
yum install ansible-2.7.5-1.el7.noarch.rpm
或者
pip install ansible
配置文件
/etc/ansible/ansible.cfg
/etc/ansible/hosts
/etc/ansible/roles/
验证
ansible --version

Ansible 基础元素

Ansible 目录结构

查看目录结构
rpm -ql ansible
配置文件目录:/etc/ansible/
执行文件目录:/usr/bin/
lib库依赖目录:/usr/lib/python2.7/site-packages/ansible

Ansible 配置文件

ansible.cfg配置文件可存于多个地方,读取配置文件顺序为:
当前目录 -> 家目录.ansible.cfg -> /etc/ansible.cfg 先找到哪个就使用哪个,配置的所有内容均可在命令行以参数形式传递或定义在playbook中

[defaults] 常规配置
[inventory]
[privilege_escalation] sudo用户提权
[paramiko_connection] 不常用
[ssh_connection] #pipelining = False
[persistent_connection]
[accelerate] 连接加速
[selinux]
[colors] 输出结果颜色
[diff]
默认无需任何修改即可使用,若调整,多为关闭首次连接提示 host_key_checking=False 提速调整 accelerate区域

Ansible 命令用法

先要对主机进行认证,方式有密码认证和公私钥认证两种方式,默认使用公私钥认证方式
设置免密登录
ssh-keygen #在本地生成key
ssh-copy-id username@192.168.1.123 #将认证文件上传到欲登录的主机和指定登录用户,该过程需要输入一次密码
ssh username@192.168.1.123 #验证

ansible 命令格式
ansible <host-pattern> [options]
<host-pattern> 必须,inventory中定义的主机、主机组、ip、可以使用.*:等特殊匹配型字符串
-m --module-name=Name 模块
-u --user=User 远程主机用户
-s --sudo
-U --sudo-user=User

ansible all -m ping -u test
ansible all -m ping -u test --sudo  以test登录sudo至root再执行ping 注意--sudo命令已废弃应该使用-b
ansible all -m ping -u test -b
ansible all -m ping -u test -b --become-user=root
# 设置目标机sudo免密码 visudo -> test ALL=(ALL) NOPASSWD: ALL

ansible-playbook playbook.yml  #使用playbook
ansible-playbook部分参数:
--ask-vault-pass 加密playbook时提示输入密码
-D,--diff 当更新文件数及内容较少时,显示这些文件的不同,结合-C效果较好
-e Extra_vars,--extra-vars=Extra_vars 在playbook中引入外部变量
--flush-cache 清除远程主机缓存
--force-handlers 强制运行handlers任务,即使任务失败的情况下
-i 指定要读取的inventory文件
--list-tags 列出所有tags
--list-tasks 列出所有即将被执行的任务
--skip-tags=Skip_tags 跳过指定的任务
--start-at-task=Task 某条任务开始执行
--step 逐步执行,每步都需人工确认
--syntax-check 检查语法
-t TAGS,--tags=TAGS 指定执行该tags的任务

Ansible系列命令
ansible

用于临时性操作、二次开发接口调用

# 检查服务器存活
ansible all -m ping -u test
# 复制本地文件到远程
## 复制nohup.out为fstab
ansible all -m copy -a "src=/root/nohup.out dest=/tmp/fstab owner=test group=test mode=644 backup=yes" -u test
## 保留文件名
ansible all -m copy -a "src=/root/nohup.out dest=/tmp/fstab owner=test group=test mode=644 backup=yes" -u test
## 使用sudo文件属主改为root
ansible all -m copy -a "src=/root/nohup.out dest=/tmp owner=root group=root mode=644 backup=yes" -u test -b

红色:出现异常,中止任务
橘黄色:正常执行,目标有状态变化
绿色:正常执行,目标没有状态变化

ansible-galaxy

查找和安装Roles,还可以下传和下载Roles,https://galaxy.ansible.com

命令格式:
ansible-galaxy [init|info|install|list|remove] [--help] [options] ...
说明:
init 初始化本地Roles配置 以备上传Roles至galaxy
info 列表指定Role的详细信息
install 下载关安装
list 列出本地已下载的Roles
remove 删除本地的Roles

ansible-galaxy install geerlingguy.pip  #安装geerlingguy.pip
# Roles默认下载到/root/.ansible/roles/geerlingguy.pip  也可放到/etc/ansible/roles/
使用方法:

ansible-pull

ansible pull 模式(默认使用push模式)
适用于机器数量巨大,即便使用高并发线程依旧要花费很多时间;在刚启动的没有网络连接的主机上运行ansible

命令格式:
ansible-pull [options] [playbook.yml]
#ansible-pull结合git和crontab使用
#通过crontab定期拉取指定的git版本到本地 并以指定模式自动运行预先制订好的指令
*/20 * * * * root /usr/local/bin/ansible-pull -o -C 2.1.0 -d /srv/www/king-gw/ -i /etc/ansible/hosts -U git://git.kingifa.com/king-gw-ansiblepull >> /var/log/ansible-pull.log 2>&1

ansible-doc

ansible模块文档说明,对每个模块都有详细的用法说明及应用案例介绍

ansible-doc [options] [module...]
# 列出所有模块
ansible-doc -l
# 查看模块说明
ansible-doc ping

ansible-playbook

通过读取预先编写的playbook文件实现批量管理

ansible-playbook playbook.yml

ansible-vault

配置文件加密,如加密编写的playbook文件

ansible-vault [create|decrypt|edit|encrypt|rekey|view] [--help] [options] file_name
# 使用密码(密码在命令执行时要求输入)加密a.yml文件
ansible-vault encrypt a.yml
# 解密文件
ansible-vault decrypt a.yml

ansible-console

交互式命令行界面
进入后显示提示符,如 root@all (2)[f:5]$
root@all (2)[f:5]$ 即 当前用户@当前所在主机组 (组中主机数量)[forks:线程数]$

# 切换主机或分组
cd 192.168.1.77
# 显示主机列表
list
# 修改线程数
forks 2
# 进入service模块
service #支持tab命令补全
service name=httpd state=started
# 查看帮助
help service
# 退出
exit
Ansible Inventory配置

Inventory是Ansible管理主机信息的配置文件,默认存放在/etc/ansible/hosts 使用时通过 -i 或 --inventory-file指定读取

ansible --inventory-file=/etc/ansible/hosts all -m ping -u test

主机定义:
192.168.1.1    #直接为ip
192.168.1.1:22  #指定端口
192.168.[10:20].1  #[10:20]表示10-20间所有数字,包含10和20
ww[a:c].a.com  #[a:c]表示a-c之前所有字母,包含a和c

组变量:
赋予指定组内所有主机在playbook中可用的变量,等同于逐一给该组下的所有主机赋予同一变量

[web]
192.168.1.78
[web:vars]
ntp_server=ntp.magedu.com  #定义web组中所有主机ntp_server值为ntp.magedu.com

组嵌套及组变量:
组可以嵌套,也可以向组中主机指定变量,这些变量只能在playbook中使用

[apache]
httpd1.magedu.com
httpd2.magedu.com
[nginx]
ngx.magedu.com
[webservers:children]
apache
nginx
[webservers:vars]
ntp_server=ntp.magedu.com

变量优先级(低->高):
1、Inventory配置文件中的定义
2、Playbook中vars中的定义
3、Roles中vars目录下的文件
4、Roles同级目录group_vas和hosts_vars目录下的文件

Ansible 与正则

Patterns功能,主要针对inventory的主机列表使用
ansible <pattern_goes_here> -m <module_name> -a <arguments>

# 重启httpd服务
ansible webservers -m service -a "name=httpd state=restarted"
ansible 192.168.1.77 -m service -a "name=nginx state=restarted" -u test -b
# 全量匹配
all和*功能相同,但*需要引起来
ansible all -m ping -u test
ansible "*" -m ping -u test
ansible 192.168.1.* -m ping -u test
# 逻辑或(or)匹配
使用:分隔,如 mysql:web 或 "mysql:web"
ansible mysql:web -m ping -u test
# 逻辑非(!)匹配
在mysql组但不在web组,注意需要使用单引号
ansible 'mysql:!web' -m ping -u test
# 逻辑与(&)匹配
在mysql组和web组中都存在的主机
ansible 'mysql:&web' -m ping -u test
# 多条件组合
ansible 'mysql:&web:!name' -m ping -u test
# 模糊匹配
使用* 表示0个或多个任意字符
# 域切割
ansible 'mysql[0]' -m ping -u test
ansible 'mysql[0:1]' -m ping -u test
ansible 'mysql[-1]' -m ping -u test
# 正则匹配
"~"开始表示正则匹配
ansible "~(beta|web|green)\.example\.(com|org)" -m ping
ansible ~192\.168\.[0-9]\{1}.[0-9]\{2} -m ping -u test  #匹配所有192.168开头,第三位为一位数,第四位为两位数的ip

Ansible Ad-Hoc 命令集

Ad-Hoc,即临时命令,ansible命令

/usr/bin/ansible命令格式:
ansible <host-pattern> [options]
常用选项:
-v,--verbose 输出更详细的执行过程,-vvv 可得到执行过程的所有信息
-i PATH,--inventory=PATH 指定主机列表,默认/etc/ansible/hosts
-f NUM,--forks=NUM 并发线程数,默认5
--private-key=KEY_FILE 指定密钥文件
-m NAME,--module-name=NAME 指定模块
-M DIR,--module-path=DIR 指定模块存放路径,默认/usr/share/ansible,也可通过ANSIBLE_LIBRARY设定默认路径
-a 'AGR',--args='ARG' 模块参数
-k,--ask-pass 认证密码
-K,--ask-sudo-pass 指定sudo使用的密码
-o,--one-line 标准输出至一行
-s,--sudo 使用sudo
-t DIR,--tree=DIR 输出信息至DIR目录下,结果文件以远程主机名命名
-T Sec,--timeout=Sec 超时时间,秒
-B NUM,--background=NUM 后台执行命令的最大时间,超时后中止正在执行的任务
-P NUM,--poll=NUM 定期返回后台任务进度
-u User,--user=User 指定远程主机以User用户运行命令
-U User,--sudo-user=User 使用sudo时的用户
-c Con,--connection=Con 指定连接方式,有paramiko(SSH),ssh,local 其中local常用于crontab和kickstarts
-l Subset,--limit=Subset 指定运行主机
-l ~Reg,--limit=~Reg 指定运行主机,正则
--list-hosts 列出符合条件的主机列表,不执行任何命令
-C,--check 不执行任何更改 查看可能的执行效果
--syntax-check 检查playbook语法 不执行
-b, --become
--become-user=User

常用命令:
# 查看主机名
ansible all -m command -a "hostname" -u test
# 列出主机列表
ansible mysql --list
# 运行一个命令 使用时间参数
ansible mysql -B 25 -P 2 -T 2 -m command -a "sleep 20" -u test
## -B 后台命令最长执行时间 -P 定期返回任务进度 -T 超时时间
# 查看磁盘容量
ansible mysql -a "df -lh" -u test   #使用-a时 可省略模块
# 查看内存使用情况
ansible mysql -a "free -m" -u test
ansible mysql -m shell -a "free -m" -u test

ansible的并发发性能
ansible mysql -m ping -u test -f 1
通过参数-f指定并发线程数,通常应设置为cpu核数的偶数倍

模块使用

# 显示所有可用模块
ansible-doc -l
# 获取模块说明
ansible-doc yum
# 使用yum安装软件
ansible mysql -m yum -a 'name=wget state=present' -u test
ansible mysql -m yum -a 'name=wget state=present' -u test -b  #以root权限安装
ansible mysql -s -m yum -a "name=ntp state=present" -u test   #其中-s 已废弃 应用-b
# 启动ntp服务并设置为开机启动
ansible mysql -b -m service -a "name=ntpd state=started enabled=yes" -u test
ansible mysql -b -m service -a "name=ntpd state=stopped enabled=no" -u test
## state的状态 reloaded, restarted, started, stopped

yum模块可指定安装某个特定版本,可为网络或本地
ansible mysql -m yum -a "name=http://xxx.org/aaa.rpm state=present"
ansible mysql -m yum -a "name=/root/aaa.rpm state=present"

Ad-Hoc 组管理和特定主机变更

对组中特定主机进行变更
1、通过 --limit限定主机
ansible mysql -m command -a"systemctl status ntpd" -u test --limit "192.168.1.77"
2、直接指定ip
ansible 192.168.1.77 -m command -a"systemctl status ntpd" -u test
# 指定多台主机
ansible 192.168.1.77:192.168.1.78 -m command -a"systemctl status ntpd" -u test
ansible "192.168.1.77:192.168.1.78" -m command -a"systemctl status ntpd" -u test
ansible 192.168.1.* -m command -a"systemctl status ntpd" -u test

Ad-Hoc 用户与组管理

ansible系统用户模块:user win_user(windows)
https://docs.ansible.com/ansible/latest/modules/user_module.html#user-module

1、新增用户
# 新增用户dba bash 附加组test,mysql 家目录/home/dba/
ansible mysql -m user -a "name=dba shell=/bin/bash groups=test,mysql append=yes home=/home/dba/ state=present" -u test -b
2、修改用户属组
# 修改dba附加组为mysql,即删除附加组test
ansible mysql -m user -a "name=dba groups=mysql append=no" -u test -b
# 验证 groups dba 或 id dba
3、修改用户属性
# 设置dba用户过期时间
ansible mysql -m user -a "name=dba expires=1544517379" -u test -b
# 验证 chage -l dba
4、变更用户密码
# 使用mkpasswd生成密码
# mkpasswd 用于随机生成密码
yum whatprovides */mkpasswd  #查找软件包
yum install expect
# 使用python的passlib、getpass库生成密码
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
pip install passlib
## sha512密码
python -c "from passlib.hash import sha512_crypt;import getpass;print sha512_crypt.encrypt(getpass.getpass())"
## 普通密码
python -c "import crypt;print (crypt.crypt('redhat123','dba'))"
## Ad-Hoc建议使用普通密码,sha加密后的密码包括很多特殊字符,传输中有被转义截断的问题,sha512建议在playbook中使用
ansible mysql -m user -a "name=dba password=dbVOiGE2YH3m2 update_password=always" -u test -b
5、删除用户
# 删除用户dba 并删除其家目录和邮件列表
ansible mysql -m user -a "name=dba state=absent remove=yes" -u test -b

windows新增用户stanley 密码magedu@123 属组Administartors
ansible windows -m win_user -a "name=stanley passwd=magedu@123 group=Administrators"

应用层用户管理

支持OpenStack / MongoDB / MySQL / PostgreSQL / RabbitMQ 等系统的用户管理

mysql_user 模块
https://docs.ansible.com/ansible/latest/modules/mysql_user_module.html#mysql-user-module

# 新增MySQL用户stanley 密码123456 对test.*有ALL权限
#ansible mysql -m command -a "pip install MySQL-python" -u test -b
# 注意 使用rpm包安装MySQL-python 用pip安装需要mysql_config等依赖条件
## wget http://mirror.centos.org/centos/7/os/x86_64/Packages/MySQL-python-1.2.5-1.el7.x86_64.rpm
## rpm -ivh MySQL-python-1.2.5-1.el7.x86_64.rpm
ansible mysql -m mysql_user -a "login_host=localhost login_user=root login_password=rootpasswd name=stanley password=123456 priv=text.*:ALL state=present" -u test -b  #使用socket连接mysql默认为/var/lib/mysql/mysql.sock
ansible mysql -m mysql_user -a "login_host=127.0.0.1 login_user=root login_password=rootpasswd name=stanley password=123456 priv=text.*:ALL state=present" -u test -b  #使用网络模式
注意,创建出来的用户是 stanley@localhost
# 删除用户
ansible mysql -m mysql_user -a "login_host=127.0.0.1 login_user=root login_password=rootpasswd name=stanley state=absent" -u test -b

 

转载请注明:轻风博客 » Ansible使用指南-01-基础/Ad-Hoc

喜欢 (1)or分享 (0)