ansible基础入门
Ansible基础入门
Ansible是一个自动化管理工具,是基于模块化工作的,调用特定的模块,完成相应的任务,基于yaml来批量完成任务的模块化,支持playbook,基于python语言实现,主要是用paramiko、pyyaml和jinja2三个关键模块,部署简单,主从模式,支持自定义模块,幂等性:允许重复执行N次,没有变化时,只会执行第一次。
Ansible的主要目标是简单和易用,无客户端,使用Openssh来进行数据传输。
Ansible功能
- 配置管理 Configuration(cfengine,chef,puppet)
- 部署发布 Deployment(Capistrano,Fabric)
- 命令行批量执行 Ad-Host Task(func)
- 多层次任务编排 Multi-Ter Orchestration(Juju,sort of)
Ansible特点
- 部署简单,只需要在主控端部署Ansible环境,被控端无需作任何操作
- 默认使用SSH协议对设备进行管理
- 主从集中化管理
- 配置简单、功能强大、扩展性强
- 支持API及自定义模块、可以通过Python轻松扩展
- 通过Playbooks来定制强大的配置、状态管理
Ansible架构
- Core Modules:核心模块,Ansible自带的模块。
- Custom Modules:自定义模块,上途中错写成Costome,如果核心模块不足以完成某种功能,可以自行添加自定义模块(支持现在主流的大部分编程语言,甚至于shell)
- Plugins:插件,支持使用插件的方式对ansible本身的功能进行扩展,模块是用来实现任务的,增强ansible平台自己的功能就需要使用插件(loggin插件记录日志,email插件发送邮件),其中最常用的是:连接插件(Connectionr Plugins)ansible基于连接插件连接到各个主机上,虽然默认情况下ansible使用ssh连接到各个主机上,但它还支持其它的连接方法。
- Host Inventory:主机群,主机清单,定义ansible管理的主机,还可以存放一下针对不同主机的变量,也可以写入主机的用户名和密码
- Playbooks:ansible的任务配置文件,将多个任务定义在剧中本,由ansible自动执行
Ansible工作原理:把我们执行的命令翻译为shell命令,通过openssh拷贝到目标主机 /root/.ansible/tmp/
下,然后再执行,执行完成后删除tmp文件
Ansible安装
ansible被redhat在2015年收购后,在yum源中直接安装即可
yum install ansible
#ansible格式
ansible <host-pattern> [options]
#参数详解
--version #ansible版本信息
-v #显示详细信息
-i #主机清单文件路径,默认是在/etc/ansible/hosts
-m #使用的模块名称,默认使用command模块
-a #使用的模块参数,模块的具体动作
-k #提示输入ssh密码,而不使用基于ssh的密钥认证
-C #模拟执行测试,但不会真的执行
-T #执行命令的超时
#从Ansible 2.9版本开始,它支持命令的选项补全功能,它依赖于python的argcomplete插件
yum -y install python-argcomplete
#安装完成后,还需激活该插件
activate-global-python-argcomplete
命令说明
ansible --help
Usage: ansible <host-pattern> [options]
选项:
-a MODULE_ARGS, --args=MODULE_ARGS #指定模块的参数
--ask-vault-pass #询问账号的密码
-B SECONDS, --background=SECONDS #异步运行,在指定秒后异步运行失败
-C, --check #不做出任何改变,只是进行测试检查
-D, --diff #当更改(小)文件和模板时,显示这些文件中的差异
-e EXTRA_VARS, --extra-vars=EXTRA_VARS #将其他变量设置为key=value或YAML/JSON,如果文件名前面有@
-f FORKS, --forks=FORKS #指定要使用的并行进程数,例如100台机器,-f指定每次运行几台,默认每次运行5台
-i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY #指定主机列表路径,如果不指定,默认为/etc/ansible/ansible.cfg中指定的hosts
-l SUBSET, --limit=SUBSET #将选定的主机限制为附加模式。
--list-hosts #列出清单中的主机列表,不进行任何操作
-m MODULE_NAME, --module-name=MODULE_NAME #指定要执行的模块名称,默认为 command 模块
-M MODULE_PATH, --module-path=MODULE_PATH #指定要执行模块的路径,默认模块路径为~/.ansible/plugins/modules:/usr/share/ansible/plugins
-o, --one-line #浓缩输出
--playbook-dir=BASEDIR #指定playbook文件目录
-P POLL_INTERVAL, --poll=POLL_INTERVAL #指定轮训间隔时间,默认为15
--syntax-check #如果使用了playbook则执行--syntax-check对剧本进行check
-t TREE, --tree=TREE #将ansible输出记录到指定目录
--vault-id=VAULT_IDS the vault identity to use
--vault-password-file=VAULT_PASSWORD_FILES
vault password file
-v, --verbose #详细模式(-VVV更多,-VVVV可启用连接调试)
--version #显示程序的版本号、配置文件位置、配置模块搜索路径、模块位置、可执行位置和退出
特权提升选项:
-b, --become #临时使用--become-method指定的提取方法
--become-method=BECOME_METHOD #使用权限提升方法(默认值=sudo)
--become-user=BECOME_USER #以该用户的身份运行操作(默认值=root)
-K, --ask-become-pass #请求权限提升密码
连接选项:
-k, --ask-pass #请求连接密码
--private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE #指定私钥文件进行登录
-u REMOTE_USER, --user=REMOTE_USER #指定连接用户,默认不指定则为hosts文件中用户
-c CONNECTION, --connection=CONNECTION #连接方式,默认为smart,还有ssh和sftp
-T TIMEOUT, --timeout=TIMEOUT #ansible连接超时时间,默认为10s
--ssh-common-args=SSH_COMMON_ARGS #指定要传递到SFTP/SCP/SSH的常见参数(例如ProxyCommand)
--sftp-extra-args=SFTP_EXTRA_ARGS #指定要传递到SFTP的额外参数(例如-f、-l)
--scp-extra-args=SCP_EXTRA_ARGS #指定要传递到SCP的额外参数(例如-1)
--ssh-extra-args=SSH_EXTRA_ARGS #指定只传递给ssh的额外参数(例如-R)
ansible-doc文档工具:
ansible-doc -h
Usage: ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]
Options:
-j, --json #仅用于内部测试,为所有插件转储json元数据
-l, --list #列出ansible内置的所有模块
-F, --list_files #在没有摘要的情况下显示插件名及其源文件(暗示-列表)
-M MODULE_PATH, --module-path=MODULE_PATH #模块路径,默认为 ~/.ansible/plugins/modules:/usr/share/ansible/plugins/modules
-s, --snippet #显示指定插件的参数等,用法 ansible-doc -s module_name
-t TYPE, --type=TYPE #选择插件类型,默认为模块
安装文件说明
rpm -qi ansible #查看ansible版本信息
rpm -qa ansible #查看ansible包名称
rpm -ql ansible #查看ansible安装目录
/etc/ansible #ansible主目录
/etc/ansible/ansible.cfg #ansible主配置文件
/etc/ansible/hosts #ansible主机清单
/etc/ansible/roles #ansible角色目录
/usr/bin/ansible #ansible主程序目录
/usr/bin/ansible-connection #ansible连接工具
/usr/bin/ansible-console #ansible控制台
/usr/bin/ansible-doc #ansible文档工具
/usr/bin/ansible-galaxy #ansible galaxy
/usr/bin/ansible-inventory #ansible资产
/usr/bin/ansible-playbook #ansible playbook剧本工具
/usr/bin/ansible-pull #ansible pull是指在客户端组件基于ansible pull的方式从服务器上拉取文件
ansible.cfs配置解析
[default]
inventory = /etc/ansible/hosts #被控端主机清单文件(也就是inventory)
library = /usr/share/my_modules/ #指定ansible搜索模块位置,如果需要自定ansible模块,需要放到 library 所指定的目录下
remote_tmp = ~/.ansible/tmp #临时文件远程主机存放目录
local_tmp = ~/.ansible/tmp #临时文件本地主机存放目录
forks = 5 #ansible在执行工作时进程数量
poll_interval = 15 #默认轮询间隔时间,单位秒
sudo_user = root #被控端默认执行sudo命令所切换的用户
ask_sudo_pass = True #每次执行sudo命令时是否询问sudo到目标用户的密码
ask_pass = True #每次执行ansible命令是否询问ssh密码
transport = smart #通信机制
remote_port = 22 #远程连接被控端的ssh端口
module_lang = C #模块和系统之间通信的语言,默认为C语言
gathering = implicit #控制默认facts收集,远程系统变量
roles_path = /etc/ansible/roles #角色存储路径
host_key_checking = False #是否检查远程主机密钥
sudo_exe = sudo #sudo远程执行命令
sudo_flags = -H -S -n #传递sudo之外的参数
timeout = 10 #SSH超时时间
remote_user = root #指定默认的远程连接用户
log_path = /var/log/ansible.log #ansible日志文件,执行ansible的用户需要对日志文件具有写入权限
module_name = command #ansible默认执行的模块
executable = /bin/sh #执行的shell环境,用户shell模块
hash_behaviour = replace #如果变量重叠,优先级更高的一个是替换优先级低得还是合并在一起,默认为替换
private_role_vars = yes #默认情况下,角色中的变量将在全局变量范围中可见。 为了防止这种情况,可以启用以下选项,只有tasks的任务和handlers得任务可以看到角色变量
private_key_file = /path/to/file #私钥文件存储位置
command_warnings = False #command模块Ansible默认发出警告
nocolor = 1 #ansible输出带上颜色区别,0表示开启,1表示关闭
pipelining = False #开启pipe ssh通道优化
[inventory]
[privilege_escalation]
#出于安全角度考虑,部分公司不希望直接以root的高级管理员权限直接部署应用,往往会开放普通用户权限并给予sudo的权限,该部分配置主要针对sudo用户提权的配置
become=True #是否sudo
become_method=sudo #sudo方式
become_user=root #sudo后变为root用户
become_ask_pass=False #sudo后是否需要验证密码
[paramiko_connection]
pty=False #是否禁用sudo功能
[ssh_connection]
#Ansible默认使用SSH协议连接对端主机,该部署是主要是SSH连接的一些配置,但配置项较少,多数默认即可
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s #ssh连接时的参数
pipelining = False #SSH pipelining 是一个加速 Ansible 执行速度的简单方法。ssh pipelining 默认是关闭,之所以默认关闭是为了兼容不同的 sudo 配置,主要是 requiretty 选项。如果不使用 sudo,建议开启。打开此选项可以减少 ansible 执行没有传输时 ssh 在被控机器上执行任务的连接数。不过,如果使用 sudo,必须关闭 requiretty 选项
scp_if_ssh = smart #该项为True时,如果连接类型是ssh,使ansible使用scp,为False是,ansible使用sftp。默认为smart,smart为先尝试sftp,然后尝试scp
[persistent_connection] #持续连接
connect_timeout = 30 #ansible如果在30秒内没有收到请求,则关闭连接,默认为30秒
command_timeout = 30 #ansible执行命令如果在30秒内没有收到回应则认为命令超时
[accelerate] #缓存加速
accelerate_port = 5099 #加速连接端口5099
accelerate_timeout = 30 #命令执行超时时间
ccelerate_connect_timeout = 5.0 #连接超时时间,单位为秒
accelerate_daemon_timeout = 30 #上一个活动连接的时间,单位为分钟
accelerate_multi_key = yes #允许多个私钥被加载到daemon
[selinux]
special_context_filesystems=nfs,vboxsf,fuse,ramfs,9p #文件系统在处理安全上下文时需要特殊处理,定义复制现有上下文的文件系统
libvirt_lxc_noseclabel = yes #将此设置为yes,以允许libvirt_lxc连接在没有SELinux的情况下工作
[colors]
#Ansible对于输出结果的颜色也进行了详尽的定义且可配置,该选项对日常功能应用影响不大,几乎不用修改,保持默认即可。
highlight = white
verbose = blue
warn = bright purple
error = red
debug = dark gray
deprecate = purple
skip = cyan
unreachable = red
ok = green
changed = yellow
diff_add = green
diff_remove = red
diff_lines = cyan
[diff]
always = no
context = 3
主机清单文件inventory
文档:http://www.ansible.com.cn/docs/intro_inventory.html
Inventory文件通常用于定义要管理的主机的认证信息,例如ssh登录用户名、密码以及key相关信息。可以同时操作一个组的多台主机,组与主机组之间的关系都是通过inventory文件配置。配置文件路径为:/etc/ansible/hosts
在配置文件/etc/ansible/ansible.cfg
中
inventory = /etc/ansible/hosts
默认的inventory file为 /etc/ansible/hosts,inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成
文档:https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
inventory参数说明
文档:http://www.ansible.com.cn/docs/intro_inventory.html
主机清单写法示例
远程连接被控端,hosts配置示例(有基于账号密码的和基于密钥的连接方式):
参数可以参照上面的说明
Ansible默认预定义了两个主机组:all分组和ungrouped分组。
all分组中包含所有分组内的节点
ungrouped分组包含所有不在分组内的节点
这两个分组都不包含localhost这个特殊的节点
定义了inventory之后,可以使用ansible --list或ansible--playbook --list命令来查看主机组的信息,还可以使用更为专业的ansible-inventory命令来查看主机组信息。
# 使用ansible或ansible-playbook列出所有主机
$ ansible -i /etc/ansible/hosts nginx --list
# 使用ansible-inventory列出nginx组中的主机
$ ansible-inventory -i /etc/ansible/hosts nginx --graph
# 使用ansible-inventory列出nginx组中的主机,同时带上变量
$ ansible-inventory nginx --graph --vars
# 使用ansible-inventory列出all组内的主机
$ ansible-inventory --graph all
# 使用ansible-inventory以json格式列出所有主机的信息
$ ansible-inventory --list
基于账号密码的连接
第一种写法
[axxl]
app_node1 ansible_ssh_host=172.26.3.57 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
app_node2 ansible_ssh_host=172.26.3.58 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
#分组名称为 [axxl]
app_node:为主机的别名,如果使用ansible_ssh_host参数就必须要指定别名
ansible_ssh_host:指定主机地址
ansible_ssh_port:指定主机端口
ansible_ssh_user:指定连接用户
ansible_ssh_pass:指定连接密码
第二种写法
[mbxy]
172.26.3.[81:82] ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_private_key_file=/root/.ssh/id_rsa
#分组名称为 [mbxy]
172.26.3.[81:82]:目标主机地址, [81:82]使用表达式来匹配同网段主机,可以多写一些,例如:172.26.3.[81:100],则执行81-100之内的所有地址
ansible_ssh_private_key_file:明文密码写入hosts文件不安全,可以通过私钥来进行连接
第三种写法
[ybx]
172.26.3.84
172.26.3.85
[ybx:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass=123456
#分组名称为 [ybx]
[ybx:vars]:只针对 [ybx]分组内的机器使用该变量
第四种写法
[nginx]
172.26.3.62
[mbkz]
172.26.3.81
[all:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass=123456
#多个分组 [nginx] [mbkz]
[all:vars]:对hosts文件内所有的分组应用此变量
第五种写法
[dbservers]
db01.intranet.mydomain.net
db02.intranet.mydomain.net
#主机名
如果目标地址的主机名本机可以解析,那么也可以添加主机名
第六种写法
db-[99:101]-node.example.com
#域名或主机名的正则表达式匹配
第七种写法
[nginx]
172.26.3.60
172.26.3.61
[apache]
192.168.200.3[0:3]
[webservers:children]
nginx
apache
#分组嵌套,可以通过[GROUP:children]的方式定义一个主机组,并在其中包含子组。
#其中webservers主机组中包含了nginx组合apache组内的所有主机
#也可以递归嵌套,比如这个webserver组又可以作为其他组的子组
基于密钥的连接
基于秘钥连接需要先创建公钥和私钥,并发送给被管理机器
[root@ansible ~]# ssh-keygen
[root@ansible ~]# for i in {1,2,3,6}; do ssh-copy-id -i 192.168.1.3$i ; done
取消ssh时的yes验证
1.全部取消yes验证:在/etc/ssh/ssh_config中找到StrictHostKeyChecking,设为no
若只想单个用户,如root,echo "StrictHostKeyChecking no" > ~/.ssh/config
2.在ansible的配置文件/etc/ansible/ansible.cfg中,配置host_key_checking = False(取消注释)
写法没有区别,只需要配合相关的主机端口等即可
#主机+端口+密钥
[webserver]
192.168.1.31:22
192.168.1.32
192.168.1.33
#别名+端口+密钥
[webserver]
node1 ansible_ssh_host=192.168.1.31 ansible_ssh_port=22
node2 ansible_ssh_host=192.168.1.32 ansible_ssh_port=22
node3 ansible_ssh_host=192.168.1.33 ansible_ssh_port=22
多个inventory文件
当节点众多,环境复杂,逻辑上不好区分时,可以考虑去定义多个inventory文件,放在一个目录,再将ansible配置文件中的inventory指定的路径改到这个目录即可。(也就是inventory指定为目录路径,不指定为单个文件)
例如:
默认的是/etc/ansible/hosts
,在配置文件中改为:
inventory = /etc/ansible/inventorys
#在指定的目录/etc/ansible/inventorys下创建对应的inventory文件
#比如穿件a,b两个文件
#/etc/ansible/inventorys/a文件内容
[nginx]
192.168.32.135
192.168.32.136
192.168.32.137
[apache]
192.168.100.3[0:3]
#/etc/ansible/inventorys/b文件内容
[mysql]
192.168.100.21
192.168.100.22
[web:children]
apache
nginx
[os:children]
web
mysql
ansible或ansible-playbook命令使用-i INVENTORY选项指定的路径应当为目录
或者需要时指定到需要的那个文件
查看所有主机:
[root@ela1 inventorys]# ansible-inventory -i /etc/ansible/inventorys --graph all
@all:
|--@os:
| |--@mysql:
| | |--192.168.100.21
| | |--192.168.100.22
| |--@web:
| | |--@apache:
| | | |--192.168.100.30
| | | |--192.168.100.31
| | | |--192.168.100.32
| | | |--192.168.100.33
| | |--@nginx:
| | | |--192.168.32.135
| | | |--192.168.32.136
| | | |--192.168.32.137
|--@ungrouped:
inventory指定为目录时,inventory文件最好不要带有后缀,就像示例中的a和b文件。因为Ansible当使用目录作为inventory时,默认将忽略一些后缀的文件不去解析。需要修改配置文件中的inventory_ignore_extensions项来禁止忽略指定后缀(如ini后缀)的文件。
#inventory_ignore_extensions = ~, .orig, .bak, .ini, .cfg, .retry, .pyc, .pyo
inventory_ignore_extensions = ~, .orig, .bak, .cfg, .retry, .pyc, .pyo
动态的inventory和临时添加主机
文档:https://ansible-tran.readthedocs.io/en/latest/docs/intro_dynamic_inventory.html
静态 Inventory 指的是在文件中指定的主机和组,动态 Inventory 指通过外部获取主机列表,并按照 ansible 所要求的格式返回给 ansilbe 命令的。
如:
1.从某些云端平台获取
2.cobbler
3.CMDB
4.LDAP
不仅如此,Ansible还可以通过特殊的模块add_host来临时添加主机(也就是临时找来的演员),通过group_by来临时设置主机组。这种方式添加的主机或主机组都只在内存中,只在Ansible运行时生效,Ansible退出之后就消失。
但无论是动态
ansible配置文件读取顺序
通过操作系统自带的包管理器(比如yum、dnf、apt)安装的Ansible一般都会提供好Ansible的配置文件/etc/ansible/ansible.cfg。
这是Ansible默认的全局配置文件。实际上,Ansible支持4种方式指定配置文件,它们的解析顺序从上到下:
- ANSIBLE_CFG: 环境变量指定的配置文件
- ansible.cfg: 当前目录下的ansible.cfg
- ~/.ansible.cfg: 家目录下的ansible.cfg
- /etc/ansible/ansible.cfg:默认的全局配置文件
#ansible-config.1.gz中有详细介绍
rpm -ql ansible
zcat /usr/share/man/man1/ansible-config.1.gz
#要查看完整列表,请访问https://docs.ansibe.com/或使用ansibe-config命令。
For a full list check \fI\%https://docs.ansible.com/\fP\&. or use the \fIansible\-config\fP command.
#/etc/ansible/ansible.cfg 配置文件,如果存在则使用
/etc/ansible/ansible.cfg \-\- Config file, used if present
#~/.ansible.cfg 用户配置文件,覆盖默认配置(如果存在)
~/.ansible.cfg \-\- User config file, overrides the default config if present
#\&/ansible.cfg 本地配置文件(在当前工作目录中)假定为(aqproject-specific)(aq,如果存在,则重写其余文件)。
\&./ansible.cfg \-\- Local config file (in current working directory) assumed to be \(aqproject specific\(aq and overrides the rest if present.
#如上所述,ANSIBLE_CONFIG环境变量将覆盖所有其他环境变量。
As mentioned above, the ANSIBLE_CONFIG environment variable will override all others.