第 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

版权声明:
作者:WaterBear
链接:https://l-t.top/1939.html
来源:雷霆运维
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录