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

扩展阅读

官方文档

常用模块

第三方playbook

教程