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: sudo命令路径(适用于1.8及以上版本)
ansible_connection: 与主机的连接类型,如:local,ssh或paramiko,1.2以前默认使用paramiko,1.2以后默认使用‘smart’,它会根据是否支持ControlPersist来判断‘ssh’方式是否可行
ansible_ssh_private_key_file: ssh使用的私钥文件,适用于有多个密钥,而你不想使用SSH代理的情况
ansible_shell_type:目标系统的shell类型,默认情况下,命令的执行使用‘sh’语法,可设置为‘sch’或‘fish’
ansible_python_interpreter:目标主机的python路径,适用情况:系统中有多个Python,或者命令路径不是“/usr/bin/python”
ad-hoc主机管理
主机定义与分组
安装ansible之后可以做一些简单的人物
ansible配置文件查找顺序
首次检测ANSIBLE_CONFIG环境变量定义的配置文件
其次检查当前目录下的 ./ansible.cfg 文件
再次检查当前用户家目录下 ~/ansible.cfg 文件
最后检查 /etc/ansible/ansible.cfg 文件
ansible.cfg配置文件
inventory 定义托管主机地址的配置文件路径
编辑/etc/ansible/hosts 文件,写入远程主机的地址
host_key_checking = False
#不需要检测ssh主机的key
分组定义、范围定义的样例:
[web] #里面定义的主机名
web1
web2
[db]
db[1:2]
#若连续的可以使用此格式
[cache] #可以写ip地址
192.168.1.15
[app:children] #定义以下成员的组名称只能跟组名
web
db
[web]
web[1:2]
||
[web:vars]
ansible_ssh_user="root"
ansible_ssh_pass="pwd"
ansible_ssh_port="222"
# 可以定义web组内所有主机的参数,对组内所有主机有效
[other]
cache ansible_ssh_user="root"
ansible_ssh_pass="1234" # 主机名后面可以跟参数
自定义主机分组配置文件
- 创建文件夹 /var/myansible
- 创建配置文件 /var/myansible/ansible.cfg
- 配置主机文件 /var/myansible/myhosts
]# vim /var/myansible/ansible.cfg
[defaults]
inventory = /var/myansible/myhosts
]# vim /var/myansible/myhosts
[app1]
web1
web2
[app2]
db1
db2
]# cd /var/myansible/
]# ansible app2 --list-hosts
hosts (2):
db1
db2
动态主机、无限可能
ansible Inventory包含静态和动态的Inventory,静态Inventory指在文件/etc/ansible/hosts中指定的主机和组,动态Inventory指通过外部脚本获取主机列表,按照其要求格式返回给ansible命令
JSON
JSON(JavaScript Object Notation, JavaScript 对象表示法),一种基于文本独立于语言的轻量级数据交换格式
批量执行:ansible命令基础
格式:ansible 主机的集合 -m 模块的名称 -a 模块参数
-M 制定模块路径
-m 模块的名称,默认使用 command 模块
-a 模块参数
-i inventory文件路径,或可执行脚本
-k 使用交互式登陆密码
-e 定义变量
-v 详细信息,-vvvv开启debug模式
例子:
列出要执行的主机: ansible all --list-hosts
批量检测主机: ansible all -m ping
批量执行命令: ansible all -m command -a 'id' -k
批量部署证书文件: ##并行同步部署证书文件
每次交换输入密码太麻烦
密码写入配置文件安全性很差
不同主机不同密码
使用key方式认证
给所有主机部署公钥
]# ssh-keygen -t rsa -b 2048 -N ' ' #创建密钥
]# ansible all -m authorizedkey -a "user=root exclusive=true managedir=true key = '$(< /root/.ssh/id_rsa.pub)'" -k
##user=root 部署在哪个用户名下 ##exclusive=true 如果以前部署过,执行追加
##manage_dir=true 如果文件夹存在则部署密钥,如果不存在则创建后部署
##key = '$(< /root/.ssh/id_rsa.pub)' 把密钥文件标准输入到key里,部署到托管机上
批量配置管理模块:
1、Ansible-doc:模块的手册相当于shell的man,很重要
]# ansible-doc -l ## 列出所有模块
]# ansible-doc 模块名 ## 查看单个模块的帮助信息
2、Ping模块:测试网络的连通性,ping模块没有参数
注:测试ssh的连通性
]# ansible web1 -m ping
3、Command模块:默认模块,远程执行命令
]# ansible 主机组或主机 -m command -a '命令' ##用法格式
]# ansible all -m command -a 'uptime' ##查看所有机器负载
]# ansible all -m command -a 'date +%F_%T' ##查看所有机器日期和时间
command模块注意事项:该模块通过 -a 跟上要执行的命令可以直接执行,若命令里有如下字符则执行不成功 " < " " > " " | " " & "
该模块不启动shell,直接在ssh进程中执行,所有使用到shell的命令执行都会失败
会失败的例子:
]# ansible all -m command -a 'ps aux | grep ssh'
]# ansible all -m command -a 'set'
4、Shell/Raw模块
shell模块用法基本和command一样,区别是shell模块是通过/bin/sh进行执行命令,可以执行任意名义,但不支持交互式!
raw模块,用法和shell模块一样,可以执行任意命令
区别:raw没有 chdir、creates、removes 参数
Script模块:在本地写脚本,然后使用script模块批量执行
注意:该脚本包含但不限于shell脚本,只要指定sha-bang解释器的脚本都可执行
]# ansible db1 -m script -a 'test.sh'
5、Copy模块:复制文件到远程主机
src:源文件的路径,绝对路径和相对路径都可,路径为目录时会递归复制,若路径以 "/" 结尾,只复制目录里的内容,若不以 "/" 结尾,则复制包含目录在内的整个内容,类似于rsync
dest:必选项,远程主机的绝对路径,如果源文件是一个目录,那该路径必须时目录
backup:覆盖前,先备份原文件,备份文件包含时间信息,有两个选项:yes/no
force:若目标主机包含该文件,但内容不同,如果设置为 yes ,则强制覆盖,若设为 no ,则只有当目标主机的目标位置不存在该文件时才复制,默认为 yes
复制文件:
]# ansible cache -m copy -a 'src=/root/a.log dest=/root/a.log'
复制目录:
]# ansible cache -m copy -a 'src=/urdir/ dest=/tmp/'
6、① Lineinfile模块
类似于sed的一种行编辑替换模块
path:目标文件(指定要修改的文件)
regexp:正则表达式(匹配要修改的行)
line:替换后的结果(修改最终之后的样子)
6、② Replace模块
path:目标文件(指定要修改的文件)
regexp:正则表达式(匹配要修改的字符串)
line:替换后的结果(修改最终之后的样子)
例子:修改slinux配置文件为disabled
]# ansible cache -m lineinfile -a 'path="/etc/selinux/config" regexp="^SELINUX=" line="SELINUX=disabled"'
替换指定符:replace
]# ansible cache -m replace -a 'path="/etc/selinux/config" regexp="^(SELINUX=).*" replace="1disabled"'
7、Yum模块:使用yum包管理器来管理软件包
config_file:yum的配置文件
disabled_gpg_check:关闭gpg_check
disablerepo:不启用某个源
enablerepo:启用某个源
name:要进行操作的软件包名字,也可传递一个url或一个本地的rpm包的路径
state:状态 present、installed 安装套件 latest 安装最新套件
absent、removed 卸载
删除软件包
]# ansible cache -m yum -a 'name="httpd" state="removed"'
删除多个软件包
]# ansible cache -m yum -a 'name="httpd,lftp,elinks" state="removed"'
安装软件包
]# ansible cache -m yum -a 'name="httpd"'
安装多个软件包
]# ansible cache -m yum -a 'name="httpd,elinks,lftp"' #yum默认动作时安装
8、Service模块
name:必须项,服务名称
enabled:是否开启启动,yes/no
sleep:执行restarted,会在stop和start之间沉睡几秒钟
state:对当前服务执行启动、停止、重启、重新加载等操作
started、stopped、restarted、reloaded
]# ansible cache -m service -a 'name="sshd" state="restarted" enabled="yes"'