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.

posted @ 2021-11-04 21:12  EverEternity  阅读(238)  评论(0编辑  收藏  举报