自动化运维工具之Ansible(1)

时间:2022-03-02 21:51:08

自动化运维工具之Ansible(1)

 

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

  工作架构

自动化运维工具之Ansible(1)

  执行过程:

  • 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执行,需要遵循其规定的目录格式,用处不是特别大