第 4 章 Ansible常用模块
第 4 章 Ansible常用模块
模块文档:https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html
• 执行shell命令(command和shell、script)
• ping模块(常用来检测被控端是否在线)
• 文件传输(copy和file)
• 管理软件包(yum)
• 用户和组(user)
• 从源代码管理系统部署(git)
• 获取远程文件信息(stat)
• 远程主机下载指定url到本地(get_url)
• 设置远程主机定时任务 (cron)
• 用于目录、文件同步 (synchronize)
• 设置远程主机sysctl配置(sysctl)
• 管理服务(service)
• 收集目标主机信息(setup)
执行shell命令(command和shell、script)
3个远程命令模块:command、shell、script
command (默认模块),缺点无法批量执行命令,无法使用管道、重定向等特殊符号,适用一些基本命令
shell (远程调用/bin/bash模块)能从终端能输入的命令它都能执行
script模块 使用scripts模块可以在本地写一个脚本,在远程服务器上执行。
shell模块示例:
设置ntp服务:
ansible -i /etc/ansible/hosts web -m shell -a "yum install -y ntpdate && ntpdate ntp.aliyun.com && timedatectl status"
注意:使用shell时只能写一条命令:支持特殊符号,如 | && ''等。
注:但是我们自己定义在~/.bashrc或~/.bash_profile中的环境变量shell模块由于没有加载,所以无法识别;如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句;
加载主机自身环境变量:使用soucre 加载主机变量
ansible -i /etc/ansible/hosts web -m shell -a "source ~/.bash_profile && echo $PATH && df -iTh | grep sda"
script模块 使用示例:
vim get_ip.sh #!/bin/bash ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}'
引用脚本文件进行安装部署
ansible -i /etc/ansible/hosts web -m script -a "/etc/ansible/get_ip.sh"
ping模块(常用来检测被控端是否在线)
ansible all -m ping
文件传输(copy和file)
copy模块
例如:把ansible主机上的/etc/hosts文件复制到主机组中机器的/tmp目录下,并设置文件权限
ansible -i /etc/ansible/hosts web -m copy -a "src=/etc/hosts dest=/tmp/ owner=root group=root mode=0755"
copy模块操作说明:src表示源文件,dest表示目标目录或者文件,owner指定拥有者
ansible -k all -m copy -a 'content="Hello World" dest=/tmp/jfedu.txt mode=755 owner=root'
copy模块操作,content文件内容,dest目标文件,owner指定拥有者
file模块
file模块设置文件属性。state状态值必须是其中之一: absent, directory, file, hard, link, touch。(absent表示删除)
file模块操作,path表示目录的名称和路径,也可以用dest,name代替; state=directory表示创建目录 touch表示创建文件;mode用来设置权限
使用file创建一个目录:
ansible -m file -a "path=/tmp/`date +%F` state=directory mode=755"
使用file创建一个文件
ansible -i /etc/ansible/hosts web -m file -a "path=/tmp/hosts mode=0777"
管理软件包(yum)
yum模块可以提供的status #状态:latest 、present、installed #这3个代表安装
latest表示安装最新版本;
present:安装一个指定(特殊)版本;
installed 安装
removed, absent 是卸载
使用示例:
ansible -i /etc/ansible/hosts web -m yum -a "name=tree state=latest"
以下是来原官网的yml案例
- name: 安装最新版本的apache
yum: name=httpd state=latest
- name: 移除apache
yum: name=httpd state=absent
- name: 安装一个特殊版本的apache
yum: name=httpd-2.2.29-1.4.amzn1 state=present
- name: 升级所有的软件包
yum: name=* state=latest
- name: 从一个远程yum仓库安装nginx
yum: name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present
- name: 从本地仓库安装nginx
yum: name=/usr/local/src/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present
- name: 安装整个Development tools相关的软件包
yum: name="@Development tools" state=present
用户和组(user)
user模块远程主机用户管理
user 模块可以帮助我们管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等操作。
常用参数
name参数:必须参数,用于指定要操作的用户名称,可以使用别名 user。
group参数:此参数用于指定用户所在的基本组。
gourps参数:此参数用于指定用户所在的附加组。注意,如果说用户已经存在并且已经拥有多个附加组,那么如果想要继续添加新的附加组,需要结合 append 参数使用,否则在默认情况下,当再次使用 groups 参数设置附加组时,用户原来的附加组会被覆盖。
append参数:如果用户原本就存在多个附加组,那么当使用 groups 参数设置附加组时,当前设置会覆盖原来的附加组设置,如果不想覆盖原来的附加组设置,需要结合 append 参数,将 append 设置为 yes,表示追加附加组到现有的附加组设置,append 默认值为 no。
shell参数:此参数用于指定用户的默认 shell。
uid参数:此参数用于指定用户的 uid 号。
expires参数:此参数用于指定用户的过期时间,相当于设置 /etc/shadow 文件中的的第8列,目前此参数只支持在 Linux 和 FreeBSD 系统中使用。
comment参数:此参数用于指定用户的注释信息。
state参数:此参数用于指定用户是否存在于远程主机中,可选值有 present、absent,默认值为 present,表示当前用户存在,当设置为 absent 时表示已删除用户。
remove参数:当 state 的值设置为 absent 时,表示要删除远程主机中的用户。当 state=absent 并且 remove=yes 时,相当于执行 “userdel --remove” 命令。
password参数:此参数用于指定用户的密码。但是这个密码不能是明文的密码,而是一个对明文密码”加密后”的字符串,你可以在 python 的命令提示符下输入如下命令,生成明文密码对应的加密字符串。
import crypt; crypt.crypt('666666') 输入上述命令后,即可得到明文密码666666对应的加密字符串。
update_password参数:此参数有两个值可选,always 和 on_create,当此参数的值设置为always 时表示,如果 password 参数设置的值与用户当前的加密过的密码字符串不一致,则直接更新用户的密码,默认值即为 always,但是当此参数设置为 on_create 时,如果 password参数设置的值与用户当前的加密过的密码字符串不一致,则不会更新用户的密码字符串,保持之前的密码设定。如果是新创建的用户,即使此参数设置为 on_create,也会将用户的密码设置为 password 参数对应的值。
generate_ssh_key参数:此参数默认值为 no,如果设置为 yes,表示为对应的用户生成 ssh 密钥对,默认在用户家目录的 ./ssh 目录中生成名为 id_rsa 的私钥和名为 id_rsa.pub 的公钥,如果同名的密钥已经存在与对应的目录中,原同名密钥并不会被覆盖(不做任何操作)。
ssh_key_file参数:当 generate_ssh_key 参数的值为 yes 时,使用此参数自定义生成 ssh 私钥的路径和名称,对应公钥会在同路径下生成,公钥名以私钥名开头,以”.pub”结尾。
ssh_key_comment参数:当 generate_ssh_key 参数的值为 yes 时,在创建证书时,使用此参数设置公钥中的注释信息。但是如果同名的密钥对已经存在,则并不会修改原来的注释信息,即不做任何操作。当不指定此参数时,默认的注释信息为”ansible-generated on 远程主机的主机名”。
ssh_key_passphrase参数:当 generate_ssh_key 参数的值为 yes 时,在创建证书时,使用此参数设置私钥的密码。但是如果同名的密钥对已经存在,则并不会修改原来的密码,即不做任何操作。
ssh_key_type参数:当 generate_ssh_key 参数的值为 yes 时,在创建证书时,使用此参数设置密钥对的类型。默认密钥类型为 rsa,但是如果同名的密钥对已经存在,并不会对同名密钥做任何操作。
示例如下:
1.在 web组的主机上创建名为 longtao 的用户,如果用户已经存在,则不进行任何操作。
ansible -i /etc/ansible/hosts web -m user -a "name=longtao"
2.在 web组的主机上删除名为 longtao 的用户,但是不会删除 ding 用户的家目录。
ansible -i /etc/ansible/hosts web -m user -a "name=longtao state=absent"
3.在 web组的主机上删除名为longtao的用户,同时会删除 longtao用户的家目录等信息。如果已经不存在 longtao的用户,则不做任何操作。
ansible -i /etc/ansible/hosts web -m user -a "name=longtao state=absent remove=yes"
4.指定 web组的主机上的 longtao用户的主组为 testgroup,testgroup 组需要提前存在,当不使用 group 设置主组时,默认主组与用户名相同。
ansible -i /etc/ansible/hosts web -m user -a "name=longtao group=root append=yes"
5.指定 web组的主机上的 longtao 用户的附加组为 testgroup2,testgroup2 组需要提前存在.在不知道用户原来的附加组设定的情况下,最好将 append 参数设置为 yes.
ansible -i /etc/ansible/hosts web -m user -a "name=longtao groups=root,testgroup2 append=yes"
6.指定 web组的主机上的 longtao 用户的过期时间为2021年12月31日。
[root@CentOS7 ~]# ansible -i /etc/ansible/hosts web -m user -a "name=longtao expires=1640880000"
设置2021-12-31 对应日期的 unix 时间戳。
[root@CentOS7 ~]# date -d 2021-12-31 +%s
1640880000
设置90天后用户账号过期的 unix 时间戳
[root@CentOS7 ~]# date -d '+90 day' +%s
1636860499
7.指定 web组的主机上的 longtao 用户的注释信息。
ansible -i /etc/ansible/hosts web -m user -a 'name=longtao comment="longtao.vip"'
8.将 web组的主机上的 longtao用户的密码设置为888888。
首先生成888888的加密字符串:
[root@CentOS7 ~]# python Python 2.7.5 (default, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import crypt;crypt.crypt('888888') '$6$GqvJ6Opf2SyZ5/cL$qyGNlvhI3XqYPubIdGpQp6fr3QdkDLem/CaU8BiduZMN2PJLBvSyamngDnznws428x/4988rg9VJ1T1P7oR481'
使用生成的密码字符串设置用户密码:password="" 必须使用双引号引起,不能使用单引号引起
ansible -i /etc/ansible/hosts web -m user -a 'name=longtao password="$6$GqvJ6Opf2SyZ5/cL$qyGNlvhI3XqYPubIdGpQp6fr3QdkDLem/CaU8BiduZMN2PJLBvSyamngDnznws428x/4988rg9VJ1T1P7oR481"'
9.为 web组上的 longtao 用户生成 ssh 密钥对。存放路径默认。
如果已经存在同名密钥,并不会覆盖原来的密钥,即不做任何操作。
ansible -i /etc/ansible/hosts web -m user -a 'name=longtao generate_ssh_key=yes'
10.为 web组上的 longtao 用户生成 ssh 密钥对,密钥对生成在 /opt 目录下,私钥名为 id_rsa_longtao,公钥名为 id_rsa_longtao.pub。
ansible -i /etc/ansible/hosts web -m user -a 'name=longtao generate_ssh_key=yes ssh_key_file=/opt/id_rsa_longtao'
11.为web组上的 longtao 用户生成 ssh 密钥对,同时指定公钥中的注释信息为 “longtao.vip”,此参数只能在创建密钥时使用才会生效,并不能操作同名的老密钥。
ansible -i /etc/ansible/hosts web -m user -a 'name=longtao generate_ssh_key=yes ssh_key_comment="longtao.vip"'
12.为 web组上的 longtao 用户生成 ssh 密钥对,同时指定私钥的密码为123456,此参数只能在创建密钥时使用才会生效,并不能操作同名的老密钥。
ansible -i /etc/ansible/hosts web -m user -a 'name=longtao generate_ssh_key=yes ssh_key_passphrase="123456"'
13.为 web组上的 longtao 用户生成 ssh 密钥对,同时指定密钥对的类型为 dsa,当不指定密钥类型时,默认类型为 rsa,此参数只能在创建密钥时使用才会生效,并不能操作同名的老密钥。
ansible -i /etc/ansible/hosts web -m user -a 'name=longtao generate_ssh_key=yes ssh_key_type=dsa'
14.关于用户密钥对总结:(秘钥相关参数只能生成时添加,不能生成后修改)
参数:
generate_ssh_key=yes 生成秘钥对
ssh_key_type=dsa 指定生成秘钥对加密类型,可选rsa | dsa
ssh_key_file=/opt/id_rsa_longtao 指定密钥对生成位置和名称
ssh_key_comment="longtao.vip" 指定公钥中的注释信息为 “longtao.vip”
ssh_key_passphrase="123456" 指定私钥安装密码:123456
从源代码管理系统部署(git)
ansible -i /etc/ansible/hosts -m git -a "repo=https://foo.example.org/repo.git dest=/srv/myapp version=HEAD"
例如:拉取ansible的源代码:GitHub地址:https://github.com/ansible/ansible.git
[root@CentOS7 ~]# ansible -i /etc/ansible/hosts abc -m git -a "repo=git://github.com/ansible/ansible.git dest=/tmp/ansible"
47.241.90.203 | CHANGED => { "after": "1c34492413dec09711c430745034db0c108227a9", "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "before": null, "changed": true }
获取远程文件信息(stat)
ansible -i /etc/ansible/hosts web -m stat -a "path=/tmp/hosts"
远程主机下载指定url到本地(get_url)
get_url模块实现远程主机下载指定url到本地,支持sha256sum文件校验。
ansible -i /etc/ansible/hosts web-servers -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp/ mode=0440 force=yes"
注:url=https://xxx 的等号=前后不能有空格
扩展:查看force=yes的作用
# ansible-doc -s get_url #在弹出的信息中找到force参数信息
如果force=yes,当下载文件时,如果所下的内容和原目录下的文件内容不一样,则替换原文件,如果一样,就不下载了。
如果force=no, 则仅在目标不存在时才会下载文件。 一般来说,只有小型本地文件才应该为“是”。 在0.6之前,该模块表现为默认为“是”。
例如:下载阿里yum源
ansible -i /etc/ansible/hosts web -m get_url -a "url=http://mirrors.aliyun.com/repo/Centos-7.repo dest=/etc/yum.repos.d/ mode=0644 force=yes"
ansible -i /etc/ansible/hosts web -m get_url -a "url=http://mirrors.aliyun.com/repo/epel-7.repo dest=/etc/yum.repos.d/ mode=0644 force=yes"
设置远程主机定时任务 (cron)
语法跟crontab差不多,支持:
minute hour day month weekday
job #执行计划任务的命令,有job参数相当于state=present;
示例如下:
增加每30分钟执行ls /tmp
ansible -i /etc/ansible/hosts web-servers -m cron -a "name='list dir' minute='*/30' job='ls /tmp'"
创建任务计划,每天0点定时同步时间ntpdate
ansible -m cron -a "minute=0 hour=0 day=* month=* weekday=* name='Ntpdate server for sync time' job='/usr/sbin/ntpdate 139.224.227.121'"
备份crontab任务计划,backup=yes表示开启备份,备份文件存放于客户端/tmp/
ansible -m cron -a "minute=0 hour=0 day=* month=* weekday=* name='Ntpdate server for sync time' backup=yes job='/usr/sbin/ntpdate pool.ntp.org'"
删除crontab任务计划
ansible -m cron -a "name='Ntpdate server for sync time' state=absent"
用于目录、文件同步 (synchronize)
synchronize模块主要用于目录、文件同步,基于Rsync命令同步目录,
synchronize模块参数,src源目录、dest目标目录、compress=yes开启压缩、delete=yes数据一致、rsync_opts同步参数、--exclude排除文件.
最简单写法:
ansible -m synchronize -a 'src=/root/ dest=/opt/ '
示例排除txt文件不同步
ansible -m synchronize -a 'src=/root/ dest=/opt/ compress=yes delete=yes rsync_opts=--no-motd,--exclude=.txt'
设置远程主机sysctl配置(sysctl)
name:变量名
value:值
reload:文件被更新时,是否使用 sysctl -p reload 文件
state:是在文件中 移除(absent)或者设置(present)
sysctl_file:如果不是默认文件,指定其他文件
sysctl_set:使用sysctl 命令设置,不一定需要reload 文件
ignoreerrors: 默认值:no 类型:bool,使用此选项将忽略一些不知道的错误 key,即所设置的 name 参数
例:开启路由转发功能
ansible -i /etc/ansible/hosts web -m sysctl -a "name=net.ipv4.ip_forward value=1 reload=yes"
或者
ansible -i /etc/ansible/hosts web -m sysctl -a "name=net.ipv4.ip_forward value=1 sysctl_set=yes"
验证:
cat /proc/sys/net/ipv4/ip_forward 1
管理服务(service)
service模块常用参数:
(1)、name参数:此参数用于指定需要操作的服务名称,比如 nginx,httpd。
(2)、state参数:此参数用于指定服务的状态,比如,我们想要启动远程主机中的httpd,则可以将 state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted(重启)、reloaded。
enabled参数:此参数用于指定是否将服务设置为开机启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。
注:想使用service模块启动服务,被启动的服务,必须可以使用service 命令启动或关闭
例如:安装apache,并启动服务
安装apache
ansible -i /etc/ansible/hosts web -m yum -a "name=httpd state=latest"
重启apache服务。
ansible -i /etc/ansible/hosts web -m service -a "name=httpd state=restarted"
设置开机自启:
ansible -i /etc/ansible/hosts abc -m service -a "name=firewalld enabled=yes"
收集目标主机信息(setup)
setup模块 收集被受控端服务器相关信息
[root@CentOS7 ~]# ansible -i /etc/ansible/hosts abc -m setup
使用filter参数进行信息过滤:
[root@CentOS7 ~]# ansible -i /etc/ansible/hosts abc -m setup -a "filter=ansible_nodename"
更详细的模块使用详情请参考官方文档:
https://docs.ansible.com/ansible_community.html