ansible的基本配置
一、主机清单
1、定义主机
- 主机的定义可以使用域名,主机名,ip地址来定义,需要主机能够解析到对应的ip地址
[root@master ansible]# cat hosts
node1
node2
qq1.com
192.168.50.10
# ansible all --list 就是列出主机清单中的所有主机
[root@master ansible]# ansible all --list
hosts (4):
node1
node2
qq1.com
192.168.50.10
-
也可以指定范围
-
定义主机的范围
[root@master ansible]# cat hosts
node1
node2
qq1.com
192.168.50.10
192.168.50.[11:15]
# 定义了11到15这个ip地址
[root@master ansible]# ansible all --list
hosts (9):
node1
node2
qq1.com
192.168.50.10
192.168.50.11
192.168.50.12
192.168.50.13
192.168.50.14
192.168.50.15
2、主机组的定义
- 主机组就是管理多个主机 [组名]即可
[root@master ansible]# cat hosts
node1
node2
[webserver]
n1
n2
# 列出的时候,还是列出的主机
[root@master ansible]# ansible all --list
hosts (4):
node1
node2
n1
n2
- 问题
# 定义了一个n8的主机,但是了还是属于这个webserevr这个组
[root@master ansible]# cat hosts
node1
node2
[webserver]
n1
n2
n8
[root@master ansible]# ansible webserver --list
hosts (3):
n1
n2
n8
# 如果不想属于这个组的话的,就需要写在最前面
[root@master ansible]# cat hosts
n8
node1
node2
[webserver]
n1
n2
[root@master ansible]# ansible webserver --list
hosts (2):
n1
n2
3、主机组的嵌套
-
就是你管理2个机房的服务器,通过定义一个大的组,这个大的组里面有2个小组,来进行管理
-
在组的后面添加这个children即可
[root@master ansible]# cat hosts
[webserver]
n1
n2
[sqlserver]
n3
n4
[machine:children]
webserver
sqlserver
[root@master ansible]# ansible machine --list
hosts (4):
n1
n2
n3
n4
4.查看主机和主机组的主机
# 查看这个主机组
[root@master ansible]# ansible webserver --list
hosts (2):
n1
n2
# 查看不包含在主机组的主机
[root@master ansible]# ansible ungrouped --list
[WARNING]: No hosts matched, nothing to do
hosts (0):
5、通配符查询和正则查询
# n* 查看以n开头主机
[root@master ansible]# ansible n* --list
hosts (4):
n1
n2
n3
n4
-
正则查询
-
"-^(e|t)" ,必须前面要有~就表示是正则匹配
-
取反的操作也可以的
二、配置文件优先级
-
最高的就是一个环境变量
-
当前目录的配置文件
-
用户家目录下的.ansible.cfg这个配置文件
-
/etc/ansible/ansible.cfg
-
流程就是先去找环境变量,有的话就输出,没有的话就去找当前目录的ansible.cfg这个配置文件,然后再去找用户家目录下面的.ansible.cfg,再去找etc目录下面的配置文件
二、基本配置文件详解
1、配置文件段
- 一共10个配置项
[defaults] 通用的配置项
[inventory]与主机清单相关配置
[privilege_escalation] 特权升级的相关配置
[paramiko_connection] 之前老的连接的相关配置
[ssh_connection] 使用openssh连接的相关配置
[persistent_connection] 持久化的相关配置
[accelerate] 加速模式相关配置
[selinux]selinux相关配置
[color]ansible命令输出的颜色相关的配置
[diff]是否再运行时,打印diff,也就是前后变更的差异
2、详细的参数
[root@master ansible]# cat ansible.cfg
[defaults]
inventory = /etc/ansible/hosts # 定义主机清单的文件路径
ask_sudo_pass=false # 使用sudo提权的时候不需要输入密码
ask_pass=false # 使用密钥进行连接,true的话就是使用密码进行连接
remote_user=devops # 在被控节点上面使用devops用户进行管理
deprecation_warnings=False # 警告关闭
host_key_checking=no # 不需要主机验证,也就是不需要ssh提前连接,不需要有known_hosts中提前有被控节点的信息
log_path = /var/log/ansible.log # 指定一个存储ansible日志文件,默认是不记录日志的
# 提权的配置
[privilege_escalation]
become=true # 是否开启提权
become_method=sudo # 提权的方式是什么,使用sudo
become_user=root # 提权到的用户是哪一个,是root用户
become_ask_pass=false # 提权的时候不输入密码
三、配置一个普通用户管理被控节点过程
-
首先就是三个节点,一个主控节点,2个被控节点
-
首先就是在三个节点上面创建devops用户,然后就是进行提权的操作(相等于是root用户的操作)
-
然后做好一个免密的登录,就是主控节点能够免密登录到2个被控节点上面去
然后就是ansible.cfg相关的配置了
1、创建一个devops用户并且提权和安装ansible
# 在主控节点上面创建devops用户和提权
useradd devops
echo 123 | passwd --stdin devops
# 修改提权文件
vim /etc/sudoers
# 配置不需要密码就能免密登录了
devops ALL=(ALL) NOPASSWD:ALL
# pip安装ansible
pip install ansible -i https://pypi.tuna.tsinghua.edu.cn/simple
# 在被控节点上面创建devops用户
[root@master ansible]# ansible all -m shell -a "useradd devops && echo 123 | passwd --stdin devops" -u root -k
SSH password:
node1 | CHANGED | rc=0 >>
Changing password for user devops.
passwd: all authentication tokens updated successfully.
node2 | CHANGED | rc=0 >>
Changing password for user devops.
passwd: all authentication tokens updated successfully.
# 给被控节点提权
[root@master ansible]# ansible all -m shell -a "echo 'devops ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers " -u root -k
SSH password:
node1 | CHANGED | rc=0 >>
node2 | CHANGED | rc=0 >>
# 上面都是使用的ansible来直接进行操作的,如果使用的命令的就需要敲很多遍,因此的话,这种方式是非常的方便的
1、验证devops用户是否有root权限
[devops@node1 ~]$ sudo -l
Matching Defaults entries for devops on node1:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin,
env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User devops may run the following commands on node1:
(ALL) NOPASSWD: ALL
2、主控节点能够免密登录到被控节点上面去
# 切换到deovps用户上
ssh-keygen
# 发送密钥给其他用户
ssh-copy-id devops@node1
ssh-copy-id devops@node2
3、编写ansible.cfg配置文件和hosts文件
- 这个hosts文件提前写好了的
# 这些文件都是devops用户创建的,管理的
# 权限需要注意
[devops@master ansible]$ ll
total 8
-rw-r--r--. 1 devops devops 240 Sep 5 15:54 ansible.cfg
-rw-r--r--. 1 devops devops 19 Sep 5 15:53 hosts
[devops@master ansible]$ cat ansible.cfg
[defaults]
inventory = ./hosts
ask_sudo_pass=false
ask_pass=false
remote_user=devops
deprecation_warnings=False
host_key_checking=no
[privilege_escalation]
become=true
become_method=sudo
become_user=root
become_ask_pass=false
[devops@master ansible]$ cat hosts
[node]
node1
node2
4、验证普通用户管理被控节点
[devops@master ansible]$ ansible all -m ping
node1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
node2 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
四、ansible执行的过程
-
首先加载自己的配置文件,默认是/etc/ansible/ansibe.cfg
-
查找对应的主机配置文件,找到要执行的主机或者组
-
加载自己对应的模块文件
-
通过ansible将模块或者命令生成对应的临时py文件(也就是python脚本),并且将这个文件传输到远程服务器
-
对应执行用户的家目录的.ansible/tmp/xxx/xxx.py文件
-
给文件执行x权限
-
执行并返回结果
-
删除临时py文件

浙公网安备 33010602011771号