Ansible
目录
简介
Ansible官方文档:https://docs.ansible.com/ansible/latest/index.html
什么是Ansible
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
Ansible的特性
模块化: 调用特定的模块,完成特定任务
有paramiko、pyyaml、jinja2三个关键模块
支持自定义模块
基于Python实现
部署简单、基于Python和ssh(默认已安装),agentless
安全,基于OpenSSH
支持playbook编排任务
幂等性: 一个任务执行一遍和执行N遍效果一样,不因重复执行带来意外情况
无需代理
可使用任务编程语言写模块
YAML格式,编排任务,支持丰富的数据结构
较强大的多层解决方案(roles、playbook、command等)
Ansible的目录结构
/etc/ansible #ansible主目录
/etc/ansible/ansible.cfg #ansible主配置文件
/etc/ansible/hosts #ansible主机清单
/etc/ansible/roles #ansible角色目录
Ansible的架构
Ansible的工作流程
Ansible 1.3及之后的版本默认会在本地的 OpenSSH
在Ansible 1.2 及之前的版本,默认将会使用 paramiko. 本地OpenSSH必须通过-c ssh 或者 在配置文件中设定.
# 一共6步
1、加载配置文件 默认/etc/ansible/ansible.cfg
2、加载模块文件 例如command
3、通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/xxx.py
4、给文件+x执行
5、执行并返回结果
6、删除临时py文件并退出
Ansible配置文件详解
# config file for ansible -- https://ansible.com/
# ===============================================
# nearly all parameters can be overridden in ansible-playbook
# or with command line flags. ansible will read ANSIBLE_CONFIG,
# ansible.cfg in the current working directory, .ansible.cfg in
# the home directory or /etc/ansible/ansible.cfg, whichever it
# finds first
[defaults]
# some basic default values... 一些基本的默认值
#inventory = /etc/ansible/hosts #该参数表示资源清单inventory文件的位置,资源清单就是一些Ansible需要连接管理的主机列表
#library = /usr/share/my_modules/ #Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录
#module_utils = /usr/share/my_module_utils/
#remote_tmp = ~/.ansible/tmp #指定远程执行的路径
#local_tmp = ~/.ansible/tmp #ansible管理节点的执行路径
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
#forks = 5 #设置默认情况下Ansible最多能有多少个进程同时工作,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管理节点的数量来确定。
#poll_interval = 15 #轮询间隔
#sudo_user = root #sudo使用的默认用户 ,默认是root
#ask_sudo_pass = True #是否需要用户输入sudo密码
#ask_pass = True #是否需要用户输入连接密码
#transport = smart
#remote_port = 22 #这是指定连接对端节点的管理端口,默认是22,除非设置了特殊的SSH端口,不然这个参数一般是不需要修改的
#module_lang = C #这是默认模块和系统之间通信的计算机语言,默认为’C’语言.
#module_set_locale = False #跳过ssh首次连接提示验证部分,False表示跳过。
# plays will gather facts by default, which contain information about
# the remote system.
#
#智能-默认情况下收集,但如果已经收集,则不重新聚集
#隐式-默认情况下,使用“聚集事实”禁用:False
#显式-默认情况下不收集,必须说收集事实:True
#gathering = implicit
#这只会影响戏剧的“收集事实”指令所做的收集,
#默认情况下,收集检索所有事实子集
#全部-收集所有子集
#网络-收集min和网络事实
#硬件-收集硬件事实(要检索的最长事实)
#虚拟-收集最小值和虚拟事实
#facter-从facter导入事实
#ohai-从ohai导入事实
#可以使用逗号将它们组合在一起(例如:网络、虚拟)
#你可以用它来否定它们!(例如:!硬件,!制造商,!ohai)
#总是会收集到最少量的事实。d.
#gather_subset = all
#收集了一些与硬件相关的事实
#最长超时时间为10秒。这
#选项允许您增加或减少该值
#超时到更适合
#环境。
# gather_timeout = 10
#Ansible_事实中包含Ansible_事实。*词典
#名称空间。此设置保持先前默认的行为
#将这些变量复制到主命名空间中,每个变量都带有
#“ansible_”的前缀。
#为了向后兼容,此变量默认设置为True。信息技术
#将在未来的版本中更改为默认值“False”。
#可解释的事实。
# inject_facts_as_vars = True
#在中搜索角色的其他路径,冒号分隔
#roles_path = /etc/ansible/roles
#取消对此的注释以禁用SSH密钥主机检查
#host_key_checking = False
#更改默认回调,一次只能启用一个“stdout”类型。
#stdout_callback = skippy
##Ansible附带了一些需要白名单的插件,
##这样做是为了避免在默认情况下运行所有类型。
##这些设置列出了要为系统启用的设置。
##除非插件作者指定hor specifies it.
#启用回调插件,它们可以输出到
#callback_whitelist = timer, mail
#通过以下方法确定任务和处理程序中的包含是否“静态”
#默认。从2.0开始,默认情况下包含是动态的。设置这些
#值为True将使包含的行为更像在
# 1.x版本。
#task_includes_static = False
#handler_includes_static = False
#控制通知事件缺少的处理程序是错误还是警告
#error_on_missing_handler = True
#为其他sudo实现更改此选项
#sudo_exe = sudo
#什么旗帜要传给sudo
#警告:忽略默认值可能会产生意外行为
#sudo_flags = -H -S -n
#SSH超时
#timeout = 10
#未指定用户时用于剧本的默认用户
#(/usr/bin/ansible将使用当前用户作为默认值)
#remote_user = root
#除非定义了此路径,否则默认情况下将关闭日志记录
#如果这样定义,请考虑logrotate
#log_path = /var/log/ansible.log
#/usr/bin/ansible的默认模块名
#module_name = command
#这个shell用于在sudo下执行的命令
#在极少数情况下,您可能需要将其更改为bin/bash
#如果sudo受到约束
#executable = /bin/sh
#如果库存变量重叠,那么优先级较高的变量会赢吗
#还是哈希值合并在一起?默认值为“替换”,但
#这也可以设置为“合并”。
#hash_behaviour = replace
#默认情况下,来自角色的变量将在全局变量中可见
#范围。为了防止出现这种情况,可以启用以下选项,并且只有
#角色中的任务和处理程序将在那里看到变量here
#private_role_vars = yes
#在此最初要启用的任何Jinja 2
#jinja2_extensions = jinja2.ext.do,jinja2.ext.i18n
#如果已设置,请始终使用此私钥文件进行身份验证
#如果可以或ansible-转发的友好
#private_key_file = /path/to/file
#如果已设置,则将Vault密码文件的路径配置为
#在密码中指定文件--。
#vault_password_file = /path/to/vault_password_file
#Jinja2中可用的字符串{ansible_managed}格式
#模板向用户指示编辑模板的文件将被替换。
#用正确的值替换{file}、{host}和{uid}以及strftime代码。
#ansible_managed=ansible managed:{file}在%Y-%m-%d%H:%m:%S上被{host}上的{uid}修改
#{file}、{host}、{uid}和时间戳都会干扰幂等性
#在某些情况下,默认为静态字符串:
#ansible_managed = Ansible managed
#默认情况下,如果ansible playbook确定任务,它将显示“跳过[主机]”
#不应在主机上运行。如果不想看到这些“跳过”,请将其设置为“False”
#留言。注意:无论任务是否完成,任务标题仍将显示
#任务被跳过。
#display_skipped_hosts = True
#默认情况下,如果剧本中的任务不包含名称:字段,则
#ansible playbook将构造一个包含任务操作的标题,但
#不是任务的args。这是一个安全特性,因为ansible无法知道
#如果*模块*在
#标题已打印。如果您的环境没有安全问题
#来自ansible playbook的stdout(或者您已在您的
#所有你有秘密信息的任务的剧本)然后你可以
#安全地将其设置为True以获取更多信息。
#display_args_to_stdout = False
#默认情况下(从1.3开始),Ansible在尝试取消引用时会引发错误
#Jinja2未在模板或操作行中设置的变量。取消注释这一行
#将行为恢复到1.3之前。
#error_on_undefined_vars = False
#默认情况下(从1.6开始),Ansible可能会根据服务器的配置显示警告
#自动运行ansible的系统。这可能包括关于第三方软件包或
#如有可能,应解决的其他情况。
#要禁用这些警告,请将以下值设置为False:
#system_warnings = True
#默认情况下(从1.4开始),Ansible可能会显示语言的弃用警告
#不应再使用且将在未来版本中删除的功能。
#要禁用这些警告,请将以下值设置为False:
#deprecation_warnings = True
#(从1.8开始),Ansible可以在使用shell和
#通过使用默认的Ansible模块,命令模块似乎得到了简化
#相反。这些警告可以通过调整以下参数来消除:
#在命令行末尾设置或添加warn=yes或warn=no
#参数字符串。例如,这将建议使用git模块
#而不是向git命令开火。
# command_warnings = False
#在此处设置插件路径目录,用冒号分隔
#action_plugins = /usr/share/ansible/plugins/action
#become_plugins = /usr/share/ansible/plugins/become
#cache_plugins = /usr/share/ansible/plugins/cache
#callback_plugins = /usr/share/ansible/plugins/callback
#connection_plugins = /usr/share/ansible/plugins/connection
#lookup_plugins = /usr/share/ansible/plugins/lookup
#inventory_plugins = /usr/share/ansible/plugins/inventory
#vars_plugins = /usr/share/ansible/plugins/vars
#filter_plugins = /usr/share/ansible/plugins/filter
#test_plugins = /usr/share/ansible/plugins/test
#terminal_plugins = /usr/share/ansible/plugins/terminal
#strategy_plugins = /usr/share/ansible/plugins/strategy
#默认情况下,ansible将使用“线性”策略,但您可能想尝试另一种策略
#strategy = free
#默认情况下,不会为/bin/ansible加载回调,如果需要,请启用此选项
#例如,希望通知或日志回调也适用于
#/bin/ansible runs
#bin_ansible_callbacks = False
#你不喜欢牛吗?这太不幸了。
#如果不希望cowsay支持或导出ANSIBLE_NOCOWS=1,请将设置为1
#nocows = 1
#设置默认情况下要使用的cowsay模具。当设置为“随机”时,
#将为每个任务选择一个随机模具。选择将被过滤
#反对下面的“cow_白名单”选项。
#cow_selection = default
#cow_selection = random
#对cowsay使用“随机”选项时,模具将仅限于此列表。
#它的格式应该是逗号分隔的列表,名称之间没有空格。
#注意:作为INI解析器,这里的行连续体仅用于格式化目的
#在python中不支持它们。
#cow_whitelist=芽蛙、兔子、奶酪、守护程序、默认值、龙、蛇中的大象、大象、眼睛、\
#hellokitty,kitty,luke koala,喵喵,milk,moofasa,moose,ren,绵羊,small,剑龙\
#stimpy,supermilker,三只眼睛,火鸡,乌龟,燕尾服,乳房,维德考拉,维德,www
#你也不喜欢颜色吗?
#如果不需要颜色,请设置为1,或导出ANSIBLE_NOCOLOR=1
#nocolor = 1
#如果设置为持久类型(不是“内存”,例如“redis”),则为事实值
#将存储以前在Ansible中运行的数据。这可能在以下情况下有用:
#例如,想要使用来自一组服务器的IP信息
#不必在同一个剧本中与他们交谈就可以得到他们的答案
#当前IP信息。
#fact_caching = memory
#此选项告诉Ansible在哪里缓存事实。该值取决于插件。
#对于jsonfile插件,它应该是本地目录的路径。
#对于redis插件,该值是一个主机:端口:数据库三元组:fact_caching_connection=localhost:6379:0
#For the redis plugin, the value is a host:port:database triplet: fact_caching_connection = localhost:6379:0
#fact_caching_connection=/tmp
#重试文件
#当剧本失败时。可以创建重试文件,该文件将放置在~/
#您可以通过将retry_files_enabled设置为True来启用此功能
#您可以通过设置重试文件保存路径来更改文件的位置
#retry_files_enabled = False
#retry_files_save_path = ~/.ansible-retry
#挤压动作
#Ansible可以优化使用列表参数调用模块的操作
#循环时。与使用uItem每个调用一次模块不同
#一次调用模块,同时调用所有项。目前这只起作用
#在有限的情况下,仅使用名为“name”的参数。
#squash_actions = apk,apt,dnf,homebrew,pacman,pkgng,yum,zypper
#防止记录任务数据,默认情况下关闭
#no_log = False
#防止记录任务,但仅在目标上,数据仍记录在主/控制器上
#no_target_syslog = False
#控制如果任务没有响应,Ansible是否会引发错误或警告
#选择,但创建世界可读的临时文件以在其上执行模块
#远程机器。出于安全考虑,此选项默认为False。用户可以
#启用此选项可以使行为更像Ansible 2.1之前的版本。x、 看到了吗
# https://docs.ansible.com/ansible/become.html#becoming-没有特权的用户
#获取比启用此选项更安全的修复方法。
#allow_world_readable_tmpfiles = False
#控制发送到的变量的压缩级别
#工作进程。默认值为0时,不进行压缩
#被使用了。此值必须是0到9之间的整数。
#var_compression_level = 9
#控制在以下情况下对新型ansible模块使用的压缩方法:
#它们被发送到远程系统。压缩类型取决于
#支持编译成控制器的python和客户端的python。
#名称应与python Zipfile压缩类型匹配:
#*ZIP_存储(无压缩。随处可用)
#*ZIP_DEFLATED(使用zlib,默认值)
#这些值可以通过ansible_模块_压缩清单按主机设置
#变数
#module_compression = 'ZIP_DEFLATED'
#这将控制文件的--diff上的截止点(以字节为单位)
#设置为0表示无限(RAM可能会受到影响!)。
#max_diff_size = 1048576
#这控制ansible如何处理多个--tags和--skip tags参数
#在CLI上。如果这是真的,那么多个参数合并在一起。如果
#如果为False,则使用最后指定的参数,忽略其他参数。
#此选项将在2.8中删除。
#merge_multiple_cli_flags = True
#控件在末尾显示自定义统计信息,默认情况下处于禁用状态
#show_custom_stats = True
#控制在使用目录作为资源清册时忽略哪些文件
#可能有多个来源(静态和动态)
#inventory_ignore_extensions = ~, .orig, .bak, .ini, .cfg, .retry, .pyc, .pyo
#这一系列模块使用为网络设备优化的替代执行路径
#仅当您知道此设置的工作原理时才更新此设置,否则可能会中断模块执行
#network_group_modules=eos, nxos, ios, iosxr, junos, vyos
#启用时,此选项允许查找(通过{lookup('foo')}等变量)或用作
#带有“with_foo”的循环,用于返回未标记为“不安全”的数据。这意味着数据可能包含
#jinja2模板语言,将通过模板引擎运行。
#启用此功能可能会带来安全风险
#allow_unsafe_lookups = False
#为所有播放设置默认错误
#any_errors_fatal = False
[inventory]
# 启用清单插件,默认为:“主机列表”、“脚本”、“自动”、“yaml”、“ini”、“toml”
#enable_plugins = host_list, virtualbox, yaml, constructed
#将目录解析为资源清册源时忽略这些扩展
#ignore_extensions = .pyc, .pyo, .swp, .bak, ~, .rpm, .md, .txt, ~, .orig, .ini, .cfg, .retry
#将目录解析为资源清册源时,忽略与这些模式匹配的文件
#ignore_patterns=
#如果“true”未分析的库存源成为致命错误,则为警告。
#unparsed_is_failed=False
[privilege_escalation]
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False
[paramiko_connection]
#取消对此行的注释,使paramiko连接插件不记录新主机
#遇到密钥。增加新主机的性能。设置独立于
#上面的主机密钥检查设置。
#record_host_keys=False
#默认情况下,Ansible为在sudo下执行的命令请求一个伪终端。取消对此的注释
#行以禁用此行为。
#pty=False
#paramiko在尝试查找SSH密钥时,默认情况下会首先查找SSH密钥
#对远程设备进行身份验证。这是一些网络设备的问题
#在密钥故障后关闭连接。将此行取消注释为
#禁用Paramiko查找钥匙功能
#look_for_keys = False
#当使用与Paramiko的持久连接时,该连接以
#后台处理。如果主机还没有有效的SSH密钥,则
#默认Ansible将提示添加主机密钥。这将导致连接
#在后台进程中运行会失败。取消对此行的注释,使其具有
#Paramiko自动添加主机密钥。
#host_key_auto_add = True
[ssh_connection]
#要使用的ssh参数
#禁用ControlPersist将导致性能不佳,因此请使用
#在较旧的平台上使用paramiko,而不是将其删除,-C控制压缩use
#ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s
#ControlPath套接字的基本目录。
#这是控制路径选项中的“%(目录)s”
#
# Example:
# control_path_dir = /tmp/.ansible/cp
#control_path_dir = ~/.ansible/cp
#用于ControlPath套接字的路径。这默认为主机名的哈希字符串,
#端口和用户名(配置中的空字符串)。散列可以缓解用户的一个常见问题
#使用长主机名和传统的%(目录)s/ansible ssh-%%h-%%p-%%r格式找到。
#在这些情况下,将发生“对于Unix域套接字来说太长”ssh错误.
#
# Example:
# control_path = %(directory)s/%%h-%%r
#control_path =
#启用管道可以减少执行所需的SSH操作的数量
#在远程服务器上执行模块。这可能会导致严重的后果
#启用时的性能改进,但是使用“sudo:”时必须
#首先在/etc/sudoers中禁用“requirety”
#
#默认情况下,禁用此选项以保持与的兼容性
#sudoers配置有requirety(许多发行版的默认配置)os).
#
#pipelining = False
#控制传输文件的机制(旧)
#*智能=尝试sftp,然后尝试scp[默认值]
#*True=仅使用scp
#*False=仅使用sftp
#scp_if_ssh = smart
#控制文件传输机制(新增)
#如果设置,这将覆盖scp_If_ssh选项
#*sftp=使用sftp传输文件
#*scp=使用scp传输文件
#*piped=通过SSH使用'dd'传输文件
#*smart=按顺序尝试sftp、scp和管道连接[默认值]
#transfer_method = smart
#如果为False,sftp将不使用批处理模式传输文件。但是,这可能会导致无法捕获某些类型的文件传输失败,并且只有在sftp版本与批处理模式存在问题时才应禁用
#sftp_batch_mode = False
#由于sudo而未启用管道时,-tt参数将传递给ssh
#默认情况下需要tty。
#usetty = True
#在无法访问的情况下,重试SSH连接到主机的次数。
#对于每次重试尝试,都会出现指数退避,
#因此,在第一次尝试后,等待时间为1s,然后是2s、4s等,最长可达30s(最大值)。
#retries = 3
[persistent_connection]
#以秒为单位配置持续连接超时值。这个值是
#永久连接在被破坏之前将保持空闲多长时间。
#如果连接在超时值之前没有收到请求
#过期时,连接将关闭。默认值为30秒。
#connect_timeout = 30
#命令超时值定义等待命令的时间量
#或在超时前调用RPC。必须指定命令超时的值
#小于持续连接空闲超时(connect_timeout)的值
#默认值为30秒。
#command_timeout = 30
[accelerate]
#accelerate_port = 5099
#accelerate_timeout = 30
#accelerate_connect_timeout = 5.0
#守护进程超时以分钟为单位。这个时间是经过测量的
#从最后一个活动到加速守护进程。
#accelerate_daemon_timeout = 30
#如果设置为“是”,则加速键将允许多个
#虽然每个用户必须
#通过SSH访问系统以添加新密钥。默认值
#答案是“不”。
#accelerate_multi_key = yes
[selinux]
#在处理安全上下文时需要特殊处理的文件系统
#复制现有上下文或使用用户默认值的默认行为
#需要更改以使用依赖于文件系统的上下文。
#special_context_filesystems=nfs,vboxsf,fuse,ramfs,9p,vfat
#将此设置为“是”,以允许libvirt_lxc连接在没有SELinux的情况下工作。
#libvirt_lxc_noseclabel = yes
[colors]
#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]
#运行时始终打印差异(与始终使用-D/--diff运行时相同)
# always = no
#设置要在差异中显示的上下文行数
# context = 3
使用Ansible
Ansible的安装
yum install epel-release -y
yum update
yum -y install ansible
ansible --version
配置免密登录
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub -p22 root@10.0.0.51
Ansible命令行
/usr/bin/ansible #ansible主程序
/usr/bin/ansible-connection #ansible连接工具
/usr/bin/ansible-console #ansible控制台,基于Console界面和用户交互的执行工具
/usr/bin/ansible-doc #ansible文档工具
/usr/bin/ansible-galaxy #ansible galaxy 上传/下载优秀代码或roles模块的官网平台
/usr/bin/ansible-inventory #ansible资产
/usr/bin/ansible-playbook #ansible playbook剧本工具
/usr/bin/ansible-pull #ansible pull是指在客户端组件基于ansible pull的方式从服务器上拉取文件
/usr/bin/ansible-vault #ansible加密yaml文件
ansible-config #查看ansible配置文件
ansible
#example
ansible -m ping 10.0.0.51
optional arguments:
--ask-vault-pass #询问保险库密码
--list-hosts #输出匹配主机的列表;不执行任何其他操作
--playbook-dir BASEDIR #由于此工具不使用playbook,请将其用作playbook目录的替代品。这为许多功能设置了相对路径,包括角色/组变量等。
--syntax-check #对剧本执行语法检查,但不要执行
--vault-id VAULT_IDS #要使用的vault标识
--vault-password-file VAULT_PASSWORD_FILES #保险库密码文件
--version #显示程序的版本号、配置文件位置、配置的模块搜索路径、模块位置、可执行文件位置和退出
-B SECONDS, --background SECONDS #异步运行,X秒后失败(默认值=N/A)
-C, --check #不做任何改变;相反,试着预测可能发生的一些变化
-D, --diff #更改(小)文件和模板时,显示这些文件中的差异;很好用--检查
-M MODULE_PATH, --module-path MODULE_PATH #将冒号分隔的路径前置到模块库(默认值=~/.ansible/plugins/modules:/usr/share/ansible/plugins/modules)
-P POLL_INTERVAL, --poll POLL_INTERVAL #如果使用-B(默认值=15),则设置轮询间隔
-a MODULE_ARGS, --args MODULE_ARGS #模块参数
-e EXTRA_VARS, --extra-vars EXTRA_VARS
# 设置变量
-f FORKS, --forks FORKS #指定要使用的并行进程数(默认值=5)
-h, --help #显示此帮助消息并退出
-i INVENTORY, --inventory INVENTORY, --inventory-file INVENTORY
#指定清单主机路径或逗号分隔的主机列表--库存文件已弃用
-l SUBSET, --limit SUBSET #进一步将所选主机限制为其他模式
-m MODULE_NAME, --module-name MODULE_NAME
#要执行的模块名称(默认值=command)
-o, --one-line #压缩输出
-t TREE, --tree TREE #将输出记录到此目录
-v, --verbose #详细模式(-vvv表示更多,-vvvv表示启用连接调试)
Privilege Escalation Options:
control how and which user you become as on target hosts
#权限升级选项:
#控制如何以及成为目标主机上的用户
--become-method BECOME_METHOD #要使用的权限提升方法(默认值=sudo),请使用'ansible-doc -t become -l'列出有效选项。
--become-user BECOME_USER #以该用户身份运行操作(默认值=root)
-K, --ask-become-pass #请求权限升级密码
-b, --become #使用BENG运行操作(不意味着密码提示)
Connection Options:
control as whom and how to connect to hosts
#连接选项:
#控制作为谁以及如何连接到主机
--private-key PRIVATE_KEY_FILE, --key-file PRIVATE_KEY_FILE #使用此文件对连接进行身份验证
--scp-extra-args SCP_EXTRA_ARGS #指定仅传递给scp的额外参数(例如-l)
--sftp-extra-args SFTP_EXTRA_ARGS #指定仅传递给sftp的额外参数(例如-f,-l)
--ssh-common-args SSH_COMMON_ARGS #指定要传递给sftp/scp/ssh的公共参数(例如ProxyCommand)
--ssh-extra-args SSH_EXTRA_ARGS #指定仅传递给ssh的额外参数(例如-R)
-T TIMEOUT, --timeout TIMEOUT #以秒为单位覆盖连接超时(默认值=10)
-c CONNECTION, --connection CONNECTION #要使用的连接类型(默认值=智能)
-k, --ask-pass #询问连接密码
-u REMOTE_USER, --user REMOTE_USER #以该用户身份连接(默认值=无)
有些模块在即席(include、meta等)中没有意义
ansible-doc
positional arguments:
plugin Plugin #位置参数是插件,也就是模块
optional arguments:
--metadata-dump #**仅用于内部测试**为所有插件转储json元数据。
--playbook-dir BASEDIR #由于此工具不使用playbook,请将其用作playbook目录的替代品。这为许多功能设置了相对路径,包括角色/组变量等。
--version #显示程序的版本号、配置文件位置、配置的模块搜索路径、模块位置、可执行文件位置和退出
-F, --list_files #显示插件名称及其源文件,无摘要(暗示--list)
-M MODULE_PATH, --module-path MODULE_PATH #将冒号分隔的路径前置到模块库(默认值=~/.ansible/plugins/modules:/usr/share/ansible/plugins/modules)
-h, --help #显示此帮助消息并退出
-j, --json #将输出更改为json格式。
-l, --list #列出可用的插件
-s, --snippet #查看指定模块的用法
-t {become,cache,callback,cliconf,connection,httpapi,inventory,lookup,netconf,shell,module,strategy,vars}, --type {become,cache,callback,cliconf,connection,httpapi,inventory,lookup,netconf,shell,module,strategy,vars} # 选择插件类型(默认为“模块”)。
可用的插件类型有:('Been'、'cache'、'callback'、'cliconf'、'connection'、'httpapi'、'inventory'、'lookup'、'netconf'、'shell'、'module'、'strategy'、'vars')
-v, --verbose #详细模式(-vvv表示更多,-vvvv表示启用连接调试)
ansible-galaxy
usage: ansible-galaxy [-h] [--version] [-v] TYPE ...
执行与角色和集合相关的各种操作。
位置参数
TYPE
collection #管理Ansible Galaxy系列。
role #管理一个可靠的银河系角色。
usage: ansible-galaxy collection [-h] COLLECTION_ACTION ...
positional arguments:
COLLECTION_ACTION
init #使用集合的基本结构初始化新集合。
build #构建一个Ansible集合工件,可以发布到Ansible Galaxy。
publish #将收藏文物发布到Ansible Galaxy。
install #从文件、URL或Ansible Galaxy安装集合
usage: ansible-galaxy role [-h] ROLE_ACTION ...
positional arguments:
ROLE_ACTION
init #使用角色的基本结构初始化新角色。
remove #从角色路径中删除角色。
delete #从Galaxy中删除该角色。它不会删除或更改实际的GitHub存储库。
list #显示角色路径中安装的每个角色的名称和版本。
search #通过标签、平台、作者和多个关键词搜索Galaxy数据库。
import #导入角色
setup #管理Galaxy和给定源之间的集成。
info #查看有关特定角色的更多详细信息。
install #从文件、URL或Ansible Galaxy安装角色
ansible-pull
ansible-pull:
推送命令至远程,效率无限提升,对运维要求比较高
ansible-playbook
运行Ansible Playbook,在目标主机上执行定义的任务。
位置参数:
playbook Playbook(s)
可选参数:
--ask-vault-pass #请求vault密码
--flush-cache #清除资源清册中每个主机的事实缓存
--force-handlers #即使任务失败也要运行处理程序
--list-hosts #输出匹配主机的列表;不执行任何其他操作
--list-tags #列出所有可用标记
--list-tasks #列出将要执行的所有任务
--skip-tags SKIP_TAGS #仅运行标记与这些不匹配的播放和任务价值观
--start-at-task START_AT_TASK
#在与此名称匹配的任务处启动剧本
--step #一次一步:运行前确认每个任务
--syntax-check #在剧本上执行语法检查,但不要执行它
--vault-id VAULT_IDS #要使用的vault标识
--vault-password-file VAULT_PASSWORD_FILES
#vault密码文件
--version #显示程序的版本号、配置文件位置、配置的模块搜索路径、模块位置、可执行文件位置和退出
-C, --check #不要做任何改变;相反,尝试预测一些可能发生的变化
-D, --diff #更改(小)文件和模板时,显示这些文件中的差异;非常适合--检查
-M MODULE_PATH, --module-path MODULE_PATH
#将冒号分隔路径前置到模块库 (def
ault=~/.ansible/plugins/modules:/usr/share/ansible/plu
gins/modules)
-e EXTRA_VARS, --extra-vars EXTRA_VARS
#如果需要,将其他变量设置为key=value或YAML/JSON文件名前缀为@
-f FORKS, --forks FORKS
#指定要使用的并行进程数(默认值=5)
-h, --help #显示此帮助消息并退出
-i INVENTORY, --inventory INVENTORY, --inventory-file INVENTORY
#指定清单主机路径或逗号分隔的主机列表--库存文件已弃用
-l SUBSET, --limit SUBSET
#进一步将所选主机限制为其他模式 -t标记,--标记标记仅运行标记有这些值的播放和任务
-v, --verbose #详细模式(-vvv表示更多,-vvv表示启用连接调试)
连接选项:
控制作为谁以及如何连接到主机
--private-key PRIVATE_KEY_FILE, --key-file PRIVATE_KEY_FILE
#使用此文件验证连接
--scp-extra-args SCP_EXTRA_ARGS
#指定仅传递给scp的额外参数(例如-l)
--sftp-extra-args SFTP_EXTRA_ARGS
#指定仅传递给sftp的额外参数(例如,-f,-l)
--ssh-common-args SSH_COMMON_ARGS
#指定要传递给sftp/scp/ssh的公共参数(例如ProxyCommand)
--ssh-extra-args SSH_EXTRA_ARGS
#指定仅传递给ssh的额外参数(例如,-R)
-T TIMEOUT, --timeout TIMEOUT
#以秒为单位覆盖连接超时(默认值=10)
-c CONNECTION, --connection CONNECTION
#要使用的连接类型(默认值=smart)
-k, --ask-pass #请求连接密码
-u REMOTE_USER, --user REMOTE_USER
#以此用户身份连接(默认值=无)
权限提升选项:
控制在目标主机上如何以及成为哪个用户
--become-method BECOME_METHOD
#要使用的权限提升方法(默认值=sudo),使用`ansible doc-t been-l`列出有效选项。
--become-user BECOME_USER
#以此用户身份运行操作(默认值=root)
-K, --ask-become-pass
#请求权限提升密码
-b, --become #使用BENG运行操作(不表示密码提示)
ansible-console
用于执行Ansible任务的REPL控制台。
ansible-inventory
usage: ansible-inventory [-h] [--version] [-v] [-i INVENTORY]
[--vault-id VAULT_IDS]
[--ask-vault-pass | --vault-password-file VAULT_PASSWORD_FILES]
[--playbook-dir BASEDIR] [--list] [--host HOST]
[--graph] [-y] [--toml] [--vars] [--export]
[--output OUTPUT_FILE]
[host|group]
positional arguments:
host|group
optional arguments:
--ask-vault-pass #请求vault密码
--export #在执行--列表时,请以针对导出而优化的方式表示,而不是准确表示Ansible处理它的方式
--output OUTPUT_FILE #在执行--list时,将清单发送到文件而不是屏幕
--playbook-dir BASEDIR
由于此工具不使用playbook,请将其用作playbook目录的替代目录。这为许多功能设置了相对路径,包括roles/ group_vars/ etc.
--toml #使用TOML格式而不是默认JSON,对于--graph被忽略
--vars #将变量添加到图形显示,除非与--graph一起使用,否则将被忽略
--vault-id VAULT_IDS #要使用的vault标识
--vault-password-file VAULT_PASSWORD_FILES
#vault密码文件
--version #显示程序的版本号、配置文件位置、配置的模块搜索路径、模块位置、可执行文件位置和退出
-h, --help #显示此帮助消息并退出
-i INVENTORY, --inventory INVENTORY, --inventory-file INVENTORY
#指定清单主机路径或逗号分隔的主机列表--库存文件已弃用
-v, --verbose #显示执行过程
-y, --yaml #使用YAML格式,而不是默认JSON,对于--graph被忽略
Actions:
调用时必须使用以下选项之一,只能使用一个!
--graph #创建库存图,如果提供模式,则必须是有效的组名
--host HOST #输出特定主机信息,用作清单脚本
--list #输出所有主机信息,用作清单脚本
显示Ansible库存信息,默认情况下使用库存脚本JSON格式
ansible-vault
ansible-vault:
#功能:管理加密解密yaml文件
ansible-vault encrypyt hello.yaml #加密
ansible-vault decrypyt hello.yaml #解密
ansible-vault view hello.yaml #查看
ansible-vault edit hello.yaml #编辑加密文件
ansible-vault rekey hello.yaml #修改口令
ansible-vault create new.yaml #创建新文件
ansible-config
usage: ansible-config [-h] [--version] [-v] {list,dump,view} ...
查看ansible配置文件
positional arguments:
{list,dump,view}
list #打印所有配置选项
dump #转储配置
view #查看配置文件
optional arguments:
--version #显示程序的版本号、配置文件位置、配置的模块搜索路径、模块位置、可执行文件位置和出口
-h, --help #显示此帮助消息并退出
-v, --verbose #详细模式(-vvv表示更多,-vvv表示启用连接调试)
ansible主机清单inventory
分组
[ansible_node1]
10.0.0.51
10.0.0.52
[ansible_node2]
10.0.0.52
10.0.0.53
设置别名
node01 ansible_ssh_port=22 ansible_ssh_host=10.0.0.51
简写相似主机
[ansible_node]
10.0.0.5[1:3]
ansible的Host-pattern
ALL: 表示所有Inventory中的所有主机
ansible -m ping all
* :通配符
ansible -m ping 10.0.0.5*
ansible -m ping ansible_node*
或关系
ansible -m ping "ansible_node1:ansible_node2"
ansible -m ping "10.0.0.51:10.0.0.52"
逻辑与
ansible -m ping "ansible_node1:&ansible_node2" # 在ansible_node1组并且在ansible_node2组中的主机
逻辑非
ansible -m ping 'ansible_node1:!ansible_node2' # 在ansible_node1组但不在ansible_node2组中的主机,注意单引号
Inventory参数说明
ansible_ssh_host
将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port
ssh端口号.如果不是默认的端口号,通过此变量设置.
ansible_ssh_user
默认的 ssh 用户名
ansible_ssh_pass
ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
ansible_sudo_pass
sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)
ansible_sudo_exe (new in version 1.8)
sudo 命令路径(适用于1.8及以上版本)
ansible_connection
与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.
ansible_ssh_private_key_file
ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
ansible_shell_type
目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish'.
ansible_python_interpreter
目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python
不是 2.X 版本的 Python.我们不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).
与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....
示例
10.0.0.51 ansible_ssh_port=2222 ansible_ssh_user=manager
10.0.0.52 ansible_ssh_private_key_file=/home/example/.ssh/aws.pem
10.0.0.53 ansible_python_interpreter=/usr/local/bin/python
10.0.0.51 ansible_ruby_interpreter=/usr/bin/ruby.1.9.3
Ansible playbook
官网地址playbook是由一个或多个paly组成的列表paly的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无法是调用ansible的一个module。将多个paly组成在一个playbook中,即可以让它们关联同起来按事先编排的机制,进行有序执行。
playbook采用yaml语言编写
playbook核心元素
hosts 执行的远程主机列表
tasks 任务集
varniables 内置变量或自定义变量在playbook中调用
templates 模板文件,可替换模板文件中的变量并实现一些简单逻辑的文件
handlers和notify结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常长。此时,如果确信其没有变化,就可以通过tags跳过这些代码片段
ansible-playbook -t tagsname useradd.yaml
hosts
playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts用于指定执行任务的主机,需要事先定义在主机清单中
remote_user
remote_user:可用于Host和task中。也可以通过指定其sudo的方式在远程主机上执行任务,其可用于play全局或某个任务;此外,甚至可以在sudo时指定sudo_user指定sudo时切换的用户
task列表和action
play的主机部分是task list。 task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有上完成第一个任务后再开始第二个。在自上而下运行某个playbook时,如果中途发生错误,所有已执行的任务都将回滚,因此,在更正playbook后重新执行一次即可。
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。
每个task都应该是有其name,用于playbook的执行结果输出,建议其内容尽可能清晰的描述任务执行步骤。如果未提供name,则action的结果将用于输出。
task中shell和command模块后面跟命令,而非key value
某任务的状态在运行后为change时,可通过notify通知给相应的handlers
任务可以通过tags打标签,而后可在ansible-playbook命令上使用-t指定进行调用
如果命令或脚本退出状态码不为零,可以使用ignore_errors来忽略错误信息
handlers和notify结合使用触发条件
handlers:
是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采用一定的操作
notify:
此action可用于在每个play的最后触发,这样可避免多次有改变时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作被称为handler,也就是notify中调用handler中定义的操作。
tags
# auth:
# dec: notify && handlers
---
- hosts: 10.0.0.51
remote_user: root
tasks:
- name: install httpd packge
yum: name=httpd
tags: installhttpd
- name: copy config
copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
notify: restart service
- name: copy index.html
copy: src=files/index.html dest=/var/www/html/ backup=yes
- name: start service
service: name=httpd state=started enabled=yes
tags: starthttpd
handlers:
- name: restart service
service: name=httpd state=restarted
playbook中的变量
变量名: 仅能字母 数字 下划线组成,只能以字母开头
变量的来源:
1、ansible setup facts远程主机的所有变量都可直接调用
2、在/etc/ansible/hosts中定义
菩普通变量:主机组中主机单独定义,优先级高于公共变量
公共(组)变量:针对主机组中所有主机定义统一变量
3、通过命令行指定变量,优先级最高
4、在playbook中定义:
vars:
- var1: value1
- var2: value2
5、在role中定义
when
条件测试:如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试,通过when语句实现,在task中使用,jinja2的语法格式
when语句
在task后添加when子句,即可使用条件测试;when语句支持jinja2表达式语法
迭代 with_items
迭代: 当有需要重复行执行的任务时,可以使用迭代机制
对迭代项的引用,固定变量为 item
要在task中使用with_items给定要迭代的元素列表
列表格式:
字符串
字典
Ansible roles
ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板以及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景种,但也可是用于构建守护进程等场景中
复杂场景:建议使用roles,代码复用度高
变更指定主机或主机组
如果命名不规范维护成本会增大
某些功能需要多个playbook,通过include即可实现。
roles目录结构
projectname.yaml
roles/
projectname/
tasks/
files/
vars/
default/
templates/
handlers/
meta/
roles各个目录作用
roles/project/: 项目名称,有以下子目录
files/:存放由copy或script模块等调用的文件
templates/: template模块查找所需模板文件的目录
tasks/:定义task,role的基本元素,至少应该包含一个名为main.yaml的文件;其他的文件需要在此文件中通过include进行包含
handlers/: 至少应该包含一个名为main.yaml的文件;其他的文件需要在此文件中通过include进行包含
vars/:定义变量,至少应该包含一个名为main.yaml的文件,其他的文件需要在此文件中通过includ进行包含
meta/:定义当前角色的特殊设定以及依赖关系,至少应该包含一个名为main.yaml的文件
default/: 设置默认变量时使用此目录中的main.yaml文件
Ansible默认变量
Parameter | Description |
---|---|
hostvars | A dictionary whose keys are Ansible host names and values are dictionaries that map variable names to values |
inventory_hostname | Name of the current host as known by Ansible |
group_names | A list of all groups that the current host is a member of |
groups | A dictionary whose keys are Ansible group names and values are a list of hostnames that are members of the group. Includes all and ungrouped groups: |
play_hosts | A list of inventory hostnames that are active in the current play |
ansible_version | A dictionary with Ansible version info: |
Ansible问题记录
Invalid/incorrect password: Permission denied, please try again.
ansible_ssh_pass 设置是为0开头的密码 就会报错:Invalid/incorrect password: Permission denied, please try again.
改为其他密码,比如123456则可以实现。
Ansible常见面试题
综合案例
Ansible二进制部署kubernetes
github地址:https://github.com/LiuShiYa-github/ansible-deploy-kubernetes
一个人花在影响自己未来命运的工作选择上的精力,竟比花在购买穿了一年就会扔掉的衣服上的心思要少得多,这是一件多么奇怪的事情,尤其是当他未来的幸福和富足要全部依赖于这份工作时。