ansible第二天

[root@servera ~]# ansible 'web:ftp' --list-hosts --- 匹配在web组或者在ftp组中的所有主机
hosts (2):
servera.openlab.com
serverb.openlab.com
[root@servera ~]# ansible 'web:mail' --list-hosts --- 匹配在web组或者在mail组中的所有主机
hosts (2):
servera.openlab.com
serverb.openlab.com
[root@servera ~]# ansible 'web:&mail' --list-hosts --- 匹配在web组和mail组中的所有主机
hosts (1):
servera.openlab.com
[root@servera ~]# ansible 'web:!mail' --list-hosts --- 匹配在web组但是不在mail组中的所有主机
[WARNING]: No hosts matched, nothing to do
hosts (0):
[root@servera ~]# ansible 'web:!mail:&dns' --list-hosts --- 匹配在web组但是不在mail组中并且在dns组中的所有主机


ansible匹配自定义路径清单文件
查看当前匹配的清单文件路径


[root@server ~]# ansible --version

[root@server ~]# ansible --version
ansible [core 2.13.5]
  config file = /etc/ansible/ansible.cfg --- 默认配置文件
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.9/site-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.9.14 (main, Dec  5 2022, 13:41:22) [GCC 8.5.0 20210514 (Red Hat 8.5.0-17)]
  jinja version = 3.1.2 --- 版本
  libyaml = True

根据优先级选择执行ansible配置文件


如果当前目录有ansible.cfg文件,则匹配当前目录下的,如果没有则匹配家目录下的,家目录也没有的话则匹配 /etc/ansible/ansible.cfg

执行 ansible 命令根据所在目录匹配相关 ansible 配置文件,实践中一般使用 ansible 命令的目录中创建
ansible.cfg 文件,此目录中也将包含任何你的 ansible 项目使用的文件,有清单或者主机清单。
ANSIBLE_CONFIG(ansible 环境变量中指向的配置文件)---->./ansible.cfg ---->~/.ansible.cfg ---->/etc/ansible/ansible.cfg 默认只有一个配置文件生效
管理配置文件中的设置

[root@server ~]# vim ./inventory

[defaults]
inventory = ./inventory         #主机列表配置文件 加载自定义路径文件
library = /usr/share/my_modules         #库文件存放目录
forks = 5         #默认并发数 5 (同时可以处理 5 个命令 -- 同时有 20 个节点主机 5 个主机执行在
5 个执行)
sudo_user = root         #默认的 sudo 用户 root
ask_pass = false         #每次执行 ansible 命令是否询问 ssh 密码
remout_port = 22
host_key_checking = False         #检查对应服务器的 host_key ,建议取消注释
log_path = /var/log/ansible.log         #ansible日志文件
module_name = command         #默认模块,可以改为 shell
remote_user = user         #要在受管主机上登录的用户名称,没有指定则是当前用户(受管、管 控、托管主机的用户名)
remote_tmp = ~/.ansible/tmp         #临时的 py 命令文件存放在远程主机目录
[privilege_escalation]         #特权升级
become = true         #连接后是否在受管主机上切换用户,默认会切换到 root 下
become_method = sudo         #如何切换用户
become_user = root         #受管主机切换到的用户
become_ask_pass = false         #是否为 become_method 提示输入密码,默认为 false

ansible匹配自定义路径清单文件


[root@server ~]# cd /home/student/ansible/inventory

[root@server inventory]# touch ansible.cfg

[root@server inventory]# ansible --version
ansible [core 2.13.5]
  config file = /home/student/ansible/inventory/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.9/site-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.9.14 (main, Dec  5 2022, 13:41:22) [GCC 8.5.0 20210514 (Red Hat 8.5.0-17)]
  jinja version = 3.1.2
  libyaml = True

自定义路径文件案例:


注:在自定义路径下,一定要创建两个文件 --- ansible.cfg 和 inventory

创建一个名为/home/student/ansible/inventory的静态库存文件如下所示:

  2.1)node1 是dev主机组的成员

  2.2)node2是test主机组的成员

  2.3)node1和node2是prod主机组的成员

  2.4)node1是balancers主机组的一员

  2.5)prod组是webservers主机组的成员
 

[root@server ~]# mkdir /home/student/ansible/inventory -p

[root@server ~]# cd /home/student/ansible/inventory

[root@server inventory]# ansible --version

 

[root@server inventory]# touch ansible.cfg

[root@server inventory]# vim ansible.cfg

 

[root@server inventory]# touch inventory

[root@server inventory]# vim inventory

 

 [root@server inventory]# ansible-inventory --graph 

 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使用ssh连接受管主机,一般不建议用管理用户,要求通过普通用户student进行链接


[defaults]
inventory = /etc/ansible/hosts
remote_user = student  --- 受控主机和控制主机中都必须要有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-doc 查找关于本地系统上安装的模块信息 == 显示模块帮助 (ansible 里 man 命令,相当于help )
-l,--lsit 查看控制节点上可用的模块列表以及其功能的概要;列出可用模块
-s , --snippet 列岀某个模块支持的动作 显示模块的 playbook
ansible-doc [module name] 查看指定模块的概要、选项、详细信息、以及基本用法
模块文档文档网站: http://docs.ansible.com
注意:帮助显示中模块维护标记
由于有些模块可能处于不同的开发阶段查看模块开发状态,是在 ansible-doc 输出末尾的 METEDATA 部分
中指明
stableinterface: 模块的关键字稳定,将尽力确保不删除关键字或更改其含义
preview :模块处于阶段预览,可能不稳定
deprecated: 模块弃用
removed :模块已从发行版中移除


主机联通性测试


绿色:执行成功并且不需要做出任何改变
黄色:执行成功并且对目标主机做出变更
红色:执行失败
蓝色:显示详细过程
紫色:显示警告
file 模块 ansible-doc file -s
path 参数 :必须参数,用于指定要操作的文件或目录,在之前版本的 ansible 中,使用 dest 参数或
者 name 参数指定要操作的文件或目录,为了兼容之前的版本,使用 dest 或 name 也可以。
state 参数 : Path=“ 路径 ” state= touch|directory|link|hard|absent
此参数非常灵活,此参数对应的值需要根据情况设定,比如,当我们需要在远程主机中创建一个目
录的时候,我们需要使用 path 参数指定对应的目录路径,假设,我想要在远程主机上创
建 /testdir/a/b 目录,那么我则需要设置 path=/testdir/a/b ,但是,我们无法从 "/testdir/a/b" 这个
路径看出 b 是一个文件还是一个目录, ansible 也同样无法单单从一个字符串就知道你要创建文件还
是目录,所以,我们需要通过 state 参数进行说明
src 参数 :当 state 设置为 link 或者 hard 时,表示我们想要创建一个软链或者硬链,所以,我们必须
指明软链或硬链链接的哪个文件,通过 src 参数即可指定链接源。
force 参数 : 当 state=link 的时候,可配合此参数强制创建链接文件,当 force=yes 时,表示强制创
建链接文件,不过强制创建链接文件分为两种情况,情况一:当你要创建的链接文件指向的源文件
并不存在时,使用此参数,可以先强制创建出链接文件。情况二:当你要创建链接文件的目录中已
经存在与链接文件同名的文件时,将 force 设置为 yes ,回将同名文件覆盖为链接文件,相当于删除
在远程主机上执行脚本
[root@centos7 ~]# ansible test -m script -a "test.sh chdir=/tmp"
172.20.21.120 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 172.20.21.120 closed.\r\n",
"stdout": "/tmp\r\n",
"stdout_lines": [
"/tmp"
]
}
[root@centos7 ~]# ansible test -m raw -a "pwd"
172.20.21.120 | SUCCESS | rc=0 >>
/root
Shared connection to 172.20.21.120 closed. 同名文件,创建链接文件。情况三:当你要创建链接文件的目录中已经存在与链接文件同名的文
件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件。
owner 参数 :用于指定被操作文件的属主,属主对应的用户必须在远程主机中存在,否则会报
错。
group 参数 :用于指定被操作文件的属组,属组对应的组必须在远程主机中存在,否则会报错。
mode 参数 :用于指定被操作文件的权限,比如,如果想要将文件权限设置为 "rw-r-x---" ,则可以
使用 mode=650 进行设置,或者使用 mode=0650 ,效果也是相同的,如果你想要设置特殊权限,
比如为二进制文件设置 suid ,则可以使用 mode=4700 ,很方便吧。
recurse 参数 :当要操作的文件为目录,将 recurse 设置为 yes ,可以递归的修改目录中文件的属
性。 -R
setype: httpd_content_t
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值