第2章 ansible基础元素
通过yum方式安装完ansible之后,它的相关文件存放位置,可以通过以下命令来查看:
rpm -ql ansible
大致分为以下几类:
1、配置文件目录:/etc/ansible
2、执行文件目录:/usr/bin
3、lib库:/usr/lib/python2.7/site-packages/ansible
4、帮助文档:/usr/share/doc/ansible-2.9.27
5、man手册:/usr/share/man/man1
ansible配置文件:/etc/ansible/ansible.cfg
分为如下几类配置
[defaults]:定义常规的连接类配置,多数保持默认即可。
[privilege_escalation]:部分配置主要针对 sudo 用户提权的配置。
[paramiko connection]:了解即可。
[ssh connection]:默认即可。
[accelerate]:加速相关。
[selinux]:了解即可。
[colors]:了解即可。
ansible 认证方式有密码认证和公私钥认证两种方式。
==============以root的身份执行==============
当前,我只有一台主机作为测试,那么首先生成相关公私钥对。
ssh-keygen -N "" -b 4096 -t rsa -C "echoyang" -f /root/.ssh/echoyang.rsa
-N:指定密码,这里指定为空
-b:指定密钥的大小,这里指定为4096个字节
-t:指定密钥的类型,这里指定为rsa
-C:备注
-f:指定私钥存放的文件
此时生成的文件是:
(我一般使用默认的方法,ssh-keygen -t rsa,系统默认生成id_rsa和id_rsa.pub文件)
为本机添加密钥认证:
ssh-copy-id -i /root/.ssh/echoyang.rsa root@localhost
尝试免密登录:
ssh -i /root/.ssh/echoyang.rsa root@localhost
==============以root的身份执行==============
==============以普通用户的身份执行==============
[echoyang@localhost ~]$ ssh-keygen -t rsa
[echoyang@localhost ~]$ ssh-copy-id -i /home/echoyang/.ssh/id_rsa echoyang@localhost
[echoyang@localhost ~]$ ssh -i /home/echoyang/.ssh/id_rsa echoyang@localhost
需要提前以root用户在/etc/sudoers文件中增加echoyang用户
sudoedit /etc/sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
echoyang ALL=(ALL) ALL
通过免密连接之后,就可以用sudo获取权限。
[echoyang@localhost ~]$ sudo mkdir /data/hello
==============以普通用户的身份执行==============
Ansible的命令使用格式:
ansible <host-pattern> [options]
ansible all -m ping -u echoyang
以echoyang用户,对所有主机执行ping存活检测
all:匹配所有主机
-m ping:表示使用ping模块
-u echoyang:表示以echoyang用户来执行此项动作
ansible all -m ping -u echoyang -b
-b:表示become,在不指定切换到谁时,默认都是切换到root,以sudo的方式从echoyang切换到root
ansible all -m ping -u echoyang -b --become-user daolin
--become-user:明确指定从echoyang切换到daolin用户
我的疑问:是登录到远程主机之后,再进行的用户切换吗?
Ansible-playbook的命令使用格式:
ansible-playbook playbook.yml
ansible-galaxy
ansible-pull
ansible-doc
ansible-vault
ansible-console
ansible命令的使用场景:
1、非固话需求
2、临时一次性操作
3、二次开发接口调用
红色表示执行过程有异常、一般会中止剩余所有的任务。
绿色和橘黄色表示执行过程没有异常,所有任务均正常执行。
但橘黄色表示命令执行结束后目标有状态的变化,绿色表示命令执行结束后目标没有状态变化。
ansible-galaxy的使用场景:
ansible-galaxy 的功能可以简单地理解为GitHub或 PIP 的功能。
通过 ansible-galaxy命令,我们可以根据下载量和关注量等信息,查找和安装优秀的Roles。
ansible-pull的使用场景:
我们使用ansible命令,默认是push模式。也就是从控制端推送任务到被控制端。
而ansible-pull是在被控制端执行的。
ansible-pull需要结合git(svn)和crontab来使用。
原理是:在定时任务中配置ansible-pull命令,ansible-pull会调用git或者svn,从指定地址下载playbook,然后执行。
管理端只需要将要执行的任务编成playbook,提交到仓库即可。
ansible-pull 通常在配置大批量机器的场景下会使用。
ansible-doc,是专门查看文档的命令。
// 列出支持的模块
ansible-doc -l
// 模块功能说明
ansible-doc ping
ansible-playbook:执行剧本,相当于ansible命令的批量化版本。
ansible-vault:
主要用于配置文件加密,如果Playbook 配置文件中包含敏感信息,不希望其他人随意查看,ansible-vault 可加密/解密这个配置文件。
ansible-console:一款类似于shell的交互控制台,方便更好地控制各台主机。
资产文件
/etc/ansible/hosts
1、未分组的主机
2、分过组的主机
3、范围
www[1:6].example.com
等价于
www1.example.com
www2.example.com
www3.example.com
www4.example.com
www5.example.com
www6.example.com
在资产文件中定义主机变量
效果等价于在远程主机直接定义变量:
在资产文件中定义组变量
为一组主机,定义共同的变量。
定义组嵌套和组变量
变量的其他定义位置
1、/etc/ansible/hosts
2、playbook中的vars区域
3、roles目录里的vars目录
4、roles目录的同级目录:group_vars和hosts_vars
正则表达式
ansible <pattern_goes_here> -m <module_name> -a <argutments>
// 重启 webservers 组所有主机的 httpd服务
ansible webservers -m service -a "name=httpd state=restarted"
(1)全量匹配
// all和*功能相同,但*号需引起来
ansible all -m ping
ansible "*" -m ping
ansible 192.168.1.* -m ping
(2)逻辑或匹配
ansible "web1:web2" -m ping
(3)逻辑非匹配
// 所有在webservers 组但不在phoenix组的主机
webservers:!phoenix
(4)逻辑与匹配
// webservers 组和 staging 组中同时存在的主机
webservers:&staging
(5)多条件组合
// webservers和dbservezs两个组中的所有主机在 staging 组中存在且在 phoenix组中不存在的主机
webservers:dbservers:&staging:!phoenix
(6)模糊匹配
// 所有以.magedu.com结尾的主机均符合
*.magedu.com
// one 开头.com结尾的所有主机和 dbservers 组中的所有主机
one*.com:dbservers
(7)域切割
webservers[0] = a
webservers[1] = b
webservers[0:1] = a
(8)正则匹配
ansible "~(beta|web|green)\.example\.(com|org)" -m ping