主机规划
主机名称 | 操作系统版本 | 内网IP | 外网IP(模拟) | 安装软件 |
---|---|---|---|---|
ansi-manager | CentOS7.5 | 172.16.1.180 | 10.0.0.180 | ansible |
ansi-haproxy01 | CentOS7.5 | 172.16.1.181 | 10.0.0.181 | |
ansi-haproxy02 | CentOS7.5 | 172.16.1.182 | 10.0.0.182 | |
ansi-web01 | CentOS7.5 | 172.16.1.183 | 10.0.0.183 | |
ansi-web02 | CentOS7.5 | 172.16.1.184 | 10.0.0.184 | |
ansi-web03 | CentOS7.5 | 172.16.1.185 | 10.0.0.185 |
添加用户账号
说明:
1、 运维人员使用的登录账号;
2、 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放;
3、 该用户也被 ansible 使用,因为几乎所有的生产环境都是禁止 root 远程登录的(因此该 yun 用户也进行了 sudo 提权)。
1 | # 使用一个专门的用户,避免直接使用root用户 |
Ansible 配置清单Inventory
之后文章都是如下主机配置清单
1 | [yun@ansi-manager ansible_info]$ pwd |
Ansible执行返回 => 颜色信息说明
黄色:成功执行并且伴随着状态的改变
1 | ansible proxyservers -m command -a 'cat /etc/hosts' -i hosts_key |
绿色:成功执行并且没有发生状态的改变,或者只是对远程节点状态信息进行查看
1 | ansible proxyservers -m ping -i hosts_key |
红色:操作执行命令有异常
1 | ansible proxyservers -m command -a 'll /tmp' -i hosts_key |
紫色:表示对命令执行发出警告信息(可能存在的问题,给你一下建议)
1 | # 其中 hosts_kkk 文件不存在 |
Ansible 之 Ad-Hoc
Ansible中有两种模式, 分别是 Ad-Hoc 模式和 Playbooks 模式。
ad-hoc简而言之,就是“临时命令”,不会保存。
ad-hoc模式的使用场景
场景一,在多台机器上,查看某个进程是否启动
场景二,在多台机器上,拷贝指定日志文件到本地,等等
ad-hoc模式的命令使用
Ansible查看帮助方法
1 | [yun@ansi-manager ~]$ ansible-doc -l # 查看所有模块与简要说明 |
Ansible常用模块
工作目录与主机清单
当前所在的工作目录和主机清单
1 | [yun@ansi-manager ansible_info]$ pwd |
command 命令模块
默认模块, 用于执行命令。但不支持管道或重定向。
正常示例
1 | [yun@ansi-manager ansible_info]$ ansible proxyservers -a 'df -h' -i hosts_key |
异常示例
1 | # 重定向不支持 |
shell 命令模块
功能和 command 相同,且支持管道和重定向。与 command 相比,优先使用该模块。
示例
1 | ansible proxyservers -m shell -a "df -h | grep 'boot'" -i hosts_key |
script 脚本模块
在本地运行模块,等同于在远程执行。且不需要将脚本文件推送到目标主机进行执行。
示例
脚本中有 sudo 提权
1 | # 在 ansible 管理机操作 |
脚本中无 sudo 提权
1 | # 在 ansible 管理机操作 |
在目标机器查看是否在 yum 安装 iftop
1 | [root@ansi-haproxy01 ~]# ps -ef | grep 'iftop' |
yum 安装软件模块
在目标机器实现 yum 安装软件
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
相关选项说明:
name:要安装软件包的名称
state:状态说明
‘present’ 和 ‘installed’ 简单地确保安装了所需的包。「优先使用 present」
‘latest’ 将更新指定的软件包,如果它不是最新可用的版本。
‘absent’ and ‘removed’ 将删除指定的包【慎用!!!】。「如要使用优先使用 absent」
download_only:只下载包,不安装
copy 文件拷贝模块「本地到远端」
将控制机的文件或目录拷贝到受控机,并且可以指定目标文件/目录的属性信息。
控制机操作
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
被控端查看
1 | [yun@ansi-haproxy01 tmp]$ cat copy_test2 |
相关选项说明:
src:源文件「可以是绝对路径或相对路径」
remote_src:为 False「默认」,则源文件在本地;为 True ,则源文件在远端「了解」
dest:推送数据的目标路径或目标文件
owner:指定远端文件的属主
group:指定远端文件的属组
mode:指定远端文件的权限
backup:如果推送的目标文件存在且与源文件内容不同,那么会对目标文件进行备份「通过 checksum 校验」
content:将 content 中的内容直接写入目标文件中
注意事项:
1、同一个源文件,如果源文件内容没有任何修改,那么进行第二次相同的操作时,检测到要拷贝的文件和目标文件内容相同「通过 checksum 校验」,且目标文件属性前后未发生改变,那么就不会进行拷贝。由于目标文件属性未发生改变,所以返回数据颜色为绿色。如下图所示。
2、同一个源文件,如果源文件内容没有任何修改,那么进行第二次相同的操作时,如果源文件和目标文件内容相同「通过 checksum 校验」,但目标文件属性前后要求发生改变「属主、属组、权限」,那样也不会进行拷贝。但由于目标文件属性发生改变,所以返回数据颜色为黄色。
fetch 文件拷贝模块「远端到本地」
该模块功能类似于 copy 模块,但是是反向的。将远端的文件拷贝到本地。备注:当前仅支持文件,暂不支持递归拷贝。
由于ansible使用的是 yun 用户,因此从远端拷贝过来的文件属主、属组都是 yun。
控制机操作
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
被控端文件准备1
1 | [test1@ansi-haproxy01 tmp]$ ll /tmp/test1 |
被控端文件准备2
1 | [test1@ansi-haproxy02 tmp]$ ll /tmp/test1 |
拷贝方式1
1 | [yun@ansi-manager ansible_info]$ ansible 172.16.1.181 -b -m fetch -a "src=/tmp/test1 dest=/tmp/" -i ./hosts_key # 拷贝 172.16.1.181 主机的 |
拷贝方式2
1 | # 如果使用 flat=yes,那么最好只拷贝一台远端主机的文件,如果是多台那么后面执行的结果,会把前面的覆盖掉。 |
相关选项说明:
src:源文件,当前仅支持文件,不支持目录
dest:推送数据的目标路径,默认为:dest[路径]/hostname/src[路径]。参见上面示例
flat: 默认 False。当为 yes/True 时,那么拷贝效果类似于本地的 copy。
template 模板使用
该模块功能类似于 copy 模块,但 copy 模块不支持变量,不支持模板。
template 模块支持变量,支持 Jinja 模板。因此如果生成中的配置文件涉及变量,那么请使用 template 模块。
涉及到 playbook、变量和 Jinja ,这些在后面的文章会有详解。
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
目标机器查看
1 | [root@ansi-haproxy01 tmp]# pwd |
相关选项说明:
src:源文件「可以是绝对路径或相对路径」
dest:推送数据的目标路径或目标文件
owner:指定远端文件的属主
group:指定远端文件的属组
mode:指定远端文件的权限
backup:如果推送的目标文件存在且与源文件内容不同,那么会对目标文件进行备份
file 文件配置模块
在受控机创建文件或目录,或修改属性信息「如:属主、属组、权限」
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
相关选项说明:
path:指定目标文件或目录
owner:指定目标文件的属主
group:指定目标文件的属组
mode:指定目标文件的权限
state:状态说明
file:默认值,指定文件
link:创建软连接
hard:创建硬链接
touch:如果文件不存在则创建
directory:如果目录不存在则创建
absent:如果目标文件或目录存在,则删除「慎用!!!」
recurse:递归授权
lineinfile 行编辑模块
此模块确保文件中有特定的行,或者使用反向引用的正则表达式替换现有的行。当您只想更改文件中的一行时,这非常有用。
如果您想要更改多个相似的行,请查看[replace]模块。如果你想要插入/更新/删除文件中的一个行块,请查看[blockinfile]模块。对于其他情况,请参见[copy]或[template]模块。
数据文件准备
1 | [yun@ansi-manager tmp]$ cat /tmp/lineinfile_test |
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
行插入
1 | # 如果文件中没有 line 中的字符串,那么就追加在文件末尾;有则不作任何操作。 |
行替换
1 | # state=present时,如果多次匹配,那么最后一次匹配会被修改;如果没有匹配成功则在文件末尾追加,不管line是否存在。 |
行删除
1 | # state=absent时,如果多次匹配,那么每一次匹配都会删除匹配行 |
相关选项说明:
path:要修改的文件。
line:与 state=present 配合使用;在文件中要插入或者替换的行。
state:状态说明
present:添加或修改,默认值
absent:删除
backrefs:与 state=present 配合使用;如果设置了 line 可以包含反向引用(位置和命名),当‘regexp’匹配,就会填充反向引用。
这个参数稍微改变了模块的操作;’insertbefore’ 和 ‘insertafter’ 将被忽略,如果 ‘regexp’ 与文件中的任何地方不匹配,文件将保持不变。
regexp:对文件的每行进行正则匹配;对于 state=present 只有最后的一次行匹配会被替换;对于 state=absent 只要匹配就会删除该行。
backup:对源文件备份。默认:False
create:与 state=present 配合使用;如果不存在则创建文件。默认:False
insertafter:与 state=present 配合使用;在匹配行后插入。使用正则表达式,在指定正则表达式的最后一次匹配之后插入该行。如果需要第一个匹配,则使用(firstmatch=yes)。
如果没有匹配成功,那么会在文件末尾处插入。优先级低于 regexp。
insertbefore:与 state=present 配合使用;在匹配行前插入。使用正则表达式,在指定正则表达式的最后一次匹配之前插入该行。如果需要第一个匹配,则使用(firstmatch=yes)。
如果没有匹配成功,那么会在文件末尾处插入。优先级低于 regexp。
firstmatch:与 insertafter 或 insertbefore 配合使用;在 insertafter 或 insertbefore 的首次正则匹配。默认:False
owner:指定远端文件的属主
group:指定远端文件的属组
mode:指定远端文件的权限
blockinfile 多行编辑模块
该模块可以帮助我们在指定的文件中插入”一段文本”,这段文本是被标记过的。
换句话说就是,我们在这段文本上做了记号,以便在以后的操作中可以通过”标记”找到这段文本,然后修改或者删除它
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
对不存在的文件进行——多行插入与修改
1 | # /tmp/blockinfile_test 文件是不存在的,因此使用了create选项 |
对已存在的文件进行——多行插入与修改
1 | [root@ansi-manager ansible_info]# cat /tmp/blockinfile_test2 # 查看文件信息 |
相关选项说明:
path:要修改的文件。
block:要插入标记行内的文本。如果该选项缺失或是一个空字符串,该块将被删除,就像 “state” 被指定为 “absent” 。(别名:content)
state:状态说明
present:添加或修改,默认值
absent:删除
create:文件不存在则创建。默认:False
backup:对源文件备份。默认:False
insertafter:在匹配行后插入。使用正则表达式,在指定正则表达式的最后一次匹配之后插入该block。
如果没有匹配成功,那么会在文件末尾处插入。
insertbefore:在匹配行前插入。使用正则表达式,在指定正则表达式的最后一次匹配之前插入该block。
如果没有匹配成功,那么会在文件末尾处插入。
marker:标记线模板。’{mark}’ 将被替换为 ‘in marker_begin’ 的值【默认:BEGIN】和 ‘marker_end’ 的值【默认:END】
marker_begin:开始的标记变量信息。默认:BEGIN
marker_end:结尾的标记变量信息。默认:END
owner:指定远端文件/目录的属主
group:指定远端文件/目录的属组
mode:指定远端文件/目录的权限
ini_file INI格式配置模块
在一个ini的文件中管理(添加、删除、更改)单独的配置,而不必使用[template]或[assemble]来管理整个文件。添加不存在的section。
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
添加与修改
1 | # 第一次执行,如果文件不存在,默认会创建 添加 section 和 option 信息 |
删除
1 | # 删除整个section, 删除drinks这个section |
相关选项说明:
path:INI格式文件路径。如果没有则默认会创建。
section:INI文件中的 section 名。当设置单个值时,如果是 ‘state=present’ 则会自动添加这个值。如果留空或设置为 ‘null’,’option’ 将放在第一个 ‘section’ 之前。
如果配置格式不支持 section,也需要使用 “null”。
option:如果设置(需要更改的 value),这是选项的名称。如果添加/删除整个“section”,可以省略。默认:null
value:option 的值。删除 “option” 时可以省略。
state:状态说明
present:添加或修改,默认值
absent:删除
backup:对源文件备份。默认:False
create:如果不存在则创建文件。默认:True
owner:指定远端文件的属主
group:指定远端文件的属组
mode:指定远端文件的权限
no_extra_spaces:在 = 符号前后不插入空格。默认:False
replace 多行替换模块
对文件所匹配的内容进行替换/删除。
数据文件准备
1 | [yun@ansi-manager ~]$ cat /tmp/replace_test |
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
相关选项说明:
path:要操作的文件路径。
after:如果指定,只有after匹配之后的内容将被替换/删除。可以与before组合使用。after可能匹配一行也可能匹配一行的部分;且不支持正则匹配。
before:如果指定,只有before匹配之前的内容将被替换/删除。可以与after组合使用。before可能匹配一行也可能匹配一行的部分;不支持正则匹配。
regexp:要在文件内容中查找的正则表达式。
replace:替换regexp匹配项的字符串。可能包含反向引用,如果regexp匹配,将使用regexp捕获组展开这些反向引用。如果没有设置,则完全删除匹配项。
反向引用可以像 ‘\1’ 那样含糊地使用,也可以像 ‘\g<1>’ 那样显式地使用。
backup:对源文件备份。默认:False
encoding:用于读写文件的字符编码。默认:utf-8
owner:指定远端文件的属主
group:指定远端文件的属组
mode:指定远端文件的权限
sysctl 修改内核参数模块
这个模块操作 sysctl 条目,并在更改它们之后可选地执行 /sbin/sysctl -p 。
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
相关选项说明:
name:内核参数变量名。(别名:key)
value:sysctl键的期望值。(别名:val)
reload:当为 yes 时,如果 sysctl_file 文件被修改,那么会执行 /sbin/sysctl -p,使修改的参数生效。当为 no 时,则不重载 sysctl ,尽管 sysctl_file 已被修改。
state:状态说明
present:添加或修改,默认值
absent:删除
sysctl_file:指定 sysctl.conf 文件的绝对路径。默认:/etc/sysctl.conf
sysctl_set:使用sysctl命令验证令牌值,必要时使用 -w 进行设置。默认:no
ignoreerrors:使用此选项可忽略关于未知键的错误。默认:no
get_url 文件下载模块
通过 HTTP,HTTPS或 FTP 下载一个文件。
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
相关选项说明:
mode:指定目标文件的权限
url:指定文件来源「支持 HTTP,HTTPS 和 FTP」
dest:指定目标存放的目录或文件
checksum:校验和「支持 sha256 和 md5」
timeout:请求超时时间,默认 10 秒。
owner:指定远端文件的属主
group:指定远端文件的属组
mode:指定远端文件的权限
backup:源文件备份
service、systemd 服务管理模块
如果在 CentOS 6 及以下版本,优先使用 service 。
如果在 CentOS 7 及以上版本,优先使用 systemd 。
这里考虑到我们使用的 CentOS 7,因此使用的是 systemd 。至于 service 请自行查看文档。
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
相关选项说明:
name:服务名称
state:服务状态
started:启动服务
stopped:停止服务
reloaded:重加载服务
restarted:重启动服务
enabled:是否加入开机自启动「yes 加入, no 不加入, 默认 null」
daemon_reload:当我们修改了服务管理配置文件,是否重加载其配置「yes 重加载服务配置文件, no 不加载,默认值」
group 组模块
创建或删除用户组
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
相关选项说明:
gid:指定组ID,默认 null
name:指定组名称
state:组状态
present:创建组,默认
absent:删除组
system:是否为系统组
true:是系统组
false:不是系统组
user 用户模块
创建或删除用户
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
1、创建用户,指定 UID,指定附加组,不创建家目录,不可以登录
1 | [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m user -a "name=zhangtest uid=1005 groups=zhang,yun create_home=no shell=/sbin/nologin" -i ./hosts_key |
受控机查看信息
1 | [yun@ansi-haproxy02 ~]$ id zhangtest |
2、删除用户,但不删除用户的家目录
1 | [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m user -a "name=zhangtest state=absent" -i ./hosts_key |
3、为用户创建密码或SSH key 秘钥
1 | [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m user -a "name=zhangtest2 generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa" -i ./hosts_key |
4、为用户创建密码
1 | # 得到密码串 |
相关选项说明:
name:用户名称
state:用户状态
present:默认值,创建用户
absent:删除用户
password:用户密码,默认:null
shell:设置用户的shell
uid:指定用户 UID
group:设置用户主组,默认:null
groups:设置用户附加组,默认:null
system:如果为 yes 则创建系统用户,默认:false
home:设置用户家目录
create_home:是否创建家目录,默认:true,如果不创建为:no
comment:用户描述,默认:null
expires:用户账号失效日期,默认:null
update_password:更新密码
always:如果密码不同,则更新,默认值
on_create:只有新建用户时使用
remove:只有在 state=absent 时生效,作用:删除用户家目录
generate_ssh_key:是否生成SSH key 密钥对,默认:false
ssh_key_bits:设置 SSH key 字节长度,默认:有 ssh-keygen 设置
ssh_key_comment:设置 SSH key 的描述,默认为:$HOSTNAME
ssh_key_file:指定 SSH key 的文件名,默认:null 【即为:.ssh/id_rsa】
ssh_key_passphrase:指定 SSH key 密码,如果不提供则没有密码,默认:null
ssh_key_type:设置 SSH key 类型,默认:rsa
cron 定时任务模块
创建、注释或删除定时任务
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
1 | ## 创建定时任务, name 为定时任务说明 |
相关选项说明:
name:定时任务描述
state:状态
present:添加,默认值
absent:删除
user:指定哪个用户的定时任务会修改,默认是 root 用户,默认:null
minute:哪个分钟执行 ( 0-59, *, */2, etc ),默认:*
hour:哪个小时执行 ( 0-23, *, */2, etc ),默认 *
day:每月的哪天执行 ( 1-31, *, */2, 等 ),默认:*
month:哪个月执行 ( 1-12, *, */2, etc ),默认:*
weekday:每周的哪天执行 ( 0-6 为 Sunday-Saturday, *, etc ),默认:*
disabled:是否注释指定定时任务,默认:false
job:定时任务要操作的具体信息
mount 文件系统挂载模块
文件系统的挂载与取消。
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
案例示例:
在 ansi-manager 机器作为 NFS 的服务端,ansi-haproxy01、ansi-haproxy02 作为 NFS 的客户端。
1、在所有机器安装 NFS 必要的包
1 | [yun@ansi-manager ansible_info]$ ansible manageservers,proxyservers -b -m yum -a "name=nfs-utils,rpcbind state=present" -i ./hosts_key |
2、NFS 服务端配置与启动
1 | [yun@ansi-manager ansible_info]$ ansible manageservers -b -m copy -a 'content="/data 172.16.1.0/24(rw,sync,root_squash,all_squash)\n" dest=/etc/exports' -i ./hosts_key |
3、NFS 客户端操作
1 | [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m systemd -a "name=rpcbind state=started enabled=yes" -i ./hosts_key |
4、NFS 客户端挂载
1 | ## 不挂载设备,仅在 /etc/fstab 中写入挂载配置信息 |
相关选项说明:
src:要挂在的设备/磁盘
path:挂载点
opts:挂载参数选项,如:ro,noauto;默认:null
fstype:文件系统类型
state:状态
present:不挂载设备,仅在 /etc/fstab 中写入挂载配置信息
mounted:挂载设备,并在 /etc/fstab 中写入挂载配置信息
unmounted:不卸载设备,仅在 /etc/fstab 中删除挂载配置信息
absent:卸载设备,并在 /etc/fstab 中删除挂载配置信息
backup:对之前的文件备份
debug 调试模块与 register 变量
这里会使用 playbook 书写。具体的 playbook 详解,参见后面的文章。
涉及到 playbook、变量和 Jinja ,这些在后面的文章会有详解。
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
第一个 task 中,使用了 register 注册变量,名为 host_port ;当 shell 模块执行完毕后,会将数据放到该变量中。
第二给 task 中,使用了 debug 模块,并从 host_port 中获取数据。
assert 断言模块【了解】
对自定义消息断言。
涉及到 playbook、变量和 Jinja ,这些在后面的文章会有详解。
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
相关选项说明:
that:列表字符串表达式
success_msg:当断言成功时输出的信息
fail_msg:别名 msg,当断言失败时输出的信息
quiet:默认 False,设置为 yes 避免冗长输出
selinux 安全模块
配置 SELinux 。
1 | # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」 |
相关选项说明:
state:状态
disabled:不可用
enforcing:强制执行
permissive:会提醒