ansible工具
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工作原理如图
-
主控端支持local,ssh,zeromq三种方式连接被控端,默认使用基于ssh的连接--------这部分对应基本架构架构图中的连接模块;
-
可以按应用类型等法师进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作,---单个模块,单条命令称为ad-hoc
-
管理节点统一通过playbooks实现多个task的集合实现一类功能,如web服务的安装部署,数据库服务端的批量备份等,palybooks我们可以理解为剧本,通过组合多条ad-hoc操作的配置文件
-
ansible默认是通过ssh通道来管理的,也就是它所说的免客户端方式来管理,底层是通过paramiko来实现的
-
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. 源码安装
-
源码安装需要首先确保安装了
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安装
-
解决依赖
yum install python-pip python-devel gcc gcc-c++ glibc-devel zlib-devel openssl-devel -y
-
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配置
-
配置被控端主机地址的配置
- 编辑/etc/ansible/hosts
- 添加本机的public SSH key到目标机器的authorized_keys #ssh-copy-id
- 添加本机的私钥到Ansible
- 运行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-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 计划模块
-
功能: 被控端的crontab配置,用于管理计划任务的
-
参考博客: https://blog.51cto.com/noodle/1769528
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'