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

Ansible使用指南-05-插件扩展/应用实战

Ansible 马从东 73℃ 评论
目录:
[显示]

Ansible 插件扩展

插件使用场景:
使用新的通信方式与远程主机交互、新的遍历方式、新的变量定义方式、新的过滤器、强化标准输出结果、增加日志记录方式(MySQL、Redis、MongoDB数据库)、邮件发送等

插件类型

https://github.com/ansible/ansible/tree/devel/lib/ansible/plugins

connection 类型
通信连接,用于和远程主机通信,默认提供 paramiko、native ssh、local、winrm等
默认是 smart 自动判断
ansible all -m ping --connection=ssh -u test
新的 connection 插件放到 ansible.cfg 指定的同级目录下即可生效

lookup 类型
循环体功能类型,实现如 with_items、with_fileglob 等遍历功能
新的 connection 插件放到 ansible.cfg 指定的同级目录下即可生效

vars 类型
变量类型,通过 host_vars、group_vars 产生,vars 类型的插件绝大多数时候用不到

filter 类型
Jinja2 模板引擎的 filter,to_yaml、to_json

callback 类型
允许程序捕获响应的事件,并进行一些自定义响应,如插入日志到数据库、发送邮件等
log_plays 捕获playbook事件日志写入文件,并在playbook执行完毕时发送邮件给相关人员
syslog_json 将日志以 json 格式输出
支持通过命名的方式按顺序执行插件 1_first.py z_last.py等

系统插件目录:/lib/python2.7/site-packages/ansible/plugins
ansible.cfg 中可以定义插件目录 默认为:/usr/share/ansible/plugins
编写插件时 从github下载对应类型的模板到对应目录修改即可

企业应用实战

为新系统添加安全认证 SSHKey

ansible 密码认证
密码在 inventory 中是明文配置的,基于安全性,建议使用 sshkey 认证方式

# /etc/ansible/host
[db]
192.168.1.110
192.168.1.120

[db:vars]
ansible_ssh_user="dong"
ansible_ssh_pass="dongdong"

ansible db -m command -a 'whoami'

# 复制本机公钥 .ssh/id_rsa.pub 到远程主机 ~/.ssh/authorized_keys文件中
# 注意 .ssh目录权限必须是700 authorized_keys权限必须是600 否则不能免密登录
ansible db -m authorized_key -a "user=dong key='{{ lookup('file','/root/.ssh/id_rsa.pub') }}' path=/home/dong/.ssh/authorized_keys manage_dir=no"
authorized_key模块会把本地的公钥追加到目标主机 authorized_keys文件中 但使用该命令创建的.ssh目录权限不是700 是775 需要修改

ssh-copy-id
复制指定用户的公钥至远程服务器,同时修改~/.ssh 目录权限
ssh-copy-id -i ~/.ssh/id_rsa.pub test@192.168.1.110

kickstart
可在kickstart中注入公钥,实现自动登录

/bin/cat <<EOF > /root/.ssh/authorized_keys
ssh-rsa AA.......
EOF
/bin/chmod 700 /root/.ssh
/bin/chmod 600 /root/.ssh/authorized_keys

Python Paramiko
支持以加密和认证的方式进行远程服务器的连接,可进行SSH连接,SFTP传输文件

https://github.com/paramiko/paramiko/

Expect
自动化控制和测试软件,利用伪终端包装子进程,允许任意程序通过终端接入进行自动化控制

expect expect.sh 192.168.1.110 test 123456 /sbin/ifconfig
使用时,因为环境变量没有加载所以执行命令需添加绝对路径

基于Windows的管理架构

windows下的"ssh"工具:powershell
PowerShell支持SSH

管理机必须为linux且需安装 Python Winrm模块
底层通信认证基于 Kerberos ,windows使用的连接工具为PowerShell
远程主机 PowerShell 版本3.0+ ,Management Framework版本 3.0+

pip install "pywinrm>=0.1.1"

Ansible 安全优化

避免攻击的措施:
使用安全加密的通信方式
禁止root用户远程登录并充分利用sudo
移除非必需软件 只开放需要用到的端口
遵守权限最小化原则
及时更新操作系统和软件
使用合理配置过的 有针对性的防火墙
确保日志文件被及时迁移、存放和切割
监测系统登录情况 封掉可疑IP地址
正确使用SELinux和AppArmor

SSH强化:
PasswordAuthentication no    禁止使用密码认证连接
PermitRootLogin no 禁止root用户远程登录 以普通用户登录  sudo 或 su 切换用户
AllowUsers
DenyUsers 明确指定允许或禁止的远程登录用户
Port 使用非默认端口

Mosh(Mobile Shell)是SSH的替代品,在高延迟网络环境下,比SSH流畅得多

在任务中需要root权限时,可添加sudo: yes 如

name: restart apache
serivce: name=httpd state=restarted
sudo: yes
sudo_user: root

修改sudoers文件时,一定要检查好语法,防止出错
可以使用 lineinfile 直接修改,另一种方法是使用copy模块配合validate将配置文件复制到远程主机

yum-cron 进行软件包更新管理 systemctl start yum-cron

防火墙管理

sudo firewall-cmd --zone=external --list-all

Ansible 模块编写

ansible.module_utils.basic 编写的模块只能在agent机器上面运行

模块编写流程:
1、为模块取名,并放入模块目录,如 /usrshare/ansible/
2、导入ansible基础模块 from ansible.module_utils.basic import *
3、为模块初始化参数 module = AsibleModule(argument_spec=dict())
4、执行shell命令
5、为结果提供信息
6、退出模块,并返回信息 module.exit_json(**result)

变量类型:
必填项: name=dict(required=True)
默认值:default=dict(default='present')
选择项:choices=dict(default='present',choices=['present','absent'])
布尔值:bools=dict(type='bool')
字符型:str=dict(type='str')
任选变量:namel=dict(aliases=['name2','name3'])

result=dict(echo=args,changed=True)

模块退出状态处理
正常退出:module.exit_json
错误退出:module.fail_json(msg="error message")
module.fail_json会导致整个playbook停止工作

Ansible模块API调用
1、导入Ansible 2.0 中必要的模块
2、定义要使用的命名空间,传入变量等
3、编写执行的命令
4、把上一步的命令放入执行队列中执行

 

转载请注明:轻风博客 » Ansible使用指南-05-插件扩展/应用实战

喜欢 (0)or分享 (0)