ansible简介
Ansible的创始人是Michael DeHaan(同时也是Cobbler和Func的作者),2012年3月发布第一版,在2015年10月被Red Hat公司收购。
功能:
Ansible 是一个 IT 自动化工具。它能配置系统、部署软件、编排更复杂的 IT 任务,如连续部署或零停机时间滚动更新、自动化批量部署、配置并启动应用服务;同类的自动化工具还有Saltstack、Puppet、Chef和Fabric等
特性:
模块化:调用特定模块
paramiko,pyYAML,jinja2三个关键模块
支持自定义模块
部署简单,安全
基于python、ssh、agentless、OpenSSH
工作架构
执行过程:
- 1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg
- 2. 加载自己对应的模块文件,如command
- 3. 通过ansible将模块或命令生成对应的临时py文件,并将该 文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
- 4. 给文件+x执行
- 5. 执行并返回结果
- 6. 删除临时py文件,sleep 0退出
执行状态返回:
- 绿色:执行成功,并且没有对主机做更改
- 黄色:执行成功,对主机做过更改
- 红色:执行失败
ansible安装
1、yum安装,基于EPEL源
[root@centos7 ~]# yum install ansible
2、源码安装Ansible
1)准备Python环境
# yum groupinstall "Development Tools"
# yum install zlib-devel openssl-devel libffi-devel # wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz # tar xf Python-2.7.8.tgz # cd Python-2.7.8/ # ./configure --prefix=/usr/local # make && make install # cp -av /usr/local/include/python2.7/* /usr/local/include/ # cd /usr/bin/ # ln -sf /usr/local/bin/python . # 编辑/usr/bin/yum 修改为 #!/usr/bin/python2 避免yum不可用
2)获取源码
# wget https://pypi.python.org/packages/source/s/setuptools/setuptools-19.6.2.tar.gz # wget https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz # wget http://pyyaml.org/download/libyaml/yaml-0.1.6.tar.gz # wget https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz # wget https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz # wget https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.8.tar.gz # wget https://pypi.python.org/packages/source/s/simplejson/simplejson-3.8.1.tar.gz # wget https://files.pythonhosted.org/packages/20/c1/2a1a6104f7660b5d6b9876ea351f24212c19ce17c03771baf94f1c81d13b/ansible-2.5.3.tar.gz
3)PyYAML模块安装
# tar xf yaml-0.1.6.tar.gz # cd yaml-0.1.6/ # ./configure --prefix=/usr/local # make && make install # cd .. # tar xf PyYAML-3.11.tar.gz # cd PyYAML-3.11/ # python setup.py install
4)setuptools模块安装,依赖zlib-devel包
# tar xf setuptools-19.6.2.tar.gz # cd setuptools-19.6.2/ # python setup.py install
5)pycrypto模块安装
# tar xf pycrypto-2.6.1.tar.gz # cd pycrypto-2.6.1/ # python setup.py install
6)Jinja2模块安装,依赖setuptools模块
# tar xf MarkupSafe-0.9.3.tar.gz # cd MarkupSafe-0.9.3/ # python setup.py install # cd .. # tar xf Jinja2-2.8.tar.gz # cd Jinja2-2.8/ # python setup.py install
7)simplejson模块安装
# tar xf simplejson-3.8.1.tar.gz # cd simplejson-3.8.1/ # python setup.py install
8)安装Ansible
# tar xf ansible-2.5.3.tar.gz # cd ansible-2.5.3 # python setup.py install
9)测试
# ansible --version ansible 2.5.3 config file = None configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/local/lib/python2.7/site-packages/ansible-2.5.3-py2.7.egg/ansible executable location = /usr/local/bin/ansible python version = 2.7.8 (default, May 29 2018, 14:06:44) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
# mkdir .ssh # ssh-keygen -t rsa -f .ssh/id_rsa -P '' # ssh-copy-id -i .ssh/id_rsa.pub 192.168.0.11
# cp -a examples/* /etc/ansible/ # vim /etc/ansible/hosts [web_servers] 192.168.0.11 # ansible web_servers -m ping 192.168.0.11 | SUCCESS => { "changed": false, "ping": "pong" }
3、Pip安装Ansible
# yum -y install zlib-devel openssl openssl-devel libffi libffi-devel gcc gcc-c++ python-devel python-simplejson python-setuptools # pip install paramiko PyYAML Jinja2 httplib2 six # pip install ansible # ansible --version ansible 2.5.3 config file = None configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
ansible配置文件
相关文件:
- /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
- /etc/ansible/hosts 主机清单
- /etc/ansible/roles/ 存放角色的目录
程序:
- /usr/bin/ansible 主程序,临时命令执行工具 /usr/bin/ansible-doc 查看配置文档,模块功能查看工具
- /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具/usr/bin/ansible-pull 远程执行命令的工具/usr/bin/ansible-vault 文件加密工具/usr/bin/ansible-console 基于Console界面与用户交互的执行工具
配置文件ansible.cfg
inventory = /etc/ansible/hosts #主机清单文件 library = /usr/share/my_modules/ #库文件存放目录 remote_tmp = ~/.ansible/tmp #临时py命令文件存放在远程主机目录 local_tmp = ~/.ansible/tmp #本机的临时命令执行目录 forks = 5 #默认并发数 sudo_user = root #默认sudo用户 ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码 remote_port = 22 #远程主机端口号 host_key_checking = False #禁用第一次连接的key检查 log_path = /var/log/ansible.log #默认ansible不记录日志,启用此项开启日志记录
主机清单inventory
ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名默认的inventory file为/etc/ansible/hosts
inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成
inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明
/etc/ansible/hosts
格式1:
192.168.0.1:[port]
格式2:
[locategroupname]
192.168.0.1
192.168.0.2
192.168.0.3
格式3:
[locategroupname]
192.168.0.[1:3]
Ansible命令
用法:
ansible <host-pattern> [-m module_name] [-a args]
选项:
- --version:查看版本相关信息
- -m module:指定模块,默认为command
- -v|–vv|-vvv:详细过程
- —list|--list-hosts:显示主机列表
- -k|--ask-pass:提示连接密码,默认Key验证
- -K|--ask-become-pass:提示输入sudo
- -C|--check:检查执行,并不是真正执行
- -T|--timeout=TIMEOUT:执行命令的超时时间,默认10s
- -u|--user=REMOTE_USER:执行远程执行的用户
- -b|--become:代替旧版的sudo切换
host-pattern:
- all:表示主机清单中所有的主机
- groupname:表示组中的所有主机
- host:指定某台主机,但是此主机必须在主机清单中
- 支持通配符(*)、逻辑与(:&)或(:)非(:!)和正则表达式(~)
ansible-doc
用法:ansible-doc [options] [module...]
选项:
- -a 显示所有模块的文档
- -l, --list 列出可用模块
- -s, --snippet 显示指定模块的playbook片段
ansible-galaxy
从网站上下载对应的roles(https://galaxy.ansible.com)
- install 安装roles
- list 列出所有roles
- remove 删除roles
ansible-playbook
执行.yml剧本文件
- -C | --check 检查执行,不真正执行
- -t tags 执行指定的标签
- --list-tags 列出剧本中的所有的标签
- --list-tasks 列出剧本中所有的任务
- --list-hosts 列出剧本中所有的主机
- --limit host_group_name 只针对主机列表中的主机执行
- -v | -vv | -vvv 显示详细信息
- -e 'var=value' 自定义变量赋值
ansible-vault
管理加密解密yml文件
- encrypt 加密
- decrypt 解密
- view 查看
- edit 编辑加密文件
- rekey 修改口令
- create 创建新文件
ansible-console
ansible的交互式终端,root@all (3)[f:5]$:执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$
- forks #:设置并发数
- cd:切换主机组或主机
- list:列出当前主机列表
- help:获取帮助
ansible-pull
推送命令至远程,支持直接从git下载playbook执行,需要遵循其规定的目录格式,用处不是特别大