特点

  • 可以使用非root用户
  • 快速上手
  • 默认通过SSH协议管理机器
  • 不用在远程机器安装软件

安装

# RHEL and CentOS:
$ sudo yum install ansible
# Python:
$ sudo pip install ansible

配置

安装完成后的默认配置目录为/etc/ansible/

# ls /etc/ansible/
ansible.cfg  hosts  roles

ansible.cfg

ansible的配置文件,可以对一些默认行为进行修改,读取顺序如下(版本>1.5):

  • ANSIBLE_CONFIG (一个环境变量)
  • ansible.cfg (位于当前目录中)
  • .ansible.cfg (位于家目录中)
  • /etc/ansible/ansible.cfg

常用参数

# 修改是否弹出密码询问,当没有配置任何目标主机相关的信息时进行密码输入提示
ask_pass/ask_sudo_pass = False
# 默认是SSH端口和用户,如不指定则使用当前用户
remote_port
remote_user
# 远程传输脚本存放地址
remote_tmp = `$HOME/.ansible/tmp`
# 默认的sudo用户,或者通过--sudo-user/--sudo指定使用
sudo_user = root
# 默认SSH尝试连接的超时时间
timeout = 10
# 设置SSH参数
ssh_args
# 使用scp代替sftp进行文件传输
scp_if_ssh
# 是否检测主机密钥
host_key_checking

hosts

主机仓库配置文件,配置文件结构类似INI

# 分组名,后面使用ansible可以指定某一个组
[webs]
# 主机名
one.example.com
# 可以指定端口
two.example.com:6666
three.example.com   ansible_ssh_port=2222
# 相似或连续的主机名,下面表示从web-a到web-f
web-[a:f].example.com
# 连续数字,下面标识从web-1到web-10
web-[1:10].example.com
# 可以对每个host指定连接配置
localhost   ansible_connection=local
other1.example.com  ansible_connection=ssh  ansible_ssh_user=hahaha
# 使用IP地址
192.168.1.56
# 使用连续IP地址
192.168.1.[10:20]
# 配置组内通用变量
[webs:vars]
ansible_ssh_port=2222
ntp_server=0.asia.pool.ntp.org

常用参数

# 连接的远程主机名
ansible_ssh_host
# SSH端口
ansible_ssh_port
# SSH用户名
ansible_ssh_user
# SSH密码,建议使用--ask-pass指定或者使用SSH密钥
ansible_ssh_pass
ansible_sudo_pass
# sudo命令的路径
ansible_ssh_exe
# 链接类型,local ssh paramiko smart(默认)
ansible_connection
# SSH密钥文件
# 扩展:
# 生成密钥命令 ssh-keygen
#   ssh-keygen -t rsa -C ss
# 配置密钥登录到远程主机 ssh-copy-id
#   ssh-copy-id root@sszgr.com
ansible_ssh_private_key_file
# 目标系统的shell类型,默认使用sh,可以设置csh fish
ansible_shell_type
# 目标主机的python路径
ansible_python_interpreter

命令(ad-hoc)

ansible提供了多种交互模式可供选择,用于解决一些简单的任务。 如果满足不了需求,也可以自己编写ansible playbook脚本来解决,ansible默认使用command模块

常用命令

# 
ansible <host-pattern> [options]
ansible <host-pattern> -m <module-name> -a <module-args>
# 执行多个组
ansible webs:dbs ..
# 排除组,所有机器在webs组同时不在dbs组
ansible webs:!dbs
# 指定组交集,同时属于webs组和dbs组
ansible webs:&dbs
# 自由组合
ansible webs:dbs:stag:!pho
# 指定组内某个机器或多个机器
ansible webs[0]
ansible webs[0-10]
# 直接指定机器
ansible all -i IP
ansible all -i IP,IP1,IP2
# 查看可用模块
ansible-doc -l
# 查看模块详细用户
ansible-doc -s model_name

常用模块

ping

ansible webs -m ping

command

# 默认模块,执行命令操作,不解释特殊字符
ansible webs -a date
ansible webs -m command -a "pwd"

shell

# 执行命令操作,以 shell 解释器进行命令执行
ansible webs -m shell -a "ip r |grep 10.255"
ansible webs -m shell -a "echo newpwd| passwd --stdin user"
# 旧版本通过 --sudo 使用
ansible webs -m shell -a "cat /etc/passwd" --sudo -u ss
# 新版本需要借助 become 模块
ansible webs -m shell -a "cat /etc/passwd" --become --become-method=sudo

copy

# 文件上传模块
# 将本地的test.txt传输到远程/root目录下
ansible webs -m copy -a "src=/root/test.txt dest=/root/test.txt"
ansible webs -m copy -a "src=/root/test.txt dest=/root/test.txt mode=600"

script

# 将本地脚本放到远程主机上执行
ansible webs -m script -a "/root/test.sh"
# 更改执行目录
ansible webs -m script -a "/root/test.sh chdir=/home"

service

# 服务管理模块
# 更改服务的状态(reloaded, restarted, started, stopped)
ansible webs -m service -a "name=httpd state=started"
ansible webs -m service -a "name=httpd enabled=true"

yum/apt

# 包管理模块,一般还是习惯将包都下载到本地,在远程传输到目标机器进行安装
# 确认包的状态(absent, installed, latest, present, removed)
# 确认是否安装
ansible webs -m yum -a "name=httpd state=present"
# 下载软件包
ansible webs -m yum -a "name=httpd download_only=true"

cron

# 计划任务管理模块
# 创建计划任务
# backup
# state (present/absent)
# cron_file
# minute hour day month weekday job
ansible webs -m cron -a 'name=test job="/bin/date" day="*/1" state=present'
ansible webs -m cron -a "name=test state=absent"

ansible-playbook

Ansible Playbooks 是相当强大的一个功能,将复杂的任务编写为一个可重复、可复用的简单配置。

仓库中提供了很多常用的 examples 可以使用,这里列一下平常工作中常用的几个示例。

  1. 批量推送SSH公钥
- hosts: agent
  user: root
  tasks:
   - name: ssh-copy
     authorized_key: user=root key="{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"
  1. 修改用户密码
- hosts: agent
  user: root
  tasks:
   - name: change password
     user: name={{ name }} passwod={{ chpass | password_hash('sha512') }} update_password=always
ansible-playbook x.yaml -e "name=user1 chpass=123456"
  1. 使用 sudo 执行命令,输出结果并保存到本地文件中
- hosts: 172.16.10.11
  user: ubuntu
  gather_facts: no
  become: yes
  become_method: sudo
  tasks:
   - name: ipAddress
     register: response
     shell: ip a
   - local_action: copy content={{ response.stdout }} dest=ipaddress.txt
   - debug:
        var: response.stdout

参考