--时间:2021年1月25
--作者:飞翔的小胖猪
前言
该文档仅作为作者复习ansible使用,对格式和流程没有做过多的编排和概述。不喜勿喷。
基础
ansible控制主机是基于python中的Paramiko模板(Paramiko是python对ssh的实现) ,ansible服务端要求系统为linux操作系统,python版本在python 2.6以上。
相关网址
- ansible官方网址:ansible.com
- galaxy网站:https://galaxy.ansible.com/
执行原理
- ansible本质是通过python调用的Paramiko模块来执行命令的。
- 服务控制端的命令会由ansible在服务端生成python文件,保存在本地$HOME/.ansible/tmp中。
- 复制控制端生成的python文件到被控告主机端的$HOME/.ansible/tmp中。
- 被控主机调用python程序执行脚本。
- 被控端删除之前传过来的python文件。
注:如果在ansible命令执行过程中使用Ctrl+C或kill命令直接中断程序,也会对现行环境进行清理。就是进行第5个操作。
配置文件常用
inventory = /root/ansible/hosts #资源清单就是一些Ansible需要连接管理的主机列表 library = /usr/share/my_modules/ #库文件存放路径,Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录 forks = 5 #设置默认情况下Ansible最多能有多少个进程同时工作,默认设置最多5个进程并行处理。 sudo_user = root #默认执行命令的用户,也可以在playbook中重新设置这个参数。 remote_port = 22 #这是指定连接被关节点的管理端口,默认是22 host_key_checking = False #这是设置是否检查SSH主机的密钥。可以设置为True或False timeout = 20 #设置SSH连接的超时间隔,单位是秒。 log_path = /var/log/ansible.log #日志文件路径,Ansible系统默认是不记录日志的 private_key_file=/path/to/file.pem #在使用ssh公钥私钥登录系统时候,使用的密钥路径。 module_name = command #ansible默认模块,建议修改为shell ask_sudo_pass = True #每次执行ansible是否询问ssh密码 remote_tmp = ~/.ansible/tmp #远程被控端文件存放路径 local_tmp = ~/.ansible/tmp #服务端生成文件存放路径
关键路径
- inventory:主机配置清单文件路径。
- library:库文件存放目录
- remote_tmp:远程被控端文件存放路径
- local_tmp:服务端生成文件存放路径
- log_path:日志路径
备注
- 主机添加信息时一定要使用分组,通过分组把资源按各种特性按类分派。
- 在主机列表中添加连续的主机可以使用如192.168.100.[1-100]表示192.168.1.1-192.168.1.100这100个ip地址。
- ansible控制端取消首次登录输入yes的操作在配置文件设置host_key_checking = False
- ansible种返回结果默认颜色标识。 黄色:成功-修改动作。 绿色:成功-查询动作。
- 颜色可以根据自己的习惯修改,在/etc/ansible/ansible.cfg文件中[colors]里面定义。
- playbook同等于脚本,role是一堆playbook的集合用来实现特定的功能。
- yaml文件有敏感信息时必须进行加密,加密过后必须进行解密操作后才能操作。
- command模块时ansible的默认模块很多通配符都无法支持,一般情况下不适用command模块。command模块不支持管道符和变量等,如果要使用这些,需要shell模块。
- shell模块实现的功能比command多,支持很多如管道符等特殊符号。shell也不完全能够完美适用于所有shell命令。
- 专用的操作请使用ansible专用的模块。
- ansible执行命令时确定不用对端设备的信息收集时请关闭连接时的信息收集的选项。gather_facts:no
- 通过playbook执行了相关 操作过后,使用ansbile-hoc命令检查测试是否达成预期目的。
- 开启了ansible日志记录时,执行Ansible的用户需要有写入日志的权限,模块将会调用被管节点的syslog来记录,口令是不会出现的日志中的
配置文件
ansible一般有两种安装方式使用得比较多得是直接使用操作命令进行安装,也可通过python模块得方式安装。
如果通过操作系统软件包管理工具,那么在/etc/ansible 目录下应该已经有了ansible.cfg 配置文件。
以python模块方式安装的情况需要设置配置文件。
ansible配置文件在/etc/ansible/ansible.cfg
Ansible 配置文件是以ini 格式存储配置数据的,在Ansible 中,几乎所有的配置项都可以通过 Ansible 的 playbook 或环境变量来重新赋值。在运行Ansible 命令时,命令将会按照预先设定的顺序查找配置文件,如下所示:
- ANSIBLE_CONFIG :首先,Ansible 命令会检查环境变量,及这个环境变量将指向的配置文件。
- ./ansible.cfg:其次,将会检查当前目录下的ansible.cfg 配置文件。
- ~ /.ansible.cfg:再次,将会检查当前用户home 目录下的.ansible.cfg 配置文件。
- /etc/ansible/ansible.cfg :最后,将会检查在用软件包管理工具安装Ansible 时自动产生的配置文件。
- 大多数的Ansible 参数可以通过设置带有ANSIBLE_ 开头的环境变量进行配置,参数名称必须都是大写字母,如下配置项:
- export ANSIBLE_SUDO_USER=root
- 设置了环境变量之后,ANSIBLE_SUDO_USER 就可以在playbook 中直接引用。
常用命令
hoc
ansible all -m 模块名 -a ' 模块参数 ' -f 5 :hoc执行命令,all代表所有主机
ansible-doc ::查看帮助文件
ansible-doc -l :查看有多少个模块
ansible-doc 模块名:查看具体模块使用方法(详细)
ansible-doc -s 模块名 :查看具体模块的使用方法(简单),推荐使用这个命令来查看帮助文档。
ansible-galaxy:查找获取互联网中别人定义的role。可在https://galaxy.ansible.com/网站查看搜索相关的role。
ansible-galaxy install role名 : 安装指定的模块
ansible-galaxy remove role名 : 卸载指定的模块系统中存在的
ansible-galaxy list :查看系统中存在的role
ansible-vault encrypt xxxx.yml :加密xml文件
ansible-vault decrypt xxxx.yml : 解密xml文件
ansible-vault view xxxx.yml : 查看加密的xml文件
ansible-vault edit xxxxx.yml : 修改
ansible-vault rekey xxxxx.yml : 修改指定文件的口令
playbook
ansible-playbook -C XXXX.yaml 运行前检测,不实际运行。-C是大写
ansible-playbook --list-hosts XXXX.yaml 查看playbook脚本中包含的主机列表
ansible-playbook --list--tags XXXX.yaml 查看标签
ansible-playbook --list-tasks XXXX.yaml 查看playbook脚本中task列表
ansible-playbook --limit XXXX.yaml 限制文本中部分主机执行脚本
ansible-playbook -v -vv -vvv XXXX.yaml 查看脚本执行过程中的信息
ansible-playbook -t 标签名 XXXX.yaml 只指定执行yaml文件中带有特定tag的task
模块
command模块
作用:远程调用执行命令
常用参数:chdir(切换路径) creates(创建文件,如果存在则不创建) removes(删除文件,如果不存在则删除失败)
shell模块
作用:远程调用执行命令,支持管道符等特殊字符。
常用参数:chdir(切换路径) creates(创建文件,如果存在则不创建) removes(删除文件,如果不存在则删除失败)
script模块
作用:服务端脚本拷贝至远端执行。
copy
作用:拷贝服务端文件至被控端服务器。
参数:src(源路径) dest(目的路径) mode(权限) owner(用户)
注:copy模块可以实现文件夹的远程复制。例src=/dir1/dir2/ 表示dir2文件夹下所有文件, src=/dir1/dir2 表示dir2文件夹本身。
fetch
作用:抓取原路径下的文件到对端指定目录中,不能抓取目录。抓取的结果会在dest路径中以src的目录结构创建子目录保存。
参数:src(源路径) dest(目的路径)
注:如src=/dir1/dir2/file1 dest=/test/ 结果是:/test/dir1/dir2/file1
unarchive
作用:解压操作
参数:copy(是否进行待解压包拷贝) src(源路径) dest(目的路径) owner(用户)
注:解压模块默认的流程是先把压缩包从服务端拷贝到被控端后再执行解压。如果压缩包本来就在本地则不需要进行复制操作,使用copy=no参数。
archive
作用:打包软件。
参数:
注:
hostname
作用:修改主机名
参数:name(主机名称)
cron
作用:添加修改查看计划任务。
参数:minute(分钟) hour(小时) day(天) month(月) weekday(周) disabled(暂停)
注:计划任务存放在/var/spool/cron/用户名 目录下
yum
作用:redhat系列操作系统包管理模块
参数:name(软件名) state(状态 ,absent卸载、present安装、started启动、stopped停止、restarted重启)
user
作用:用户管理模块
group
作用:用户管理模块
lineinfile
作用:修改文件中特定的行,同等于操作系统中的sed命令。
参数:path(文件路径) regexp(正则表达式) line(修改成的结果) state=absent(删除特定的行)
replace
作用:修改该制定文件中的内容,同等于操作系统中的sed命令。
注:ansible all -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#1'" 为/etc/fstab文件中UUID开头的行加上#
setup
作用:收集主机信息
参数:filter(筛选制定的参数)
注:该模块在ansible执行命令时会自动运行,如果确定不需要被控端主机的信息,一定要在配置文件或playbook脚本中关闭收集主机信息操作。会节约很多资源的。
file
作用:处理文件。
Playbook
yaml语法格式
- 每单一文件第一行,使用 "---"开始。在结尾的时候使用三个点“...”来表示,不是必须的。
- 次行开始写playbook的内容。
- 使用#表示注释代码。
- 缩进必须是统一的,不能出现“tab”和“空格”混用。
- 同一级别的缩进一致。
- yaml文本对大小写敏感。
- 多个k/v可同行写也可单独成行写,在一行中书写多个K/V时每个键值对使用“,”隔开。
- K/V中的v可以是单个字符串亦可时另一个列表。
#基础playbook格式
---
- hosts: 应用主机
gather_facts:no 设置不收集被控主机信息
tasks:
- name: 自定义task名
模块名: 模块相关参数
- name: 自定义task名
模块名: 模块相关参数
...
handlers/notify
handlers本质上是tasks list,与notify成对出现。类似于触发器,当playbook剧本中的某个task满足条件后会通过notify调用对应的handlers任务。
变量
变量定义: K=V ,如variable=values
变量调用: {{ variable }} 或 “{{ variable }}”
变量定义方式:
- 命令行中定义: ansible-playbook -e k=V
- yaml文件中定义:
---
- hosts: all
vars:
- host: lvant
- system_os: centos
tasks:
- name: file create
file: path=/root/{{ host }}_{{ system_os }}.file state=touch - 使用变量文件:
# cat vars.yml //变量文件 --- system_version: 7 child_version: 6
# cat test_file_var.yml //playbook文件
---
- hosts: all
vars_files:
- vars.yml
tasks:
- name: touch file
file: path=/root/{{ system_version }}_{{ child_version }}.filetxt state=touch - /etc/ansible/hosts中定义:
#其中host和machine就是自定义的变量
[lvs] lvs1 host=test1 ansible_ssh_host=192.168.111.11 ansible_ssh_user='root' ansible_ssh_pass='yinwan' ansible_ssh_port=22 lvs2 host=test2 ansible_ssh_host=192.168.111.12 ansible_ssh_user='root' ansible_ssh_pass='yinwan' ansible_ssh_port=22 [lvs:vars] machine=lvs