目录
构建ansible主机清单
清单中定义ansible将要管理的一批主机,这些主机也可以分配到组中,以进行集中管理。组中也可以包含子组,一台主机也可以是多个组中的成员。清单还可以设置应用到它所定义的主机和组的变量。
可以通过两种方式定义主机清单。静态主机清单可以通过文本文件定义。动态主机清单可以根据需要使用外部信息提供程序通过脚本或其他程序生成。
静态主机清单文件是指定的ansible目标受管主机的文本文件。文件编辑格式有多种格式INI和YAML格式。INI格式较为常见建议使用INI格式编辑。
【vim /root/ansible/inventory👆】
定义注意事项:默认安装ansible匹配的主机清单文件是/etc/ansible/hosts |
(1) 在主机清单文件中每一行一个主机ip(主机名) servera.example.com serverb.example.com |
(2) 主机组中定义受管主机,用[ ]扩起受管主机组的名称,然后每一行添加一个受管主机名称(ip) [usa] serverb.example.com serverc.example.com [canada] w1.example.com w2.example.com |
(3) 定义嵌套组(多个主机组所构成新的主机组)嵌套主机组名称定义前面写组名后面:children来实现 [america:children] usa canada |
(4) 通过范围简化主机规格 格式[START:END] eg:192.168.[4:7].[10:20] / [a:c].example.com |
#ansible 主机组or主机名 --list-hosts
======================注意===============================
all 主机组含有清单中明确列出的每一个主机
ungrouped 主机组含有清单中明确列出、但不属于任何其他组的每一个主机
=============================================================
查看主机组
Ansible-inventory --graph
all 或者*
(1)匹配单个组
(2)匹配单个主机
(3)匹配多个主机
(4)匹配多个组
(5)匹配不属于任何组的主机
*
ansible server* --list-hosts
[root@servera ~]# ansible 'web:ftp' --list-hosts
hosts (2):
servera.openlab.com
serverb.openlab.com
[root@servera ~]# ansible 'web:mail' --list-hosts
hosts (2):
servera.openlab.com
serverb.openlab.com
[root@servera ~]# ansible 'web:&mail' --list-hosts
hosts (1):
servera.openlab.com
[root@servera ~]# ansible 'web:!mail' --list-hosts
[WARNING]: No hosts matched, nothing to do
hosts (0):
[root@servera ~]# ansible 'mail:!web' --list-hosts
hosts (1):
serverb.openlab.com
ansible "~(web|db).*.example.com" -m ping
注:
.任意单个字符
"~"开始表示正则匹配
* 匹配前面的子表达式零次或多次
\转义
总结
主机清单格式(交、并、补)
\>all 所有主机
\>通配符
ansible "*" -m ping
ansible 192.168.60.* -m ping
ansible "web*" -m ping
\>或 : (并)属于A或属于B的元素的集合A并B AUB ,也表示或者的意思
ansible "websrv:appsrv" -m ping
\>与 :& (交集)属于A且属于B
ansible 'websrv:&appsrv' -m ping
\>非 :! (补集)属于全集U不属于集合A
ansible 'websrv:!dbsrv' -m ping (在websrv主但不在dbsrv组)
综合逻辑
ansible 'websrv:dbsrv:&appsrv:!ftsrv' -m ping
正则表达式
ansible "~(web|db).*\.example\.com" -m ping
注:
.任意单个字符
"~"开始表示正则匹配
* 匹配前面的子表达式零次或多次
\转义
通过修改ansible配置文件中的设置来定义ansible安装行为。通过控制节点上多个可能位置之一选择相应位置的配置文件。
执行ansible命令根据所在目录匹配相关ansible配置文件,实践中一般使用ansible命令的目录中创建ansible.cfg文件,此目录中也将包含任何你的ansible项目使用的文件,有清单或者主机清单。
ANSIBLE_CONFIG(ansible环境变量中指向的配置文件)---->./ansible.cfg ---->~/.ansible.cfg ----> /etc/ansible/ansible.conf
#ansible --version 查看当前使用的是哪个ansible.cfg配置文件
主配置文件 /etc/ansible/ansible.cfg
ansible中配置文件是有优先级的:
如果你在某个目录中执行ansible的命令,需要加载配置文件ansible.cfg
寻找ansible.cfg的顺序
首先去查看环境变量:ANSIBLE_CONFIG如果有这个环境变量那么就去加载这个环境变量对应ansible.cfg配置
之后:如果没有这个环境变量,会在当前目录下查找ansible.cfg如果有的话就去加载
再后:如果当前目录下也没有,去加载用户家目录~/.ansible.cfg 如果有去加载
最后,如果没有,去加载默认的ansible配置文件:/etc/ansible/ansible.cfg
【ping一下看看】
案例一:ansible使用ssh连接受管主机,一般不建议用管理用户,要求通过普通用户student进行链接
[defaults]
inventory = /etc/ansible/hosts
remote_user = student
ask_pass = True
案例二: 关闭主机秘钥验证
在管控主机中通过指定用户发起操作指令,在受管主机中通过ssh远程连接方式以student用户身份执行,并验证密码;如果ask_pass为false 则可以通过-k 或者--ask-pass来提示接收密码进行验证。
host_key_checking = False 关闭主机秘钥验证:
或者直接在控制主机的操作系统中设置环境变量, 如下所示:
$export ANSIBLE_HOST_KEY_CHECKING=False
案例三:主机免密登陆,关闭秘钥
如果不需要密码验证(忽略密码验证)则需要配置秘钥验证
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' -q
for host in server{a,b};do ssh-copy-id -i $host ;done
案例四:远程用户sudo提权
如果在受管主机中需要通过管理员身份运行命令则配置sudo
vim /etc/sudoers
student ALL=(ALL) NOPASSWD: ALL
注:在受管主机中进行配置,建议管理sudo用户提权密码验证,如果没有关闭则ask_sudo_pass = True 来开启执行命令sudo提权密码验证;但是ask_sudo_pass = False那么可以空过-K --ask-become-pass来开启执行命令sudo提权密码验证
案例五:特权升级。
在受管主机中通过sudo提权可在ansible配置中进行优化,开启远程用户在受管主机中执行特权升级。控制主机执行特权命令不需要指定sudo命令
[student@localhost ~]$ ansible web -a 'sudo useradd haha'
[WARNING]: Consider using 'become', 'become_method', and 'become_user' rather
than running sudo
servera | CHANGED | rc=0 >>
serverb | CHANGED | rc=0 >>
Vim /etc/ansible/ansible.cfg
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
[student@localhost ~]$ ansible web -a 'useradd xixi'
servera | CHANGED | rc=0 >>
serverb | CHANGED | rc=0 >>
ansible是指令核心部分,其主要用于执行ad-hoc命令,即单条命令。默认后面需要跟主机和选项部分,默认不指定模块时,使用的是command模块。
ansible运行临时命令语法
#ansible host-pattern -m module [-a 'module arguments'] [-i inventory]
ansible-doc 查找关于本地系统上安装的模块信息==显示模块帮助(ansible里man命令) |
-l,--lsit 查看控制节点上可用的模块列表以及其功能的概要;列出可用模块 |
-s,--snippet 列岀某个模块支持的动作 显示模块的playbook |
ansible-doc [module name] 查看指定模块的概要、选项、详细信息、以及基本用法 |
模块文档文档网站:http://docs.ansible.com |
注意:帮助显示中模块维护标记
由于有些模块可能处于不同的开发阶段查看模块开发状态,是在ansible-doc输出末尾的METEDATA部分中指明
stableinterface: 模块的关键字稳定,将尽力确保不删除关键字或更改其含义
preview:模块处于阶段预览,可能不稳定
deprecated: 模块弃用
removed:模块已从发行版中移除
1.ansible****运行临时命令**
语法:ansible 主机或组 -m 模块名 -a '模块参数' -i 清单文件
2.如何获取有哪些模块
ansible-doc -l
3.模块帮助
3.1参数帮助
ansible-doc -s modname
ansible-doc -s user
3.2模块帮助示例:
ansible-doc user
绿色:执行成功并且不需要做出任何改变 # 绿色: 使用ping模块返回的结果就是绿色: 代表执行成功,且并没有做出任何改变
黄色:执行成功并且对目标主机做出变更 # 黄色:使用shell模块执行useradd时候:在被管理主机node1上创建了一个用户,所以做出了更改,因此它显示成黄色
红色:执行失败 # 执行失败: 第一个连接不上,第二个执行过程中遇到问题
蓝色:显示详细过程
紫色:显示警告 # warning警告