由于急用, 只记录到playbook, 如role角色等未记录
安装
Centos
yum install -y epel-release
yum install -y ansible
快速入门
免密登录配置
# 操作在Master主机上进行,一路回车
[root@vm01 ~]# ssh-keygen -t rsa
# 配置公钥到其他节点,输入对方用户名(这里以root为例)和密码即可完成从vm01到vm02的免密访问
[root@vm01 ~]# ssh-copy-id root@vm02
# 配置ssh本地免密
[root@vm01 ~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
修改ansible配置文件
vi /etc/ansible/hosts
# 添加连接的主机
----------------
172.16.21.127
172.16.21.181
172.16.21.182
172.16.21.183
172.16.21.184
172.16.21.195
172.16.21.196
172.16.21.197
----------------
测试
[root@k8s-master ~]# ansible all -m ping
172.16.21.182 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
.....
[root@k8s-master ~]# ansible all -a "/bin/echo hello"
172.16.21.182 | CHANGED | rc=0 >>
hello
172.16.21.181 | CHANGED | rc=0 >>
hello
......
Inventory文件
主机和组
/etc/ansible/hosts
k8s-master ansible_connection=local
#方括号[]中是组名,用于对系统进行分类
[k8s]
172.16.21.181
# 选择连接类型和用户名
172.16.21.182 ansible_connection=ssh ansible_ssh_user=test
# 相似主机名简写 k8s-node3、k8s-node4...
k8s-node[3:7]
[dbservers]
# 端口号不是默认设置时,可显性表示
172.16.20.140:2222
db-[c:f]
# 组的变量
[k8s:vars]
ansible_ssh_port=22
ansible_ssh_user=root
分文件定义Host和Group变量
文件格式为yaml
例子:主机名为foosball
属于两个组:raleigh
,webservers
,配置文件为foosball
/etc/ansible/group_vars/raleigh
------------------
# 配置案例(yaml格式)
ntp_server: acme.example.org
database_server: storage.example.org
------------------
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball
在进一步
# 分别设置不同类型的变量
/etc/ansible/group_vars/raleigh/db_settings
/etc/ansible/group_vars/raleigh/cluster_settings
Inventory参数的说明
ansible_ssh_host: 将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port: ssh端口号.如果不是默认的端口号,通过此变量设置.
ansible_ssh_user: 默认的 ssh 用户名
ansible_ssh_pass: ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
ansible_sudo_pass: sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)
ansible_sudo_exe (new in version 1.8): sudo 命令路径(适用于1.8及以上版本)
ansible_connection: 与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.
ansible_ssh_private_key_file: ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
ansible_shell_type: 目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish'.
ansible_python_interpreter: 目标主机的 python 路径
适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 /data/python3
不是 2.X 版本的 Python, 不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).
与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....
Patterns(表达式)
一个pattern通常关联到一系列组(主机的集合)
# Inventory文件内容
[master]
k8s-master
[node]
k8s-node[1:7]
# 表示仓库(inventory)中的所有机器
all
*
# 测试
ansible all -m ping
# 如下patterns分别表示一个或多个groups, 多组之间以冒号分隔表示或的关系, 这意味着一个主机可以同时存在多个组:
webservers
webservers:dbservers
# 测试
ansible master -m ping
ansible master:node -m ping
# 排定一个特定组
# 执行命令有机器需要隶属于 g1 或 g2
g1:g2
# 执行命令有机器需要同时隶属于 g1 和 g2
g1:&g2
# 执行命令的机器必须隶属 g1 组但不在 g2 组:
g1:!g2
# 可以不必严格定义groups,单个的host names, IPs , groups都支持通配符:
# 如
k8s-node*
k8s-*:g1
# 支持正则,只需要以 ~ 开头即可
~^k8s-[mn].*[1-3]$
# ping k8s-master1、k8s-master2、k8s-node1、k8s-node2
ansible ~^k8s-[mn].*[1-2]$ -m ping
ad-hoc(命令行)
# 教程:https://blog.csdn.net/Kangshuo2471781030/article/details/82733074
ansible <host-pattern> [options]
-v,--verbose:输出更详细的执行过程信息,-vvv可得到执行过程所有信息
[root@k8s-master ~]# ansible master -m command -a 'pwd' -v
Using /etc/ansible/ansible.cfg as config file
k8s-master | CHANGED | rc=0 >>
/root
-i,PATH,--inventory(清单)=PATH:指定inventory(清单)信息,默认/etc/ansible/hosts
-f NUM,--forks=NUM:并发线程数(每次do几个),默认5个线程
# 每次进行2个节点的ping操作
[root@k8s-master ~]# ansible node -f 2 -m ping
--private-key=PRIVATE_KEY_FILE:指定密钥文件
-m NMAE,--module-name=NAME:指定执行使用的模块
# 常用模块:https://www.cnblogs.com/keerya/p/7987886.html
[root@server ~]# ansible-doc
Usage: ansible-doc [options] [module...]
Options:
-h, --help show this help message and exit # 显示命令参数API文档
-l, --list List available modules #列出可用的模块
-M MODULE_PATH, --module-path=MODULE_PATH #指定模块的路径
specify path(s) to module library (default=None)
-s, --snippet Show playbook snippet for specified module(s) #显示playbook制定模块的用法
-v, --verbose verbose mode (-vvv for more, -vvvv to enable # 显示ansible-doc的版本号查看模块列表:
connection debugging)
--version show program's version number and exit
ansible-doc -l #获取全部模块的信息
ansible-doc -s MOD_NAME #获取指定模块的使用帮助
-M DIRECTORY,--module-path=DIRECTORY:指定模块存放路径,默认/usr/share/ansible,也可以通过ANSIBLE_LIBRARY设定默认路径
-a ‘ARGUMENTS’,--args=‘ARGUMENTS’:模块参数
-k,--ask-pass SSH:认证密码
-K,--ask-sudo-pass sudo:用户的密码(-s/--sudo时使用)
-o,--one-line:标准输出至一行
[root@k8s-master ~]# ansible master -m ping -o
k8s-master | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
-s,--sudo:相当于Linux系统下的sudo命令
-t DIRECTORY,--tree=DIRECTORY:输出信息至DIRECTORY目录下,结果文件以远程主机命名
-T SECONDS,--timeout=SECONDS:指定连接远程主机的最大超时,单位是秒
-B NUM,--background=NUM:后台执行命令,超NUM秒后中止正在执行的任务
-P NUM,--poll=NUM:定期返回后台任务进度
-u USERNAME,--user=USERNAME:指定远程主机以USERNAME运行命令
ansible master -m ping -u test # 指定用户执行
-U SUDO_USERNAME,--sudo-user=SUDO_USERNAME:使用sudo,相当于LInux下的sudo命令
-c CONNECTION,--connection=CONNECTION:指定连接方式,可用选项paramiko(SSH)、ssh、local,local方式常用于crontab和kickstarts
-l SUBSET,--limit=SUBSET:指定运行主机
-l ~REGEX,--limit=~REGEX:指定运行主机(正则)
--list-hosts:列出符合条件的主机列表,不执行任何命令
[root@k8s-master ~]# ansible all --list-hosts
hosts (8):
k8s-node1
k8s-node2
k8s-node3
k8s-node4
k8s-node5
k8s-node6
k8s-node7
k8s-master
Ansible配置文件
ansible配置读取的顺序,配置不会被叠加:
* ANSIBLE_CONFIG (一个环境变量)
* ansible.cfg (位于当前目录中)
* .ansible.cfg (位于家目录中)
* /etc/ansible/ansible.cfg
ansible.cfg的配置默认分为八段:
- [defaults]:通用配置项
- [inventory]:与主机清单相关的配置项
- [privilege_escalation]:特权升级相关的配置项
- [paramiko_connection]:使用paramiko连接的相关配置项,Paramiko在RHEL6以及更早的版本中默认使用的ssh连接方式
- [ssh_connection]:使用OpenSSH连接的相关配置项,OpenSSH是Ansible在RHEL6之后默认使用的ssh连接方式
- [persistent_connection]:持久连接的配置项
- [accelerate]:加速模式配置项
- [selinux]:selinux相关的配置项
- [colors]:ansible命令输出的颜色相关的配置项
- [diff]:定义是否在运行时打印diff(变更前与变更后的差异)
配置参数:http://ansible.com.cn/docs/intro_configuration.html#environmental-configuration
Palybooks
基础
---
# hosts 行的内容是一个或多个组或主机的patterns
- hosts: master,node
# remote_user 用户名
remote_user: root