目录
一、ansible
1.有网环境
2.无网环境
3.配置文件
4.主机清单
二、常用命令
三、ansible模块
1.command ---- 远程主机执行命令
2.shell 支持shell特性的command
3.script ---- 运行shell脚本
4.copy ---- 复制文件到远程主机
5.fetch ---- 从主机提取文件到主控端
6.file 设置文件属性
7.unarchive ---- 解压缩
8.archive ---- 压缩
9.yum ---- 软件包管理
10.corn ---- 定时任务
11.service ---- 管理服务
12.user ---- 管理用户
13.group ---- 管理用户组
14.lineinfile ---- 替换
15.replace ---- 替换
16.setup ---- 收集主机信息
四、playbook
五、roles
yum -y install epel-release && yum -y install ansible
ansible --version
yum install epel-release --downloadonly --downloaddir=/data/ansible
yum -y install epel-release
yum install ansible --downloadonly --downloaddir=/data/ansible
yum -y install epel*.rpm && yum -y install *.rpm
ANSIBLE_CFG:首先,Ansible命令会先检查环境变量,及这个环境变量将指向的配置文件
./ansible.cfg:其次,将会检查当前目录下的ansible.cfg配置文件
~/.ansible.cfg:再次,将会检查当前用户home目录下的.ansible.cfg配置文件
/etc/ansible/ansible.cfg:最后,将会检查在安装Ansible时自动生产的配置文件
配置项 | 说明 | 默认值 |
---|---|---|
inventory | ansible inventory文件路径 | /etc/ansible/hosts |
library | ansible模块文件路径 | /usr/share/my_modules/ |
remote_tmp | ansible远程主机脚本临时存放目录 | ~/.ansible/tmp |
local_tmp | ansible管理节点脚本临时存放目录 | ~/.ansible/tmp |
forks | ansible执行并发数 | 5 |
poll_interval | ansible异步任务查询间隔 | 15 |
sudo_user | ansible sudo用户 | root |
ask_sudo_pass | 运行ansible是否提示输入sudo密码 | True |
ask_pass | 运行ansible是否提示输入密码 | True |
transport | ansible远程传输模式 | smart |
remote_port | 远程主机SSH端口 | 22 |
module_lang | ansible模块运行默认语言环境 | C |
gathering | facts信息收集开关定义 | smart |
roles_path | ansible role存放路径 | /etc/ansible/roles |
timeout | ansible SSH连接超时时间 | 10 |
remote_user | ansible远程认证用户 | root |
log_path | ansible日志记录文件 | /var/log/ansible.log |
module_name | ansible默认执行模块 | command |
executable | ansible命令执行shell | /bin/sh |
hash_behaviour | ansible主机变量重复处理方式 | replace |
private_role_vars | 默认情况下,角色中的变量将在全局变量范围中可见。 为了防止这种情况,可以启用以下选项,只有tasks的任务和handlers得任务可以看到角色变量 | yes |
vault_password_file | 指定vault密码文件路径 | 无 |
ansible_managed | 定义的一个Jinja2变量,可以插入到Ansible配置模版系统生成的文件中 | Ansible managed |
display_skipped_hosts | 开启显示跳过的主机 | True |
error_on_undefined_vars | 开启错误,或者没有定义的变量 | False |
action_plugins | ansible action插件路径 | 无 |
cache_plugins | ansible cache插件路径 | 无 |
callback_plugins | ansible callback插件路径 | 无 |
connection_plugins | ansible connection插件路径 | 无 |
lookup_plugins | ansible lookup插件路径 | 无 |
inventory_plugins | ansible inventory插件路径 | 无 |
vars_plugins | ansible vars插件路径 | 无 |
filter_plugins | ansible filter插件路径 | 无 |
terminal_plugins | ansible terminal插件路径 | 无 |
strategy_plugins | ansible strategy插件路径 | 无 |
fact_caching | 定义ansible facts缓存方式 | memory |
fact_caching_connection | 定义ansible facts缓存路径 | 无 |
/etc/ansible/hosts
配置项 | 说明 |
---|---|
ansible_ssh_host | 目标主机地址 |
ansible_ssh_port | 目标主机端口,默认22 |
ansible_ssh_user | 目标主机用户 |
ansible_ssh_pass | 目标主机ssh密码 |
ansible_sudo_pass | sudo密码 |
ansible_sudo_exe | sudo 命令路径 |
ansible_connection | 与主机的连接类型,比如:local,ssh或者paramiko |
ansible_ssh_private_key_file | 私钥地址 |
ansible_shell_type | 目标系统的shell类型 |
ansible_python_interpreter | python版本 |
vi /etc/ansible/hosts
[client1]
网络地址
[client2]
网络地址 ansible_connection=ssh ansible_ssh_user=root ansible_ssh_pass="xxxx"
直接显示密码不安全
[client3]
网络地址 ansible_ssh_port=22
参数 | 说明 |
---|---|
host-pattern | 主机或者主机组 |
-f FORKS | 并行任务数,默认为5 |
-m MODULE_NAME | 执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数 |
-a MODULE_ARGS | 模块的参数 |
-k,--ask-pass | ask for SSH password。登录密码,提示输入SSH密码而不是假设基于密钥的验证 |
--ask-su-pass | ask for su password。su切换密码 |
-K,--ask-sudo-pass | ask for sudo password。提示密码使用sudo,sudo表示提权操作 |
--ask-vault-pass | ask for vault password。假设我们设定了加密的密码,则用该选项进行访问 |
-B SECONDS | 后台运行超时时间 |
-C | 模拟运行环境并进行预运行,可以进行查错测试 |
-c CONNECTION | 连接类型使用 |
-i INVENTORY | 指定主机清单的路径,默认为/etc/ansible/hosts |
--list-hosts | 查看有哪些主机组 |
-o | 压缩输出,尝试将所有结果在一行输出,一般针对收集工具使用 |
-S | 用 su 命令 |
-R SU_USER | 指定 su 的用户,默认为 root 用户 |
-s | 用 sudo 命令 |
-U SUDO_USER | 指定 sudo 到哪个用户,默认为 root 用户 |
-T TIMEOUT | 指定 ssh 默认超时时间,默认为10s,也可在配置文件中修改 |
-u REMOTE_USER | 远程用户,默认为 root 用户 |
-v | 查看详细信息,同时支持-vv,-vvv,-vvvv可查看更详细信息 |
ansible client3 -m ping
ansible client3 -m ping -k
ansible client2 -m ping
ssh
exit
ansible client2 -m ping
添加known_hosts解决 ssh 需要输入yes问题
absible all -m ping
批量推公钥
ansible all -m authorized_key -a "user=root key='{{ lookup('file','/root/.ssh/id_rsa.pub') }}'" -k
使用 command 模块在远程主机中执行命令时,不会经过远程主机的 shell 处理,在使用 command 模块时,如果需要执行的命令中含有重定向、管道符等操作时,这些符号也会失效。
相关选项如下:
creates:一个文件名,当该文件存在,则该命令不执行
free_form:要执行的linux指令,这里的free_form不需要写成赋值的形式,直接写要执行的命令即可,ansible -a代替
chdir:在执行指令之前,先切换到该目录
removes:一个文件名,当该文件不存在,则该选项不执行
executable:切换shell来执行指令,该执行路径必须是一个绝对路径
ansible all -m command -a 'chdir=/data ls'
如果不存在/data目录 执行ls
ansible all -m command -a 'creates=/data ls'
如果存在/data目录 执行ls
ansible all -m command -a 'removes=/data ls'
只能执行简单命令,shell不执行
ansible all -m command -a ' ls | grep rc'
在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令(支持管道符号等功能)
查看所有主机boot分区的磁盘使用率
ansible all -m shell -a ' df -h | grep boot'
实现远程批量运行本地的 shell 脚本
输入hello world到远程主机的/opt/test.txt文件中
echo 'echo "hello world" > /opt/test.txt ' > test.sh
ansible all -m script -a "test.sh"
ansible all -m command -a "cat /opt/test.txt"
相关选项如下:
backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no
content:用于替代“src”,可以直接设定指定文件的值
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
directory_mode:递归设定目录的权限,默认为系统默认权限
force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
others:所有的file模块里的选项都可以在这里使用
src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync
owner 文件复制到远程并设定属主,默认为root
group 文件复制到远程并设定属组,默认为root
mode 文件复制到远程并设定权限,默认file=644,directory=755
复制本地的test.sh到远程主机,强制覆盖并备份
ansible client1 -m copy -a "src=/root/test.sh dest=/root/ backup=yes force=yes"
ansible client1 -m copy -a "content=/root/test.sh dest=/root/test.sh backup=yes force=yes"
该模块用于从远程某主机获取(复制)文件到本地。有两个选项:
dest:用来存放文件的目录
src:在远程拉取的文件,并且必须是一个file,不能是目录
不指定 flat 会在dest指定目录下创建一个目录,以主机名命名
ansible client1 -m fetch -a "src=/root/test.sh dest=/root/ flat=yes"
ansible client1 -m fetch -a "src=/root/test.sh dest=/data/"
ls /data/
file模块用来设置文件属性,并且创建或者删除目录,创建连接。
相关选项如下:
force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归设置文件的属性,只对目录有效
src:被链接的源文件路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
在/data/目录下新建data目录并新建文件 1.txt 属主为mysql 属组为root,没有/data/data则新建
ansible client1 -m file -a 'path=/data/data/1.txt owner=mysql group=root state=directory'
ansible client1 -m command -a "ls -l /data/data"
用于解压文件,模块包含如下选项:
copy:在解压文件之前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在。
creates:指定一个文件名,当该文件存在时,则解压指令不执行
src:如果copy为yes,则需要指定压缩文件的源路径
dest:远程主机上的一个路径,即文件解压的路径
owner:解压后文件或目录的属主
group:解压后的目录或文件的属组
mode:解压后文件的权限
list_files:如果为yes,则会列出压缩包里的文件,默认为no,2.0版本新增的选项
打包本机/data目录,上传到远程主机并解压
tar cfP data.tar.gz /data
ansible client1 -m unarchive -a 'src=/root/data.tar.gz dest=/data copy=yes'
path 远程主机上需要被打包/压缩的源文件(可以是文件列表,支持glob模式)
dest 打包/压缩后的包文件路径(包文件的父目录必须存在);如果包文件已存在,则会被覆盖。
format 指定压缩类型,包括:bz2、gz(默认)、tar、xz、zip
owner 指定属主
group 指定属组
mode 指定权限
remove yes|no,默认为no,在打包/压缩后,不删除源文件。
压缩/data/data目录,并删除/data/data目录下文件
ansible client1 -m archive -a 'path=/data/data dest=/data/data.gz format=gz remove=yes'
name 所安装的包的名称
state present--->安装, latest--->安装最新的, absent---> 卸载软件。
update_cache 强制更新yum的缓存
conf_file 指定远程yum安装时所依赖的配置文件(安装本地已有的包)。
disable_pgp_check 是否禁止GPG checking,只用于presentor latest。
disablerepo 临时禁止使用yum库。 只用于安装或更新时。
enablerepo 临时使用的yum库。只用于安装或更新时
安装最新的httpd
ansible client1 -m yum -a 'name=httpd state=latest'
卸载httpd
ansible client1 -m yum -a 'name=httpd state=absent'
day 日应该运行的工作( 1-31, *, */2, )
hour 小时 ( 0-23, *, */2, )
minute 分钟( 0-59, *, */2, )
month 月( 1-12, *, /2, )
weekday 周 ( 0-6 for Sunday-Saturday,, )
job 指明运行的命令是什么
name 定时任务描述
reboot 任务在重启时运行,不建议使用,建议使用special_time
special_time 特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)
state 指定状态,present表示添加定时任务,也是默认设置,absent表示删除定时任务
user 以哪个用户的身份执行
每分钟同步一次aliyun时间服务器
ansible client1 -m cron -a 'name="ntpdate time" minute="*/1" job="ntpdate ntp1.aliyun.com"'
查看定时任务
ansible client1 -m command -a ' crontab -l'
ansible client1 -m command -a ' crontab -l'
enabled 设置开机启动。
name 服务名称
runlevel 开机启动的级别,一般不用指定。
sleep 在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。(定义在剧本中。)
state 有四种状态,分别为:started--->启动服务, stopped--->停止服务, restarted--->重启服务, reloaded--->重载配置
启动nginx,并加入开机自启
ansible client1 -m service -a 'name=nginx state=started enabled=yes '
comment 用户的描述信息
createhome 是否创建家目录
force 在使用state=absent时, 行为与userdel –force一致.
group 指定基本组
groups 指定附加组,如果指定为(groups=)表示删除所有组
home 指定用户家目录
move_home 如果设置为home=时, 试图将用户主目录移动到指定的目录
name 指定用户名
non_unique 该选项允许改变非唯一的用户ID值
password 指定用户密码,使用 SHA512 hash
remove 在使用state=absent时, 行为是与userdel –remove一致
shell 指定默认shell
state 设置帐号状态,不指定为创建,指定值为absent表示删除
system 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid 指定用户的uid
update_ password
always 如果password参数设置的值与用户当前的加密过的密码字符串不一致,则直接更新用户的密码,默认值即为always
on_create 如果password参数设置的值与用户当前的加密过的密码字符串不一致,则不会更新用户的密码字符串,保持之前的密码设定
创建一个用户es,不创建家目录
ansible client1 -m user -a 'name=es createhome=no'
gid 设置组的GID号
name 指定组的名称
state 指定组的状态,默认为创建,设置值为absent为删除
system 设置值为yes,表示创建为系统组
创建test组
ansible client1 -m group -a 'name=test gid=1005'
删除test组
ansible client1 -m group -a 'name=test gid=1005 state=absent'
path 指定要操作的文件
regexp 使用正则表达式匹配对应的行
line 修改为新的内容
insertafter 将文本插入到“指定的行”之后
insertbefore 将文本插入到“指定的行”之前
state 删除对应的文本时,需要state=absent
backrefs 1.支持后向引用、2.当未匹配到内容则不操作文件
backup 是否在修改文件之前对文件进行备份
create 当要操作的文件并不存在时,是否创建对应的文件
创建文件,并插入hello
ansible client1 -m lineinfile -a 'path=/data/2.txt line="hello" create=yes'
在hello后面插入world
ansible client1 -m lineinfile -a 'path=/data/2.txt line="world" insertafter="hello"'
将hello替换成world
ansible client1 -m lineinfile -a 'path=/data/2.txt line="world" regexp="hello"'
path 必须参数,指定要修改的文件,2.3版本之前,这个参数叫dest、destfile、name;现在这三个名称是path参数的别名
regexp 必须参数,指定一个正则表达式,可以是python正则
replace 替换regexp参数匹配到的字符串,
owner 结果文件或目录的所属用户名,相当于chown命令修改
group 结果文件或目录的所属组名,相当于chown命令修改
mode 结果文件或目录的权限,与chmod命令不一致的是,replace模块的mode参数需要添加前导零,以便ansible的YAML解析器知道它是八进制;1.8版本后可以设置为符号模式(u+rwx或u=rw),2.6版本后可以是特殊字符串(preserve),当设置为’preserve’时,文件将被赋予与源文件相同的权限。
others 可以指定file模块的所有参数
encoding 用于读取和写入文件的字符编码
before 如果指定,则仅替换/删除此匹配之前的内容,可以和after参数结合使用
after 如果指定,则仅替换/删除此匹配之后的内容,可以和before参数结合使用
attributes 结果文件或目录的特殊属性,相当chattr,默认使用=运算符,指定文件或目录的某项属性
backup 修改源文件前创建一个包含时间戳信息的备份文件
将文件中的 wo 字符 替换成 he
ansible client1 -m replace -a 'path=/data/2.txt regexp="wo" replace="he"'
ansible test -m setup 获取全部信息
Ansible facts 是远程系统的信息,主要包含IP地址,操作系统,以太网设备,mac 地址,时间/日期相关数据,硬件信息等信息
选项:filter参数:用于进行条件过滤。如果设置,仅返回匹配过滤条件的信息。
常用的过滤关键词:
ansible_all_ipv4_addresses:仅显示ipv4的信息
ansible_devices:仅显示磁盘设备信息
ansible_distribution:显示是什么系统,例:centos,suse等ansible_distribution_major_version:显示是系统主版本
ansible_distribution_version:仅显示系统版本
ansible_machine:显示系统类型,例:32位,还是64位
ansible_eth0:仅显示eth0的信息
ansible_hostname:仅显示主机名
过滤主机名
ansible client1 -m setup -a 'filter=ansible_hostname'
name 唯一id,用来标识这个play主要用来干什么
hosts 列出这个play会在远程的哪些host上执行
remote_user 指定远程host执行用户
become_method 用于指定切换账号时使用的特权账号,如su和sudo
become 用于设置是否切换账号运行,如果没有设置become_method,则使用sudo进行账号切换
become_user 用于指定使用sudo进行账号切换时具体切换到哪个账号,使用这个参数时需要become为true,对于become_method可设置也可不设置,如果不设置,使用默认的sudo账号进行账号切换
ignore_errors 用于控制当play中的某一个task执行失败时,是否继续执行后面的task
pre_tasks 用于指定在roles定义的tasks之前执行的tasks,具体可参考ansible playbook play执行顺序
roles 列出这个play会引入哪些roles,可与pre_tasks,post_tasks和tasks一起控制play执行顺序
post_tasks 用于指定所有task执行之后的任务,跟pre_tasks一样也可以用来控制执行顺序
tasks 用于指定一系列要执行的task列表,跟pre_tasks, post_tasks和roles一起控制play执行顺序
run_once 用于控制对于相同的host是否对相同任务执行多次,默认是false
timeout 设置每个task最多执行时间,超时则task执行失败,返回错误
vars 使用Dictionary格式定义play级别变量,可参考ansible变量详解
vars_files 引入包含当前play变量的文件列表
gather_facts 设置是否需要收集远程host的fact变量结果
handlers 被tasks调用的任务列表
安装nginx,使用nginx1启动worker进程,开机自启,打包nginx目录,创建定时时间同步的任务
roles: <--所有的角色必须放在roles目录下,这个目录可以自定义位置,默认的位置在/etc/ansible/roles
project: <---具体的角色项目名称,比如nginx、tomcat、php
files: <--用来存放由copy模块或script模块调用的文件。
templates: <--用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件。
tasks: <--此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件。
main.yml
handlers: <--此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作。
main.yml
vars: <--此目录应当包含一个main.yml文件,用于定义此角色用到的变量。
main.yml
defaults: <--此目录应当包含一个main.yml文件,用于为当前角色设定默认变量。
main.yml
meta: <--此目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。
main.yml