Ansible常用运维技巧
Ansible简介
Ansible是基于Python开发的自动化运维工具,基于SSH协议通信,通过Jinja2实现模板功能,无需安装客户端,部署简单。
其工作场景主要是配置管理、批量管理服务器。
Ansible安装参考
官网:https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#latest-release-via-dnf-or-yum
ansible.cfg常用优化参数
[defaults]
callback_whitelist = profile_tasks
inventory = /data/ansible/dev # 指定当前环境的配置文件
pattern = *
forks = 20
poll_interval = 15
sudo_user = root
transport = smart
remote_port = 22
module_lang = C
gathering = smart # 优化速度
fact_caching_timeout = 30
roles_path = /data/ansible/roles # 指定当前环境的roles路径
host_key_checking = False # 首次访问也不需要输入yes
require_sudo = False
sudo_exe = sudo
timeout = 10
remote_user = root # 远程执行命令用户,视情况吧
module_name = shell # 修改默认模块为shell
ansible_managed = Ansible managed: {file} modified on %Y-%m-%d %H:%M:%S by {uid} on {host}
deprecation_warnings = False
打通key认证
主控端:
ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.170.133
测试成功:
ssh root@192.168.170.133
变量
1.变量来源
inventory中定义
playbook中定义
include文件和角色中定义变量
系统facts ansible hostname -m setup
local facts
2.变量使用
{{ ansible_eth0[“ipv4”][“address”] }} 或者 {{ ansible_eth0.ipv4.address }}. 复杂变量可以像字典或者熟悉一样访问.
3.内置变量
hostvars 可以让你调用其他host的变量和facts, 即使你没有在这个机器上执行过playbook, 你仍然可以访问变量, 但是不能访问facts. 例如: {{ hostvars[‘test.example.com’][‘ansible_distribution’] }}
group_names 当前host所在的group的组名列表. 包括其父组
groups 所有组包括组中的hosts
inventory_hostname 配置在inventory文件中当前机器的hostname
play_hosts 执行当前playbook的所有机器的列表
inventory_dir inventory文件的路径
inventory_file inventory文件的路径和文件名
role_path 当前role的路径
打印所有变量
---
- hosts: "your host or group"
tasks:
- debug: var=vars
4.变量优先级
roles/x/defaults/main.yml -> inventory file -> roles/x/vars/main.yml -> 调用role时的参数 -> role play 中的变量 -> 执行命令-e 传入的变量.
playbook示例
- hosts: tt ##主机组名称,一般在/etc/ansible/hosts 里面定义
remote_user: root ##以root身份执行
serial: 0 ## 并发数
tasks: ##任务列表和行为
- name: ensure apache is the latest version ##打印
yum: state=latest name=httpd #使用yum模块安装
- name: apache configure file ##打印
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf force=yes #使用copy模块
notify: ##通知,最后被触发,调用handlers模块的restart httpd列表,一般用于修改配置之后重启服务
- restart httpd
handlers: ##是tasks列表,与tasks没啥区别
- name: restart httpd
service: name=httpd state=restarted
常用技巧
- 执行指定tag:ansible-playbook site-role.yml --tags=“start”
- 跳过指定tag:ansible-playbook example.yml --skip-tags “start”
- 列出所有task(-e表示命令行传参):ansible-playbook --list-tasks site-role.yml -e “rolename=cronolog”
- 循环with_items,调用其中的元素使用{{ item }}
with_items:
- git
- ntpdate
- … … - 使用or需要(): when: ("{{ name }}" == “apps-manager-service”) or ("{{ name }}" == “base-feed-service”)
- 配置文件可以通过template统一管理多环境配置信息,结合环境inventory和group_vars下的环境变量文件
优化加速
1.计时插件“ansible-profile”
cd /etc/ansible
mkdir callback_plugins
cd callback_plugins
wget https://raw.githubusercontent.com/jlafon/ansible-profile/master/callback_plugins/profile_tasks.py
ansible.cfg
[defaults]
callback_whitelist = profile_tasks
2.开启ControlPersist
vim ~/.ssh/config
Host *
Compression yes
ServerAliveInterval 60
ServerAliveCountMax 5
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 1h