ansible运维

ansible简介

  • 官方的title是:Ansible is Simple IT Automation 即 简单的自动化it工具
  • ansible跟其他it自动化技术的区别在于其关注点并非是配置管理,应用部署或it流程工作流,而是提供一个统一的界面来协调所有的it自动化功能,因此ansible的系统更加易用,部署更快。
  • ansible可以让用户避免编写脚本或代码来管理应用,同事还能搭建工作流实现it任务的自动化执行,it自动化可以降低技术门槛及对传统it的依赖,从而加快项目的交付速度

ansible的优缺点

  • 优点
  • 轻量级,他不需要去客户端安装agent(代理),更新是,只需要在主控机(操作机)上记性一次更新即可
  • 批量任务执行可以写成脚本,而且不用发布到远程就可以执行
  • 使用python编写,维护更简单
  • 支持sudo
  • 缺点
  • 因为不需要代理,直接基于ssh执行,所以执行效率相对较低
  • 对window备管节点需要加强

ansible架构及工作原理

  • ansible基本架构如下图所示
  • ansible core: ansible自身核心模块
  • host inventory: 主机库,定义可管控的主机列表
  • connection plugins:连接插件,一般默认基于ssh协议连接
  • modules: core modules (自带模块), custome models(自定义模块)
  • playbooks: 剧本,按照所设定编排的顺序执行完成安排任务

ansible工作原理如图

ansible host配置 vars ansible -i hosts_python

  1. 主控端支持local,ssh,zeromq三种方式连接被控端,默认使用基于ssh的连接--------这部分对应基本架构架构图中的连接模块;
  2. 可以按应用类型等法师进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作,---单个模块,单条命令称为ad-hoc
  3. 管理节点统一通过playbooks实现多个task的集合实现一类功能,如web服务的安装部署,数据库服务端的批量备份等,palybooks我们可以理解为剧本,通过组合多条ad-hoc操作的配置文件
  4. ansible默认是通过ssh通道来管理的,也就是它所说的免客户端方式来管理,底层是通过paramiko来实现的
  5. ansible执行过程大体过程如下图,其中暖色的代表模块化

部署安装

名称

IP

操作系统

用途

ansible-server

192.168.11.17

centos7

管理端

client-1

192.168.11.18

centos7

client-2

192.168.11.19

centos7

1. yum安装

需要先配置epel源,能帮助我们解决软件包的依赖关系
yum install http://mirrors.163.com/centos/7.4.1708/extras/x86_64/Packages/epel-release-7-9.noarch.rpm
# epel源 并安装ansible
	ll /etc/yum.repos.d/epel*
	
# 安装
yum install ansible -y

2. 源码安装

  1. 参考博客: https://blog.51cto.com/tengxiansheng/1863688
  2. 源码安装需要首先确保安装了git ,因为它的源码是保存在GitHub,我们需要利用git将其clone下来然后本地编译安装
    安装git yum install -y git安装ansible
git clone https://github.com/ansible/ansible.git -recursive
cd ./ansible
source ./hacking/env-setup

具体安装过程自己可以尝试哦,这里就不截图展示了。

验证安装是否安装OK可以参考上面的ansible --version

3. pip安装

  1. 解决依赖
yum install python-pip python-devel gcc gcc-c++ glibc-devel zlib-devel openssl-devel -y
  1. pip 安装ansible
pip install ansibele --upgrade

验证安装是否安装OK可以参考上面的ansible --version    

ansible --version  查看版本

ansible配置文件

  • 两个核心文件:ansible.cfg和hosts文件,默认都存放在/etc/ansible目录下。
  • ansible.cfg:主要设置一些ansible初始化的信息,比如日志存放路径、模块、插件等配置信息
  • hosts:机器清单,进行分组管理

1. ansible.cfg文件

  • 文件配置常用参数
使用化境变量方式来配置

大多数的Ansible参数可以通过设置带有ANSIBLE_开头的环境变量进行配置,参数名称必须都是大写字母,如下配置:

export ANSIBLE_SUDO_USER=root

设置了环境变量之后,ANSIBLE_SUDO_USER就可以在playbook中直接引用。

2、设置ansible.cfg配置参数

Ansible有很多配置参数,下面列出常用的配置参数:

1)inventory

该参数表示资源清单inventory文件的位置,资源清单就是一些Ansible需要连接管理的主机列表

inventory = /root/ansible/hosts

2)library

Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录

library = /usr/share/ansible

3)forks

设置默认情况下Ansible最多能有多少个进程同时工作,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管理节点的数量来确定。

forks = 5

4)sudo_user

这是设置默认执行命令的用户,也可以在playbook中重新设置这个参数

sudo_user = root

5)remote_port

这是指定连接被关节点的管理端口,默认是22,除非设置了特殊的SSH端口,不然这个参数一般是不需要修改的

remote_port = 22

6)host_key_checking

这是设置是否检查SSH主机的密钥。可以设置为True或False

host_key_checking = False

7)timeout

这是设置SSH连接的超时间隔,单位是秒。

timeout = 20

8)log_path

Ansible系统默认是不记录日志的,如果想把Ansible系统的输出记录到人i治稳健中,需要设置log_path来指定一个存储Ansible日志的文件

log_path = /var/log/ansible.log

另外需要注意,执行Ansible的用户需要有写入日志的权限,模块将会调用被管节点的syslog来记录,口令是不会出现的日志中的

9)host_key_checking

如果有台被管节点重新安装系统并在known_hosts中有了与之前不同的密钥信息,就会提示一个密钥不匹配的错误信息,直到被纠正为止,在使用Ansible时,如果有台被管理节点没有在known_hosts中被初始化,将会在使用Ansible或定时执行Ansible时提示对key信息的确认。

如果你不想出现这种情况,并且你明白禁用此项行为的含义,只要修改该参数为False即可

host_key_checking = False

2. ansible hosts配置

  • 配置被控端主机地址的配置
  1. 编辑/etc/ansible/hosts
  2. 添加本机的public SSH key到目标机器的authorized_keys #ssh-copy-id
  3. 添加本机的私钥到Ansible
  4. 运行ansible all -m ping 测试是否添加成功
  • lnventory 分组
  • Ansible可同时操作属于一个组的多台主机,组和主机之间的关系通过inventory文件配置,默认文件路径为/etc/ansible/hosts
  • 常见参数配置
ansible_ssh_host                    # 目标主机地址
    ansible_ssh_port                    # 目标主机端口,默认22
    ansible_ssh_user                    # 目标主机用户
    ansible_ssh_pass                    # 目标主机ssh密码
    ansible_sudo_pass                 # sudo密码
    ansible_sudo_exe                    
    ansible_connection               # 与主机的连接类型,比如:local,ssh或者paramiko
    ansible_ssh_private_key_file  # 私钥地址
    ansible_shell_type                 # 目标系统的shell类型
    ansible_python_interpreter   # python版本

详细参数:

  • 格式
[test]     # 组名  
10.0.0.1  # 主机ip  或者10.0.0.1:65522 自定义端口
  • 简单配置
[defaults]
inventory      = /etc/ansible/hosts
sudo_user=root
remote_port=22
host_key_checking=False
remote_user=root
log_path=/var/log/ansible.log
module_name=command
private_key_file=/root/.ssh/id_rsa
no_log:True
  • 参数

ansible常用模块

常用参数:

  • -m 模块
  • -i PYTH , -i 后面跟库存主机文件的路劲,默认为/etc/ansible/hosts
  • -a (arguments) 命令行参数

实例:

ansible tests1 -m copy -a 'src=/tmp/test.txt dest=/tmp/test/test.txt"

ansible host配置 vars ansible -i hosts_Ansible_02

ansible <host-pattern> [-f forks] [-m module_name] [-a args] [options]
  • host-pattern:这次的命令对哪些主机生效;
  • -f forks:启动的并发线程数,就是一次并行处理多少主机;
  • -m module_name:要使用的模块;
  • -a args:模块特有的参数。

1. command 执行模块

  • 作为ansible的默认模块,可以允许远程主机范围内的所有shell命令。
    注意: 在command的命令中含有像$ HOME'这样的变量和像``<“',”>“, `“”“”,“”;“”和“”&“'将无法正常工作(如果需要这些功能,请使用[shell]模块)
ansible 192.168.168.11* -m command -a 'ip addr show dev eth0'

参数:
– chdir:在运行命令之前,切换到此目录。

2. shell 执行模块

  • 功能:执行远程主机的shell脚本文件
ansible all -m shell -a "/home/test.sh"


参数:
– chdir:在运行命令之前,切换到此目录。
– executable:更改用于执行命令的shell(bash,sh)。 应该是可执行文件的绝对路径。

3. copy复制模块

  • 功能: 实现主控端向目标主机copy文件。
ansible all -m copy -a "src=/home/test.sh dest=/tmp/ owner=root group=root mode=0755" 

#src 主控端文件位置
#dest 被控端目标位置
#owner 文件复制过去后的所有者
#group 文件复制过去后的所属组
#mode  文件的权限设定,执行a+x这种方式

4. Fetch 抓取模块

  • 用途:用于从被控端 中拷贝文件到主控端
  • 注意: 不能拷贝目录
ansible pythonserver -m fetch -a "src=/root/123 dest=/root"

SSH password:
- fetch:
    src: 在远程拉取的文件,并且必须是一个file,不能是目录
    dest: 用来存放文件的目录,例如存放目录为backup,源文件名称为/etc/profile在主机pythonserver中,那么保存为/backup/pythonserver/etc/profile

5. yum 安装模块

  • 功能:安装 软件包
ansible all -m yum -a "name=httpd state=latest disable_gpg_check=yes enablerepo=epel"
#name 包名
#state (Choices: present, installed, latest, absent, removed)[Default: present]
#disable_gpg_check:禁止gpg检查
#enablerepo:只启动指定的repo

6. cron 计划模块

ansible all -m cron -a "name='test' hour='2-5' minute='*/5' day='1' month='3,4' weekday='1' job='ls -l' user=tom"


backup:对远程主机上的原任务计划内容修改之前做备份
 cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
 minute分,hour时,day日,month月,weekday周
 job: 要执行的任务,依赖于state=present
 name: 该任务的描述
 special_time: 指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly
 state: 确认该任务计划是创建还是删除
 user: 以哪个用户身份执行

7. service 服务模块

  • 功能: 服务管理,
[root@localhost ~]# ansible all -m service -a "name=httpd state=restarted"    #启动服务
[root@localhost ~]# ansible all -m service -a "name=httpd state=running"      #查看服务状态
[root@localhost ~]# ansible all -m service -a "name=httpd state=stoped"       #停止服务



参数:
enabled=:是否开机自动启动,取值为true或false;
name=:服务名字;
state=:状态,取值有started,stoped,restarted。

8. template 模板模块

  • 基于模板方式生成一个文件复制到远程主机(template使用Jinjia2格式作为文件模版,进行文档内变量的替换的模块。它的每次使用都会被ansible标记为”changed”状态。)
- template:
    src: /mytemplates/foo.j2   
    dest: /etc/file.conf   
    owner: bin
    group: wheel
    mode: 0644


– backup: 如果原目标文件存在,则先备份目标文件 
– src:在ansible控制器上的Jinja2格式化模板的路径。 这可以是相对或绝对的路径。 
– dest:将模板渲染到远程机器上的位置。 
force:是否强制覆盖,默认为yes 
– owner:目标文件属主 
– group:目标文件属组 
– mode:目标文件的权限模式,模式可以被指定为符号模式(例如,u + rwx或u = rw,g = r,o = r)

9. file 文件模块

  • 功能:用于远程主机上的文件操作,对文件的所有权,组合模式进行更改
# 更改文件所有权,组和模式。 当使用八进制数指定模式时,第一个数字应始终为0。
- file:
    path: /etc/foo.conf
    owner: foo
    group: foo
    mode: 0644

# touch创建文件,使用符号模式设置权限(相当于0644)
- file:
    path: /etc/foo.conf
    state: touch
    mode: "u=rw,g=r,o=r"

# touch创建文件,添加/删除一些权限
- file:
    path: /etc/foo.conf
    state: touch
    mode: "u+rw,g-wx,o-rwx"

# 创建一个目录,如果它不存在
- file:
    path: /etc/some_directory
    state: directory
    mode: 0755



– force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no 
– group:定义文件/目录的属组 
– mode:定义文件/目录的权限 
– owner:定义文件/目录的属主 
– path:必选项,定义文件/目录的路径 
– recurse:递归的设置文件的属性,只对目录有效 
– src:要被链接的源文件的路径,只应用于state=link的情况 
– dest:被链接到的路径,只应用于state=link的情况 
– state: 
   directory:如果目录不存在,创建目录 
   file:即使文件不存在,也不会被创建 
   link:创建软链接 
   hard:创建硬链接 
   touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间 
   absent:删除目录、文件或者取消链接文件

10 user 用户模块

  • 功能: 远程主机用户管理
[root@localhost ~]# ansible all -m user -a "name=jerry comment=' doubi jerry'"   #添加用户 详细参数参考ansible-doc user
[root@localhost ~]# ansible all -m user -a "name=jerry state=absent remove=yes"  #删除用户

11 ping 模块

  • 功能: 检查指定节点机器是否还能连通,用法很简单,不涉及参数,主机如果在线,则回复pong
  • 还用个hping 模块,
ansible erp -m ping

13 raw 执行原始命令模块

  • 执行原始的命令,而不是通过模块子系统。在任何情况下,使用shell或命令模块是合适的。给定原始的参数直接通过配置的远程shell运行。可返回标准输出、错误输出和返回代码。此模块没有变更处理程序支持。
    这个模块不需要远程系统上的Python,就像脚本模块一样。此模块也支持Windows目标。

14 pip 管理python库依赖 模块

  • 用于管理Python库依赖项,为了使用pip模块,必须提供参数name或者requirements
# 安装bottle python包。
- pip:
    name: bottle

# 在0.11版安装bottle python包。
- pip:
    name: bottle
    version: 0.11

# 使用远程协议(bzr +,hg +,git +,svn +)安装MyApp。 您不必在extra_args中提供'-e'选项。
- pip:
    name: svn+http://myrepo/svn/MyApp#egg=MyApp

# 使用远程协议(bzr +,hg +,git +)安装MyApp。
- pip:
    name: git+http://myrepo/app/MyApp

# 从本地压缩包安装MyApp
- pip:
    name: file:///path/to/MyApp.tar.gz

# 将bottle安装到指定的virtualenv中,继承全局安装的模块
- pip:
    name: bottle
    virtualenv: /my_app/venv
    virtualenv_site_packages: yes

# 使用Python 2.7将bottle安装到指定的virtualenv中
- pip:
    name: bottle
    virtualenv: /my_app/venv
    virtualenv_command: virtualenv-2.7

# 在用户主目录中安装bottle。
- pip:
    name: bottle
    extra_args: --user

# 安装指定的python requirements
- pip:
    requirements: /my_app/requirements.txt

# 在指定的virtualenv中安装指定的python requirements。
- pip:
    requirements: /my_app/requirements.txt
    virtualenv: /my_app/venv

# 安装指定的python requirements和自定义pip源URL
- pip:
    requirements: /my_app/requirements.txt
    extra_args: -i https://example.com/pypi/simple

# 专门为Python 3.3安装bottle,使用'pip-3.3'可执行文件。
- pip:
    name: bottle
    executable: pip-3.3

# 安装 bottle,如果已安装,强制重新安装
- pip:
    name: bottle
    state: forcereinstall
  • 参数
– chdir: 执行pip命令前cd进入的目录 
– name:要安装的Python库的名称或远程包的URL。 
– requirements:一个pip requirements.txt文件的路径,它应该是远程系统的本地文件,如果使用chdir选项,则可以将文件指定为相对路径。 
– version:指定的Python库的安装版本。 
– extra_args:额外的参数传递给pip。 
– executable:显式可执行文件或可执行文件的路径名,用于为系统中安装的特定版本的Python运行pip。 例如pip-3.3,如果系统中安装了Python 2.7和3.3,并且想要为Python 3.3安装运行pip。 它不能与“virtualenv”参数一起指定(在2.1中添加)。 默认情况下,它将采用适用于python解释器的版本。 pip3在python 3上,pip2或pip在python 2上。 
– virtualenv:要安装到的virtualenv目录的可选路径。 它不能与’executable’参数一起指定(在2.1中添加)。 如果virtualenv不存在,则将在安装软件包之前创建它。 可选的virtualenv_site_packages,virtualenv_command和virtualenv_python选项会影响virtualenv的创建。 
– virtualenv_command:用于创建虚拟环境的命令或路径名。 例如pyvenv,virtualenv,virtualenv2,~/bin /virtualenv,/usr/local/bin/virtualenv。 
– virtualenv_python:用于创建虚拟环境的Python可执行文件。 例如python3.5,python2.7。 未指定时,将使用用于运行ansible模块的Python版本。 当virtualenv_command使用pyvenv或-m venv模块时,不应使用此参数。 
– state:状态(present,absent,latest, forcereinstall),表示是安装还卸载 
   present:默认的,表示为安装 
   lastest: 安装为最新的版本 
   absent:表示删除 
   forcereinstall:“forcereinstall”选项仅适用于可ansible 2.1及更高版本。

15 group 组模块

  • 功能: 分组
ansible web -m group -a 'name=g1 gid=666 state=present system=yes'

– gid:指定用的gid。 
– name:指定用户名。 
– state:是创建还是删除。(present,absent) 
– system:如果是,则表示创建的组是系统组。

16 get_url模块(类似wget下载)

  • 模块主要用于从http、ftp、https服务器上下载文件(类似于wget),主要有如下选项:
- name: Download foo.conf
  get_url:
    url: http://example.com/path/file.conf
    dest: /etc/foo.conf
    mode: 0440

- name: Download file with custom HTTP headers
  get_url:
    url: http://example.com/path/file.conf
    dest: /etc/foo.conf
    headers: 'key:value,key:value'

- name: Download file with check (sha256)
  get_url:
    url: http://example.com/path/file.conf
    dest: /etc/foo.conf
    checksum: sha256:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c



– sha256sum:下载完成后进行sha256 check; 
– timeout:下载超时时间,默认10s 
– url:下载的URL 
– url_password、url_username:主要用于需要用户名密码进行验证的情况 
– dest:将文件下载到哪里的绝对路径。如果dest是目录,则使用服务器提供的文件名,或者如果没有提供,将使用远程服务器上的URL的基本名称。 
– headers:以格式“key:value,key:value”为请求添加自定义HTTP标头。

17 unarchive 解压模块

  • 功能: 用于解压文件
- name: 将foo.tgz解压缩到/var/lib/foo中
  unarchive:
    src: foo.tgz
    dest: /var/lib/foo

- name: 解压远程计算机上已存在的文件
  unarchive:
    src: /tmp/foo.zip
    dest: /usr/local/bin
    remote_src: yes

- name: 解压文档需要下载的文件(2.0中添加)
  unarchive:
    src: https://example.com/example.zip
    dest: /usr/local/bin
    remote_src: yes

参数:
– copy:在解压文件之前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在。 
– creates:指定一个文件名,当该文件存在时,则解压指令不执行 
– dest:远程主机上的一个路径,即文件解压的绝对路径。 
– group:解压后的目录或文件的属组 
– list_files:如果为yes,则会列出压缩包里的文件,默认为no,2.0版本新增的选项 
– mode:解压后文件的权限 
– src:如果copy为yes,则需要指定压缩文件的源路径 
– owner:解压后文件或目录的属主
---------------------

18 script 复制并执行 模块

  • 功能: script模块将本地脚本复制到远程主机并运行之
ansible web -m script -a 'time.sh'

19 setup 模块

  • 类似saltstack的grains静态信息收集,收集一些主机硬件信息或者以及其他如fqdn等等
  • 使用setup获取ip地址以及主机名使用filter过滤等等
获取内存信息
ansible db -m setup -a 'filter=ansible_memory_mb'


获取主机名
ansible db -m setup -a 'filter=ansible_nodename'