Ansible Checklist
最早接触Ansible是在15年,后来断断续续用过几次,因为更倾向于所写即所得的Fabric,后者也更轻量级.
每次拾起来都要查文档,记录下常见用法.
基础
ansible命令行用法
ansible [options]
- -m ping : 使用模块
- -a/–args “…”: 模块参数
- -u xulz : 切换远程连接用户
- -b/–become : 等同于之前的sudo
# 复制本地文件到远程
ansible all -m copy -a 'src=./README.md dest=/tmp'
ansible -i ./hosts -m shell -a 'apt install nginx'
配置选项
# ansible-config命令查看当前配置
ansible-config view
以下列顺序查找:
- ANSIBLE_CONFIG 环境变量
- 当前路径的ansible.cfg 文件
- ~/.ansible.cfg
- 系统配置 /etc/ansible/ansible.cfg (默认)
服务器信息配置
- /etc/ansible/hosts (类似ini格式:以;作为注释,[header]作为分组)
- inventory文件
- 本地目录的hosts
注: 可以使用正则匹配指定主机
常见用法
提权become
- become=true/yes : 激活提权
- become_user=root : 与上条命令独立使用
- become_method: 可以是su或sudo,在play/task级别修改默认值
- become_flags: ‘-s /bin/sh’ 通常用来切换到nobody非登录用户
在hosts或配置文件使用:
- ansible_become_user
- ansible_become_pass
- ansible_become_method
- ansible_become
ansible-console
交互式shell
# 列出hosts
list
# 切换分组
cd groupA
cd db*
日志及调试
# 打印详细信息到控制台
ansible-playbook -vvv playbook.yaml
# 查看一些信息
--list-hosts
--list-tasks
配置日志文件
[defaults]
log_path=/path/to/logfile
Playbook
用法
- -i/–inventory : 指定参考文件
- –syntax-check : 检查语法
减少执行时间
- -l/–limit : 限定子集
- –tags/–skip-tags : 标签
- gather_facts: False
ansible-palybook playbook.yml
# 运行adhoc命令
ansible boston -i production -m command -a '/sbin/reboot'
最佳实践
- 命名任务
- 涉及状态
- 以角色分组
ansible-galaxy
ansible-galaxy init -p playbooks/roles web
ansible-galaxy install oracle-java -p ./roles
示例
deploy.yml样例:
文件操作
---
- hosts: all
tasks:
- name: copy java
copy:
src: /home/xulz/jdk-8u171-linux-x64.rpm
dest: /home/xulz
# remote_src: yes
# 支持递归复制,yes代表远程机器内复制
- name: install java
become: yes
yum:
name: /home/xulz/jdk-8u171-linux-x64.rpm
state: present
- name: remove/delete file
file:
path: /home/xulz/jdk-8u171-linux-x64.rpm
state: absent
- name: Move foo to bar
command: mv /path/to/foo /path/to/bar
- name: ensure installed vim
apt: pkg=vim state=installed
- name: set filetype indent off for vim
lineinfile:
dest=/etc/vim/vimrc
line='filetype indent off'
state=present
notify:
- start nginx
handlers:
- name: start nginx
service: name=nginx state=started
msg="{{ lookup ('env', 'SHELL') }}
- name: install required python packages
pip: name={{ item }} virtualenv={{ venv_path }}
with_items:
- gunicorn
- psycopg2
pip: name={{ item.name }} version={{ item.version }} virtualenv= {{ venv_path }}
with_items:
- {name: mezzanine, version: 3.1.10 }
- name: install requirements.txt
pip: requirements={{ proj_path }}/{{ reqs_path }} virtualenv= {{ venv_path }}
服务
- name: Make sure a service is running
systemd:
state: started
name: httpd
后台执行
- name: start jmeter slave
shell: "(cd /opt/jmeter/bin; ./jmeter-server >/dev/null 2>&1 &)"
async: 30
poll: 0
其他工具
ansible-vault
加密secret
ansible-doc
插件文档
Rollback
https://github.com/ansistrano/rollback
扩展阅读
官方文档
- Ansible Configuration Settings
- Working with Inventory
- Asynchronous Actions and Polling: 异步执行长时间任务
- 选择指定主机或分组
常用模块
- file
- copy: remote_src: yes 远程机器内复制
- synchronize: 结合delegated_to使用,支持远程机器间复制
- fetch
- yum/dnf
- git
- authorized_key
- systemd
第三方playbook
教程
- An Ansible2 Tutorial
- Ansible tips
- 使用细分角色和tags
- 在角色里包含多个include和tags
- 使用现有的模块
- 使用var_prompt 并提供默认值
- Ansible Galaxy