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

posted @ 2023-04-02 23:02  热气球!  阅读(43)  评论(0编辑  收藏  举报