ansible的简单使用前述(二)
上篇文章已经对ansible的yum安装以及纯软件编译进行了讲解,下面开始总结一下ansible的简单使用方法。
一、ansible的使用前述。
ansible的官网文档:https://docs.ansible.com/ansible/latest/index.html
配置文件官网链接:https://docs.ansible.com/ansible/latest/reference_appendices/config.html
1.1 ansible的配置文件详解
/etc/ansible/ansible.cfg #这是ansible的配置文件
[defaults]
hostfile = /etc/ansible/hosts #指定主机分组文件位置
library = /usr/share/ansible #Ansible默认搜寻模块的位置
remote_tmp = $HOME/.ansible/tmp #ansible module推送到客户端,然后ssh执行客户端上的ansible module,执行完删除,这里就是临时目录。
pattern = * #如果没有提供“hosts”节点,这是playbook要通信的默认主机组.默认值是对所有主机通信
forks = 5 #这个选项设置在与主机通信时的默认并行进程数.从Ansible 1.3开始,fork数量默认自动设置为主机数量或者潜在的主机数量, 这将直接控制有多少网络资源活着cpu可以被使用.很多用户把这个设置为50,有些设置为500或者更多.如果你有很多的主机, 高数值将会使得跨主机行为变快.默认值比较保守.
poll_interval = 15 #对于Ansible中的异步任务, 这个是设置定义,当具体的poll interval 没有定义时,多少时间回查一下这些任务的状态, 默认值是一个折中选择15秒钟.这个时间是个回查频率和任务完成叫回频率和当任务完成时的回转频率的时钟。
sudo_user = root #这个是sudo使用的默认用户,如果在ansible执行语句的时候``–sudo-user`` 没有特指或者’sudo_user’ 在Ansible playbooks中没有特指,在大多数的逻辑中 默认为: ‘root’。
#ask_sudo_pass = True #每次执行ansible命令时是否询问sudo密码
#ask_pass = True #每次执行ansible命令是否询问ssh密码
transport = smart #如果”-c <transport_name>” 选项没有在使用/usr/bin/ansible 或者 /usr/bin/ansible-playbook 特指的话,这个参数提供了默认通信机制.默认 值为’smart’, 如果本地系统支持 ControlPersist技术的话,将会使用(基于OpenSSH)‘ssh’,如果不支持讲使用‘paramiko’.其他传输选项包括‘local’, ‘chroot’,’jail’等等.用户通常可以这个设置为‘smart’,让playbook在需要的条件自己选择‘connectin:’参数.
remote_port = 22 #这个设置是你系统默认的远程SSH端口,如果不指定,默认为22号端口
module_lang = C #这是默认模块和系统之间通信的计算机语言,默认为’C’语言
gathering = implicit #1.6版本中的新特性,这个设置控制默认facts收集(远程系统变量). 默认值为’implicit’, 每一次play,facts都会被收集,除非设置’gather_facts: False’. 选项‘explicit’正好相反,facts不会被收集,直到play中需要. ‘smart’选项意思是,没有facts的新hosts将不会被扫描, 但是如果同样一个主机,在不同的plays里面被记录地址,在playbook运行中将不会通信.这个选项当有需求节省fact收集时比较有用.
#roles_path = /etc/ansible/roles #roles 路径指的是’roles/’下的额外目录,用于playbook搜索Ansible roles.比如, 如果我们有个用于common roles源代码控制仓库和一个不同的 playbooks仓库,你也许会建立一个惯例去在 /opt/mysite/roles 里面查找roles.多余的路径可以用冒号分隔,Roles将会在playbook目录中开始搜索.如果role没有找到,这个参数指定了其它可能的搜索路径.
#host_key_checking = False #不进行host_key检查,省去目标key发生变化时输入(yes/no)的步骤
sudo_exe = sudo #如果在其他远程主机上使用另一种方式执行sudo操作, sudo程序的路径可以用这个参数更换,使用命令行标签来拟合标准sudo。
#sudo_flags = -H #当使用sudo支持的时候,传递给sudo而外的标签. 默认值为”-H”, 意思是保留原用户的环境.在有些场景下也许需要添加或者删除 标签,大多数用户不需要修改这个选项。
timeout = 10 #默认ssh尝试连接超时时间
#remote_user = root #这是个ansible使用/usr/bin/ansible-playbook链接的默认用户名. 注意如果不指定,/usr/bin/ansible默认使用当前用户名称
#log_path = /var/log/ansible.log #登陆执行信息的记录文件位置,不指定默认是记录到系统日志文件中。ansible用户时需要:chown -R ansible:ansible ansible.log。
#module_name = command #这个是/usr/bin/ansible的默认模块名(-m). 默认是’command’模块
#executable = /bin/sh #这个选项可以在sudo环境下产生一个shell交互接口. 用户只在/bin/bash的或者sudo限制的一些场景中需要修改.大部分情况下不需要修改。
#hash_behaviour = replace #Ansible 默认将会以一种特定的优先级覆盖变量,合法的值为’replace’(默认值)或者‘merge’.
#jinja2_extensions = jinja2.ext.do,jinja2.ext.i18n #这是一个开发者中心特性,允许开启Jinja2拓展模块
#private_key_file = /path/to/file #如果你是用pem密钥文件而不是SSH 客户端或密码认证的话,你可以设置这里的默认值,来避免每一次提醒设置密钥文件位置``–ansible-private-keyfile``。
ansible_managed = Ansible managed: {file} #Ansible-managed 是一个字符串.可以插入到Ansible配置模版系统生成的文件中。
#display_skipped_hosts = True #如果设置为`False`,ansible 将不会显示任何跳过任务的状态.默认选项是现实跳过任务的态::display_skipped_hosts=True注意Ansible 总是会显示任何任务的头文件, 不管这个任务被跳过与否。
#error_on_undefined_vars = False #从Ansible 1.3开始,这个选项将为默认,如果所引用的变量名称错误的话, 将会导致ansible在执行步骤上失败。
#system_warnings = True #允许禁用系统运行ansible相关的潜在问题警告(不包括操作主机):这个包括第三方库或者一些需要解决问题的警告
#deprecation_warnings = True #允许在ansible-playbook输出结果中禁用“不建议使用”警告。
action_plugins = /usr/share/ansible_plugins/action_plugins #用来激活一些事件,例如执行一个模块,一个模版,等等这是一个以开发者为中心的特性,使得一些底层模块可以从外部不同地方加载.
callback_plugins = /usr/share/ansible_plugins/callback_plugins #Callbacks 在ansible中是一段代码,在特殊事件时将被调用.并且允许出发通知. 这是一个以开发者为中心的特性,可以实现对Ansible的底层拓展,并且拓展模块可以位于任何位置.
connection_plugins = /usr/share/ansible_plugins/connection_plugins #连接插件允许拓展ansible拓展通讯信道,用来传输命令或者文件. 这是一个开发者中心特性,拓展插件可以从任何不同地方加载.
lookup_plugins = /usr/share/ansible_plugins/lookup_plugins #允许模块插件在不同区域被加载
vars_plugins = /usr/share/ansible_plugins/vars_plugins #允许底层拓展模块从任何地方加载,例:vars_plugins = ~/.ansible/plugins/vars_plugins/:/usr/share/ansible_plugins/vars_plugins
filter_plugins = /usr/share/ansible_plugins/filter_plugins #过滤器是一种特殊的函数,用来拓展模版系统
#nocows = 1 #默认ansible可以调用一些cowsay的特性,使得/usr/bin/ansible-playbook运行起来更加愉快,1为禁用,0为启用。
#nocolor = 1 #默认ansible会为输出结果加上颜色,用来更好的区分状态信息和失败信息.
#ca_file_path =
#http_user_agent = ansible-agent
[paramiko_connection]
#record_host_keys=False #默认设置会记录并验证通过在用户hostfile中新发现的的主机(如果host key checking 被激活的话). 这个选项在有很多主机的时候将会性能很差.在 这种情况下,建议使用SSH传输代替. 当设置为False时, 性能将会提升,在hostkey checking 被禁用时候,建议使用.
#pty=False
[ssh_connection]
#ssh_args = -o ControlMaster=auto -o #这个选项将会传递一组选项给Ansible 然不是使用以前的默认值:用户可以提高ControlPersist值来提高性能.30 分钟通常比较合适.
# control_path = %(directory)s/%%h-%%r #这个是保存ControlPath套接字的位置,Ansible 1.4 以后的版本会引导用户在这种情况下使用”-vvvv”参数,这样很容易分辨 Control Path 文件名是否过长
#control_path = %(directory)s/ansible-ssh-%%h-%%p-%%r #这是默认值
#pipelining = False #在不通过实际文件传输的情况下执行ansible模块来使用管道特性,从而减少执行远程模块SSH操作次数.如果开启这个设置,将显著提高性能. 然而当使用”sudo:”操作的时候, 你必须在所有管理的主机的/etc/sudoers中禁用’requiretty’.默认这个选项为了保证与sudoers requiretty的设置(在很多发行版中时默认的设置)的兼容性是禁用的,但是为了提高性能这里是开启的。
#scp_if_ssh = True #如果用户操控一个一个没有开启SFTP协议的远程系统.如果这个设置为True,scp将代替用来为远程主机传输文件,默认不修改。
[accelerate]
accelerate_port = 5099 #在急速模式下使用的端口
accelerate_timeout = 30 #这个设置时用来控制从客户机获取数据的超时时间.如果在这段时间内没有数据传输,套接字连接会被关闭. 一个保持连接(keepalive)数据包通常每15秒回发回给控制台,所以这个超时时间不应该低于15秒(默认值为30秒)。
accelerate_connect_timeout = 5.0 #这个设置空着套接字调用的超时时间.这个应该设置相对比较短.这个和`accelerate_port`连接在回滚到ssh或者paramiko(受限于你默认的连接设置)连接方式之前会尝试三次开始远程加速daemon守护进程.默认设置为5.0秒。
accelerate_daemon_timeout = 30 #这个控制加速daemon守护进程的超时时间,用分钟来衡量.默认为30分钟
#accelerate_multi_key = yes #如果这个选项开启,这个设置将允许多个私钥被加载到daemon. 任何客户端要想连接daemon都需要开启这个选项,通过本地套接字文件连接的通过SSH上传密钥文件到目标节点的新客户端,必须在登陆daemon时使用原始的登陆密钥登陆。
博文来自:www.51niux.com
1.2 ansible的语法格式
标准格式:ansible <pattern_goes_here> -m <module_name> -a <arguments>
#pattern_goes_here: 可以是某一个主机IP(如192.168.1.128)或者是hosts中的组名(web.server),192.168.1.*代表所有但是前提是hosts文件里面已经做好了定义如192.168.1.[1:254]这样就是执行的192.168.1.1-192.168.1.254,同时制定多个组或者多个ip使用;分割,用!表示非(如web.server:!data.server表示在web.server主机组里面但是不在data.server主机组里面的主机IP),用&表示交集部分,可以指定分组的下标或切片(如web.server[1],就是这个主机组第二个主机IP,需要主机的是超过了范围就无法匹配了),可以用~开头来使用正则(如:~(web|data).*\.server\.com)。需要注意的是如果系统用的是zsh,有这些类似于*,!,[等这些特殊符号需要用单引号包裹。
#module_name: 要执行的模块名称,当然 -m 模块名称 这里在语句中是可选的,默认是command,如ansible all -a "/bin/echo hello"
#arguments:要执行的命令语句
#其他主要参数:
-u username #指定ssh连接的用户名,即执行后面命令的用户
-i inventory_file #指定所使用的用户组所在的文件,默认是/etc/ansible/hosts
-f number #指定并发数,并发量大的时候,提高该数字值,如 -f 10
-t #输出结果保存路径
-U #sudo用户
--sudo [k] #如果是普通用户运行ansible,当需要root权限执行的话,-k参数用来输入密码
-K #sudo密码
--private-key=key_name #如果是用非默认的id_rsa来当私钥的话,可以指定一个私钥文件。
博文来自:www.51niux.com
1.3 ansible的远程控制方式
密码输入控制方式:
假设我们的服务器之间没有秘钥认证方式,这时候我们想通过密码来管理如何呢?
[root@master ~]# ansible 192.168.1.109 -a 'uptime' #默认没有秘钥认证就直接认证失败了
192.168.1.109 | FAILED => FAILED: No authentication methods available
[root@master ~]# cat /etc/ansible/ansible.cfg |grep ask_pass #更改一处配置
#ask_pass = True #将前面的注释去掉,但是又默认走密码认证,这就意味着每次控制都会弹出让你输入密码,就算我们有秘钥认证不需要输入密码,也要按下回车才能走秘钥认证,也是很麻烦的。
上面更改配置文件的方式是有点麻烦,那就加个-k参数来解决吧,下面为截图(上面是直接秘钥认证,下面是也可以选择密码认证):
普通用户sudo root权限执行命令:
如果可以root远程来管理显然有些危险,而且我们在生产环境一般都会做root做禁止远程登录的限制操作,一般都会用普通用户用sudo提权的形式来做一些事情来保障服务器的安全,下面举一个创建目录的例子:
[test@master .ssh]$ ansible 192.168.1.109 -a 'mkdir /opt/nihao' -s -k #首先我们没有在109上面授予mkdir的权限,所以提示没有权限
SSH password:
192.168.1.109 | FAILED | rc=1 >>
mkdir: cannot create directory `/opt/nihao': Permission denied
#下面我们在192.168.1.109上面执行visudo加下下面一条命令
root ALL=(ALL) ALL
test ALL=(ALL) NOPASSWD:ALL #这是新加的
[root@smaster ~]# /etc/init.d/sshd restart #要重启服务,如果不想重启服务/etc/init.d/sshd reload可以重新加载一下配置文件。
[test@master .ssh]$ ansible 192.168.1.109 -a ' /bin/mkdir /opt/nihao' -s #-s 是--sudo 不需要输入密码的缩写,然而这里就需要更改配置文件,将密码验证的方式打开了。
SSH password:
192.168.1.109 | success | rc=0 >>
我们上192.168.1.109上面查看一下
drwxr-xr-x. 2 root root 4096 6月 15 01:24 nihao #产生了
新的问题刚才在192.168.1.109上面的visudo上面配置的是NOPASSWD,sudo不需要密码,如果我把这条设置去掉了怎么办呢,我ansible普通用户连接客户端需要执行一次密码,再sudo也是需要一次密码的啊,运行下面的命令
ansible 192.168.1.109 -a ' /bin/mkdir /opt/henwan' -s -K -k
秘钥认证方式:
秘钥认证方式前面的文章已经讲过了,这里就不赘述了,可以根据自己的需求选择普通用户然后sudo提取的形式去控制ansible的被管理主机去执行一些特权用户才能进行的操作,也可以选择root秘钥认证的形式。
博文来自:www.51niux.com
1.4 ansible的常用命令
# ansible --h #--h参数大家都知道了啊,就是查看有哪些参数解释帮助说明
Usage: ansible <host-pattern> [options] Options: -a : -a 后面跟着要执行的模块参数。 -k :输入SSH的登录密码 --ask-su-pass : su切换密码 -K :sudo提权的密码 --ask-vault-pass: -B SECONDS:后台运行超时时间 -C : 不要做任何改变; 而是尝试预测可能发生的一些变化 -c CONNECTION : 要使用的连接类型(默认=智能),可能是 -f FORKS :指定要使用的并行进程数(default = 5) -i INVENTORY:指定库存主机文件(默认=/etc/ansible/hosts) -l SUBSET, --limit=SUBSE:进一步限制所选主机/组模式,例如:--limit=192.168.91.135只对这个ip执行 -m MODULE_NAME :要执行的模块名称(default = command) -M MODULE_PATH :指定模块库的路径(默认=/usr/share/ansible) -o, --one-line:压缩输出,摘要输出.尝试一切都在一行上输出。 -P POLL_INTERVAL:如果使用-B(默认=15)设置轮询间隔 --private-key=PRIVATE_KEY_FILE : 使用此文件来验证连接 -S:用su运行操作 -R SU_USER :指定SU的用户,默认是root用户 -s, --sudo:运行sudo(nopasswd) -U SUDO_USER:sudo到哪个用户,默认为 root -T TIMEOUT:#指定SSH默认超时时间,默认是10S -t TREE:将输出记录到此目录 -u REMOTE_USER:指定ssh连接的用户名,即执行后面命令的用户,默认是root --vault-password-file=VAULT_PASSWORD_FILE:文件库密码文件 -v, --verbose :详细模式(-vvv为更多,-vvvv启用连接调试) --version :显示程序版本号并退出
# ansible-doc -h
Usage: ansible-doc [options] [module...] Options: -M MODULE_PATH:可选模块/目录 -l, --list:列出可用的模块 -s, --snippet :显示指定模块的剧本片段,-s 模块名称 可以查看某个模块详细的使用方法 -v :显示版本号并退出
[root@master ~]# ansible-doc -l #查看ansible现在支持哪些模块及模块说明
#多说一句,按q退出别按CRTL+C退出,不然按回车就如下面的例子:[root@master ~]# [root@master ~]# [root@master ~]# [root@master ~]# [root@master ~]# [root@master ~]#
1.5 Special Variables(特殊变量)-官网翻译
Magic variables
这些变量不能由用户直接设置。 Ansible将始终覆盖它们以反映内部状态。
ansible_check_mode:指示是否处于检查模式的布尔值
ansible_config_file:已使用的Ansible配置文件的完整路径
ansible_dependent_role_names:当前作为其他剧集的依赖项导入到当前 plays中的roles的名称
ansible_diff_mode:布尔值,指示是否处于差异模式
ansible_forks:整数,反映可用于此运行的最大分叉数
ansible_inventory_sources:用作清单的sources清单
ansible_limit:当前执行Ansible的--limit CLI选项的内容
ansible_loop:通过loop_control.extended启用时,包含扩展循环信息的dictionary/map
ansible_loop_var:提供给loop_control.loop_var的值的名称。 在2.8中添加
ansible_index_var:提供给loop_control.index_var的值的名称。 在2.9中添加
ansible_parent_role_names:当通过include_role或import_role操作执行当前角色时,此变量包含所有父角色的列表,其中最新角色(换句话说,包含/导入此角色的角色)是其中的第一项 列表。 当出现多个包含时,此列表将最后一个角色(换句话说,包括该角色的角色)列为列表中的第一项。 在此列表中,特定角色也可能不止一次存在。例如:当角色A包括角色B时,在角色B内,ansible_parent_role_names将等于['A']。 如果然后角色B包括角色C,则列表变为['B', 'A'].。
ansible_parent_role_paths:当通过include_role或import_role操作执行当前角色时,此变量包含所有父角色的列表,其中最新角色(换句话说,包含/导入此角色的角色)是其中的第一项 列表。 请参阅ansible_parent_role_names以获取此列表中项目的顺序。
ansible_play_batch:当前play中的活动主机列表,受序列号(即“batch(批量)”)限制。 失败/无法访问的主机不被视为“active”主机。
ansible_play_hosts:当前play运行中的主机列表,不受序列号限制。 Failed/Unreachable主机包含在此列表中。
ansible_play_hosts_all:play所针对的所有hosts的列表
ansible_play_role_names:当前导入到当前play中的roles 的名称。 该列表不包含通过依赖项隐式包含的角色名称。
ansible_playbook_python:控制器上的Ansible使用的python解释器的路径
ansible_role_names:当前导入到当前play中的roles的名称,或引用为导入到当前play中的roles的依赖关系的roles的名称。
ansible_role_name:完全限定的collection role name,格式为namespace.collection.role_name
ansible_collection_name:正在执行的collection the task的名称。 以namespace.collection的格式
ansible_run_tags: --tags CLI选项的内容,该选项指定当前运行将包括哪些标签。
ansible_search_path: 操作插件和查找的当前搜索路径,换句话说,当你执行模板时,我们在其中搜索相对路径:template: src=myfile
ansible_skip_tags: --skip-tags CLI选项的内容,该选项指定当前运行将跳过哪些标签。
ansible_verbosity: 当前Ansible的详细程度设置
ansible_version: Dictionary/map包含有关ansible当前运行版本的信息,它具有以下键:full, major, minor, revision and string.
group_names: 当前主机所属的组列表
groups: 包含清单中所有组的dictionary/map,每个组都有属于它的主机的列表
hostvars: dictionary/map,其中包含清单中的所有主机,并为其分配了变量
inventory_hostname: 在剧本中迭代“current(当前)”主机play资源名称
inventory_hostname_short: inventory_hostname的简短版本
inventory_dir: 清单源的目录,在该目录中首次定义了清单主机名
inventory_file: 首次定义了清单主机名的清单源的文件名
omit: 允许你“omit(忽略)”任务中一个选项的特殊变量,例如-user: name=bob home={{ bobs_home|default(omit) }}
play_hosts: 已弃用,与ansible_play_batch相同
ansible_play_name: 当前执行的play的名称。 在2.8中添加。
playbook_dir: 传递到ansible-playbook命令行的剧本目录的路径。
role_name: 当前正在执行的角色的名称。
role_names: 已弃用,与ansible_play_role_names相同
role_path: 当前正在运行的role的目录的路径
Facts
这些是包含与当前主机有关的信息的变量(inventory_hostname)。 它们只有在首先收集时才可用。 有关更多信息,请参见发现变量:facts and magic variables。
ansible_facts: 包含为stocking_hostname收集或缓存的所有Facts。Facts通常由设置模块在play中自动收集,但是任何模块都可以返回Facts。
ansible_local: 包含为stock_hostname收集或缓存的所有“local facts”。 可用的密钥取决于创建的自定义事实。 有关更多详细信息,请参见设置模块和facts.d或local facts。
Connection variables(连接变量)
连接变量通常用于设置有关如何在目标上执行操作的细节。 它们大多数对应于连接插件,但并非全部都特定于它们。 通常会涉及其他插件,例如shell,terminal和become。 仅描述了通用的,因为每个connection/become/shell/etc插件都可以定义自己的替代值和特定变量。 请参阅控制Ansible的行为:连接变量如何与配置设置,命令行选项和剧本关键字交互的优先规则。
ansible_become_user:使用特权升级后,用户Ansible会“becomes”。“login user”必须可用。
ansible_connection: 目标主机上实际用于任务的连接插件。
ansible_host: 要使用的目标主机的ip/name,而不是inventory_hostname。
ansible_python_interpreter: Python可执行文件Ansible的路径应在目标主机上使用。
ansible_user: 用户Ansible的“登录身份”为。
1.6 记录Ansible输出-翻译官网
默认情况下,Ansible将有关plays, tasks, and module 参数的输出发送到控制节点上的屏幕(STDOUT)。 如果要在日志中捕获Ansible输出,则有三个选项:
1. 要将Ansible输出保存在控制节点上的单个日志中,请设置log_path配置文件设置。 你可能还需要设置display_args_to_stdout,它通过在Ansible输出中包含变量值来帮助区分相似的任务。
2. 要将Ansible输出保存在单独的日志中(每个受管节点上一个),请设置no_target_syslog和syslog_facility配置文件设置。
3.要将Ansible输出保存到安全数据库,请使用Ansible Tower。 通过Tower你您可以使用graphs and/or a REST API随时间查看基于主机,项目和特定清单的历史记录。
使用no_log保护敏感数据
如果将Ansible输出保存到日志,则会在Ansible输出中公开任何秘密数据,例如密码和用户名。 要使敏感值不进入日志,请使用no_log: True属性标记将其公开的任务。 但是,no_log属性不会影响调试输出,因此请注意不要在生产环境中调试剧本。 请参阅如何在我的剧本中保存机密数据? https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#keep-secret-data