/etc/ansible有以下三个文件或者目录生成
[root@server ~]# cd /etc/ansible/
[root@server ansible]# ls
ansible.cfg hosts roles
1、Hosts 主机清单配置文件(定义的受控主机IP,也可以自己自定义)
2、ansible.cfg Ansible配置文件
3、Roles 角色定义目录(分为系统角色和自定义角色)
这里是默认没有的
[root@server ansible]# cd roles/
[root@server roles]# ls
[root@server roles]#
需要安装 rhel-system-role 才会生成系统角色,可以直接写入剧本生成调用模块
Ansible配置以ini格式存储配置数据,在Ansible中⼏乎所有配置都可以通过Ansible的Playbook或环境变量(export)来重新赋值。在运⾏Ansible命令时,命令将会按照以下顺序查找配置⽂件。
匹配原理的话就是只要是在当前目录下有.ansible文件才会默认按优先级来匹配
1、ANSIBLE_CONFIG :⾸先,Ansible命令会检查环境变量,及这个环境变量指向的配置⽂件。即通过ANSIBLE_CONFIG环境变量定义配置文件的位置。定义了此变量时,Ansible将使用变量所指定的配置文件,而不用上面提到的任何配置文件。
Export(设于值) ANSIBLE_CONFIG(系统自带变量)=/PATH(指定的路径)
2、./ansible.cfg (当前目录下的创建的文件):其次,将会检查当前⽬录下的ansible.cfg配置⽂件
3、~/.ansible.cfg (指定当前用户家目录下的配置文件):再次,将会检查当前⽤户home⽬录下的.ansible.cfg配置⽂件。
除去用export做的变量后,其他都会做的变量都需要在当前目录下(也就是2~3的地方),不然则只匹配以/etc/开头的
4、/etc/ansible/ansible.cfg :最后,将会检查在⽤软件包管理⼯具安装Ansible时⾃动产⽣的配置⽂件。
ANSIBLE_CONFIG环境变量指定的任何文件将覆盖所有其他配置文件。如果没有设置该变量,则接下来检查运行ansible命令的目录中是否有ansible.cfg文件。如果不存在该文件,则检查用户的家目录是否有.ansible.cfg文件。只有在找不到其他配置文件时,才使用全局/etc/ansible/ansible.cfg文件。如果/etc/ansible/ansible.cfg配置文件不存在,Ansible包含它使用的默认值。
由于Ansible配置文件可以放入的位置有多种,因此Ansible当前使用哪一个配置文件可能会令人困惑。我们可以运行以下命令来清楚地确认所安装的Ansible版本以及正在使用的配置文件。
ansible --version
[root@ansible ~]# vim /etc/ansible/ansible.cfg
[defaults] 为默认配置
# some basic default values...
#inventory = /etc/ansible/hosts #主机清单存放位置,需要保证文件里面有内容(绝对路径)
#library = /usr/share/my_modules/ #库文件存放目录,ansible默认搜寻模块的位置
#module_utils = /usr/share/my_module_utils/ #模块存放目录
#remote_tmp = ~/.ansible/tmp #受控节点临时py命令文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp #控制本机的临时命令执行目录
#forks = 5 #默认并发数 (一次性执行五条的命令并发出去)
#poll_interval = 15 #时间间隔
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行ansible命令是否询问sudo用户密码,默认值为no,这里要打开
#ask_pass = True #每次执行ansible命令是否询问ssh密码,默认值为no
#transport = smart #传输方式
#remote_port = 22 #远程端口号
#remote_user = root ----远程用户,受控主机使用什么用户进行执行ansible任务
#roles_path = /etc/ansible/roles #定义角色路径
#host_key_checking = False #不需要主机密钥的检查
[privilege_escalation] 定义对受管主机执行特权升级,默认普通用户是没有权限来执行很多ansible任务的,但是我们可以给普通用户提权,让它有权限去执行ansible任务
become = true #开启提权
become_method = sudo
become_user = root
become_ask_pass = false #提权后不需要密码
[paramiko_connection]、[ssh_connection]、[accelerate]这些模块 用于优化与受管主机的连接
[selinux] 定义如何配置selinux交互
清单定义ansible将要管理的一批主机。这些主机也可以分配到组中,以进行集中管理。组可以包含子组,主机也可以是多个组的成员。清单还可以设置应用到它所定义的主机和组的变量。
在[defaults]部分中,inventory指令可以直接指向某一静态清单文件,或者指向含有多个静态清单文件和动态清单脚本的某一目录。
可以通过两种方式定义主机清单。静态主机清单可以通过文本文件来定义。动态主机清单可以根据需要使用外部信息提供程序通过脚本或者其他程序来生成。
3、黄色代表执行成功,受控节点发生了变化
4、红色代表发生错误,需要进行拒绝,并会提供相对应的解决日志
//题目
创建名为/home/student/ansible/inventory的静态清单文件, 以满足以下需求:
node1是dev主机组的成员
node2是test主机组的成员
node3是prod主机组的成员
prod组是webservers主机组的成员
//保证使用清单测试时候不需要输入密码
[root@server ~]# vim /etc/sudoers.d/student
student ALL=(ALL) NOPASSWD: ALL
[root@server ~]# for i in node{1..3}; do scp /etc/sudoers.d/student root@$i:/etc/sudoers.d/; done
student 100% 36 13.5KB/s 00:00
student 100% 36 15.2KB/s 00:00
student 100% 36 16.8KB/s 00:00
[root@server ~]# ssh student@localhost
student@localhost's password:
Last login: Fri Oct 21 20:46:57 2022 from ::1
[root@server ~]# for i in node{1..3}; do scp /etc/sudoers.d/student root@$i:/etc/sudoers.d/; done
[student@server ~]$ cd ansible/
[student@server ansible]$ ls
ansible.cfg inventory roles
//按照题目定义清单
[student@server ansible]$ vim inventory
[dev]
node1
[dev2]
node2
[prod]
node3
[webservers:children] //定义一个子目录
prod
[student@server ansible]$ vim ansible.cfg
remote_user = student //以student用户执行
roles_pat /home/student/ansible/roles //定义角色
host_key_checking = False //关闭密钥认证
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
//访问测试
[student@server ansible]$ ansible all -m ping
node1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
node3 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
node2 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}