目录
管理ansible的配置文件
一,配置ansible
二,据优先级选择执行ansible配置文件
1,按照优先级首先会匹配环境变量ANSIBLE_CONFIG
2,第二个匹配到./ansible.cfg文件
3,第三个匹配到~/.ansible.cfg文件
4,当以上文件都不存在时,ansible配置文件就会匹配到/etc/ansible/ansible.cfg
三,管理配置文件中的设置
案例一:
ansible使用ssh连接受管主机
案例二:
关闭主机秘钥验证
案例三:
主机免密登陆,关闭秘钥
案例四:
远程用户sudo提权
案例五:
特权升级
管理ansible的配置文件
一,配置ansible
通过修改ansible配置文件中的设置来定义ansible安装行为。通过控制节点上多个可能位置之一选择相应位置的配置文件。
二,据优先级选择执行ansible配置文件
执行ansible命令根据所在目录匹配相关ansible配置文件,实践中一般使用ansible命令的目录中创建ansible.cfg文件,此目录中也将包含任何你的ansible项目使用的文件,有清单或者主机清单。
ANSIBLE_CONFIG(ansible环境变量中指向的配置文件)---->./ansible.cfg ---->~/.ansible.cfg ----> /etc/ansible/ansible.conf
查看当前使用的是哪个ansible.cfg配置文件,
[root@server ~]# ansible --version
1,按照优先级首先会匹配环境变量ANSIBLE_CONFIG
此时的环境变量为空
[student1@server ~]$ echo ANSIBLE_CONFIG
(1)我们定义环境变量ANSIBLE_CONFIG = /test/ansible.cfg;定义环境变量需要用export导出
[student1@server ~]$ export ANSIBLE_CONFIG=/test/ansible.cfg
(2)定义的环境变量有值且对应的文件存在,若匹配到的文件不存在,则按照优先级往下匹配;因为上述操作只是定义了环境变量,但是赋予环境变量的值的文件并不存在,所以匹配到的ansible配置文件为/etc/ansible/ansible.cfg
[student1@server ~]$ ansible --version
(3) 给/test授予777的权限
[root@server ~]# chmod 777 /test
(4)用studnt1用户创建/test/ansible.cfg文件
[student1@server ~]$ touch /test/ansible.cfg
(5)环境变量定义成功,且变量指定的文件存在,则ansible按照优先级匹配到的配置文件为/test/ansible.cfg
[student1@server ~]$ ansible --version
(6)取消变量名,可以重新连接或者使用取消命令
[student1@server ~]$ unset ANSIBLE_CONFIG
在命令行定义的环境变量临时有效,重启后失效,永久有效可以在/etc/bashrc文件中配置
2,第二个匹配到./ansible.cfg文件
(1) 给根目录777的权限
[root@server ~]# chmod 777 /
(2)创建一个目录/pub,切换到/pub目录下创建/ansible.cfg文件
[student1@server ~]$ mkdir /pub
[student1@server ~]$ cd /pub
[student1@server pub]$ touch /pub/ansible.cfg
(3)此时查看匹配到的ansible配置文件,发现匹配到的ansible配置文件为当前目录下的/ansible.cfg文件
[student1@server pub]$ ansible --version
3,第三个匹配到~/.ansible.cfg文件
(1)在家目录下创建隐藏文件 ansible.cfg
[student1@server ~]$ touch .ansible.cfg
(2)此时查看匹配到的ansible配置文件,发现发现匹配到的ansible配置文件为 /home/student1/.ansible.cfg文件
[student1@server ~]$ ansible --version
4,当以上文件都不存在时,ansible配置文件就会匹配到/etc/ansible/ansible.cfg
[student1@server ~]$ ansible --version
三,管理配置文件中的设置
1,打开配置文件
[root@server ~]# vim /etc/ansible/ansible.cfg
# $ ansible-config init --disabled > ansible.cfg
初始化相应的配置参数,并把参数写入到ansible.cfg文件,不生效,以注释显示
#表示注释,解释 ;表示参数
2,初始化文件,使用追加符号使其产生的配置文件追加在原有文件后面
[root@server ~]# ansible-config init --disabled >> /etc/ansible/ansible.cfg
3,配置文件由几部分组成,每部分含有以键值对形式定义的设置。部分的标题一方括号括起。重点需要了解以下两部分:
[defaults]
inventory = ./inventory #主机列表配置文件
library = /usr/share/my_modules #库文件存放目录
forks = 5 #默认并发数5 (同时可以处理5个命令--同时有20个节点主机5个主机执行在5个执行)
sudo_user = root #默认的sudo用户 root
#ask_sudo_pass = True # ansible 2.8版本取消
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使用ssh连接受管主机
一般不建议用管理用户,要求通过普通用户student1进行链接
1,在工具栏选择发送键输到所有会话
2,在控制端主机server创建student1用户并设置密码,受控端node1,node2也会自动创建相应的student用户和密码
控制端主机server
[root@server ~]# useradd student1
[root@server ~]# id student1
[root@server ~]# passwd student1
受控端主机node1
[root@node1 .ssh]# useradd student1
[root@node1 .ssh]# id student1
[root@node1 .ssh]# passwd student1
受控端主机node2
[root@node2 .ssh]# useradd student1
[root@node2 .ssh]# id student1
[root@node2 .ssh]# passwd student1
给student用户配置密码
[root@server ~]# passwd student
3,在工具栏选择发送键输到当前会话,取消发送所有会话
4,在控制端主机server打开配置文件/etc/ansible/ansible.cfg进行下列配置
[defaults]
#指定自定义主机清单文件
inventory = /test/inventory
#每次指向ansible命令需要询问ssh密码
ask_pass = True
5,在控制端主机server的普通用户student1使用ssh连接受控端主机node1的普通用户student1,此时需要进行秘钥验证和密码验证
[student1@server ~]$ ssh node1
案例二:
关闭主机秘钥验证
在管控主机中通过指定用户发起操作指令,在受管主机中通过ssh远程连接方式以student1用户身份执行,并验证密码;如果ask_pass为false 则可以通过-k 或者--ask-pass来提示接收密码进行验证。
1,在控制端主机server打开配置文件/etc/ansible/ansible.cfg进行下列配置
[defaults]
#指定自定义主机清单文件
inventory = /test/inventory
#每次指向ansible命令需要询问ssh密码
ask_pass = True
#不需要验证主机秘钥
host_key_checking = False
2,控制端主机server的普通用户student1使用ssh远程连接到受控端主机node1的普通用户student,且不需要秘钥,只需要输入密码即可。
[student1@server ~]$ ssh node1
如果ask_pass为false 则可以通过-k 或者--ask-pass来提示接收密码进行验证。
案例三:
主机免密登陆,关闭秘钥
如果不需要密码验证(忽略密码验证)则需要配置秘钥验证
1,在控制端主机server上的普通用户student1上产生公钥
[student1@server ~]$ ssh-keygen -t rsa -P '' -q -f ~/.ssh/id_rsa
-t 指定产生的秘钥类型为rsa类型
-P ' ' 指定设置的私钥密码为空
-q 静默方式产生秘钥
-f 指定存储秘钥的文件的位置
2,将公钥发送到受控端node1与node2上
[student1@server ~]$ for host in node{1..2}; do ssh-copy-id -i $host; done
3,在控制端主机server打开配置文件/etc/ansible/ansible.cfg进行下列配置
[defaults]
#指定自定义主机清单文件
inventory = /test/inventory
#每次指向ansible命令不需要询问ssh密码
ask_pass = False
#不需要验证主机秘钥
host_key_checking = False
4,控制端主机server的普通用户student1免密登录到受控端主机node1与node2上的普通用户student1,既不需要密码验证,也不需要秘钥验证
[student1@server ~]$ ssh node1
[student1@server ~]$ ssh node2
案例四:
远程用户sudo提权
1,在受控端主机node1与node2的/etc/sudoers文件中以root身份对student1用户提权,即特权下发,给wheel组的所有用户免密使用特权的权利
%wheel ALL=(ALL) NOPASSWD:ALL
2,在受控端主机node1与node2把student1加入到wheel组中
[root@node1 ~]# gpasswd -a student1 wheel
[root@node2 ~]# gpasswd -a student1 wheel
3,此时的dns组下有node1与node2用户组
[student1@server ~]$ ansible-inventory dns --graph
4,没配置特权前需要使用sudo命令执行特权操作,不使用sudo指令会报错
[student1@server ~]$ ansible dns -m command -a 'useradd xiao1'
node2 | FAILED | rc=1 >>
useradd: Permission denied.
useradd: cannot lock /etc/passwd; try again later.non-zero return code
node1 | FAILED | rc=1 >>
useradd: Permission denied.
useradd: cannot lock /etc/passwd; try again later.non-zero return code
5,在控制端server以普通用户student1身份使用sudo命令来执行特权为node1与node2添加一个新用户xiao1
[student1@server ~]$ ansible dns -m command -a 'sudo useradd xiao1'
6,在受控端node1与node2查看用户xiao1是否添加成功
案例五:
特权升级
在受控主机中通过sudo提权可在ansible配置中进行优化,开启远程用户在受管主机中执行特权升级。控制主机执行特权命令不需要指定sudo命令
1,基于案例四的基础上,进行下列配置
在控制端server的/etc/ansible/ansible.cfg文件中配置特权升级
[privilege_escalation] ;特权升级
become = true #是否开启特权升级
become_method = sudo #特权升级的模式为
become_user = root #特权升级的用户为
become_ask_pass = false #是否为become_method提示输入密码,默认为false,因为在受控端的/etc/sudoers文件中配置了免密;若没配置,此处改为True
2,此时控制端server可以不加sudo命令来执行特权
[student1@server ~]$ ansible dns -m command -a 'useradd xiao2'
3,在受控端node1与node2查看用户xiao2是否添加成功
注:在受管主机中进行配置,建议管理sudo用户提权密码验证,如果没有则关闭ask_sudo_pass = True 来开启执行命令sudo提权密码验证;但是ask_sudo_pass = False那么可以空过-K --ask-become-pass来开启执行命令sudo提权密码验证
查看详细信息,默认最多可以加4个V