ansible笔记(9):常用模块之包管理模块

前文介绍了各种类型的模块,这篇文章来介绍一下linux中的包管理模块。

yum_repository模块

yum_repository模块可以帮助我们管理远程主机上的yum仓库。

此处我们介绍一些yum_repository模块的常用参数,你可以先对这些参数有一个大概了解,然后再看小示例。

name参数 :必须参数,用于指定要操作的唯一的仓库ID,也就是”.repo”配置文件中每个仓库对应的”中括号”内的仓库ID

baseurl参数 :此参数用于设置yum仓库的baseurl

description参数 :此参数用于设置仓库的注释信息,也就是”.repo”配置文件中每个仓库对应的”name字段”对应的内容。

file参数 :此参数用于设置仓库的配置文件名称,即设置”.repo”配置文件的文件名前缀,在不使用此参数的情况下,默认以name参数的仓库ID作为”.repo”配置文件的文件名前缀,同一个’.repo’配置文件中可以存在多个yum源

enabled参数 :此参数用于设置是否激活对应的yum源,此参数默认值为yes,表示启用对应的yum源,设置为no表示不启用对应的yum源。

gpgcheck参数 :此参数用于设置是否开启rpm包验证功能,默认值为no,表示不启用包验证,设置为yes表示开启包验证功能。

gpgcakey参数 :当gpgcheck参数设置为yes时,需要使用此参数指定验证包所需的公钥

state参数 :默认值为present,当值设置为absent时,表示删除对应的yum源

yum_repository模块的ad-hoc示例命令如下:

使用如下命令在test70主机上设置ID为aliEpel 的yum源,仓库配置文件路径为/etc/yum.repos.d/aliEpel.repo

ansible test70 -m yum_repository -a 'name=aliEpel description="alibaba EPEL" baseurl=https://mirrors.aliyun.com/epel/$releaseverServer/$basearch/'

使用如下命令在test70主机上设置ID为aliEpel 的yum源,仓库配置文件路径为/etc/yum.repos.d/alibaba.repo

ansible test70 -m yum_repository -a 'name=aliEpel description="alibaba EPEL" baseurl=https://mirrors.aliyun.com/epel/$releaseverServer/$basearch/ file=alibaba'

使用如下命令在test70主机上设置ID为local 的yum源,但是不启用它(local源使用系统光盘镜像作为本地yum源,以便测试举例,所以baseurl中的值以file:///开头)

ansible test70 -m yum_repository -a 'name=local baseurl=file:///media description="local cd yum" enabled=no'

使用如下命令在test70主机上设置ID为local的yum源,开启包验证功能,并指定验证包所需的公钥位置为/media/RPM-GPG-KEY-CentOS-7

ansible test70 -m yum_repository -a 'name=local baseurl=file:///media description="local cd yum" gpgcheck=yes gpgcakey=file:///media/RPM-GPG-KEY-CentOS-7'

删除/etc/yum.repos.d/alibaba.repo配置文件中的aliEpel源

ansible test70 -m yum_repository -a 'file=alibaba name=aliEpel state=absent'

yum模块

yum模块可以帮助我们在远程主机上通过yum源管理软件包。

此处我们介绍一些yum模块的常用参数,你可以先对这些参数有一个大概了解,然后再看小示例。

name参数 :必须参数,用于指定需要管理的软件包,比如nginx

state参数 :用于指定软件包的状态 ,默认值为present,表示确保软件包已经安装,除了present,其他可用值有installed、latest、absent、removed,其中installed与present等效,latest表示安装yum中最新的版本,absent和removed等效,表示删除对应的软件包。

disable_gpg_check参数 :用于禁用对rpm包的公钥gpg验证,默认值为no,表示不禁用验证,设置为yes表示禁用验证,即不验证包,直接安装,在对应的yum源没有开启gpg验证的情况下,需要将此参数的值设置为yes,否则会报错而无法进行安装。

enablerepo参数 :用于指定安装软件包时临时启用的yum源,假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源。

disablerepo参数 :用于指定安装软件包时临时禁用的yum源,某些场景下需要此参数,比如,当多个yum源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包。

enablerepo参数和disablerepo参数可以同时使用

yum模块的ad-hoc示例命令如下:

确保test70主机上通过yum源安装了nginx(对应yum源未开启gpg验证,所以需要设置disable_gpg_check=yes),如下三条命令的效果相同

ansible test70 -m yum -a 'name=nginx disable_gpg_check=yes'
ansible test70 -m yum -a 'name=nginx state=present disable_gpg_check=yes'
ansible test70 -m yum -a 'name=nginx state=installed disable_gpg_check=yes'

确保test70主机上安装了yum源中最新版本的nginx

ansible test70 -m yum -a 'name=nginx state=latest disable_gpg_check=yes'

确保test70主机上通过yum源安装的nginx被卸载了

ansible test70 -m yum -a 'name=nginx state=absent'
ansible test70 -m yum -a 'name=nginx state=removed'

在test70主机上安装telnet时不确定local源是否启用,使用enablerepo=local确保临时启用local源

ansible test70 -m yum -a 'name=telnet disable_gpg_check=yes enablerepo=local'

在test70主机上安装telnet时,确定多个源中都有telnet,但是不想从local源中安装,所以在安装时临时禁用local源

ansible test70 -m yum -a 'name=telnet disable_gpg_check=yes disablerepo=local'

ansible笔记(8):常用模块之系统类模块(二)

这篇文章会继续介绍一些常用的系统类操作模块,可与前文结合在一起阅读。

user模块

user模块可以帮助我们管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等操作。

此处我们介绍一些user模块的常用参数,你可以先对这些参数有一个大概了解,然后再看小示例。

name参数 :必须参数,用于指定要操作的用户名称,可以使用别名user。

group参数 :此参数用于指定用户所在的基本组

gourps参数 :此参数用于指定用户所在的附加组,注意,如果说用户已经存在并且已经拥有多个附加组,那么如果想要继续添加新的附加组,需要结合append参数使用,否则在默认情况下,当再次使用groups参数设置附加组时,用户原来的附加组会被覆盖。

append参数 :如果用户原本就存在多个附加组,那么当使用groups参数设置附加组时,当前设置会覆盖原来的附加组设置,如果不想覆盖原来的附加组设置,需要结合append参数,将append设置为yes,表示追加附加组到现有的附加组设置,append默认值为no。

shell参数 :此参数用于指定用户的默认shell

uid参数 :此参数用于指定用户的uid号

expires参数 :此参数用于指定用户的过期时间,相当于设置/etc/shadow文件中的的第8列,比如,你想要设置用户的过期日期为2018年12月31日,那么你首先要获取到2018年12月31日的unix时间戳,使用命令”date -d 2018-12-31 +%s”获取到的时间戳为1546185600,所以,当设置expires=1546185600时,表示用户的过期时间为2018年12月31日0点0分,设置成功后,查看远程主机的/etc/shadow文件,对应用户的第八列的值将变成17895(表示1970年1月1日到2018年12月31日的天数,unix时间戳的值会自动转换为天数,我们不用手动的进行换算),目前此参数只支持在Linux和FreeBSD系统中使用。

comment参数 :此参数用于指定用户的注释信息

state参数 :此参数用于指定用户是否存在于远程主机中,可选值有present、absent,默认值为present,表示用户需要存在,当设置为absent时表示删除用户。

remove参数 :当state的值设置为absent时,表示要删除远程主机中的用户,但是在删除用户时,不会删除用户的家目录等信息,这是因为remoove参数的默认值为no,如果设置为yes,在删除用户的同时,会删除用户的家目录,当state=absent并且remove=yes时,相当于执行”userdel –remove”命令

password参数 :此参数用于指定用户的密码,但是这个密码不能是明文的密码,而是一个对明文密码”加密后”的字符串,相当于/etc/shadow文件中的密码字段,是一个对明文密码进行哈希后的字符串,你可以在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密钥还不是特别了解,可以参考如下文章

http://www.zsythink.net/archives/2375

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,但是如果同名的密钥对已经存在,并不会对同名密钥做任何操作

user模块的ad-hoc示例命令如下:

在test70主机上创建名为zsy的用户,如果用户已经存在,则不进行任何操作。

ansible test70 -m user -a 'name=zsy'

在test70主机上删除名为zsy的用户,但是不会删除zsy用户的家目录

ansible test70 -m user -a 'name=zsy state=absent'

在test70主机上删除名为zsy的用户,同时会删除zsy用户的家目录等信息

ansible test70 -m user -a 'name=abc state=absent remove=yes'

指定test70主机上的zsy用户的主组为zsythink,zsythink组需要提前存在,当不使用group设置主组时,默认主组与用户名相同。

ansible test70 -m user -a "name=zsy group=zsythink"

指定test70主机上的zsy用户的附加组为zsythink,zsythink组需要提前存在,当不使用groups设置附属组时,默认附加组与用户名相同,注意,为了保险起见,在不知道用户原来的附加组设定的情况下,最好将append参数设置为yes,我们也可以一次性设置多个附加组,附加组之间用逗号隔开,比如groups=zsy,zsythink,root 示例命令如下

ansible test70 -m user -a "name=zsy groups=zsythink append=yes"

指定test70主机上的zsy用户使用/bin/csh作为默认shell

ansible test70 -m user -a "name=zsy shell=/bin/csh"

指定test70主机上的zsy用户的uid为2002

ansible test70 -m user -a "name=zsy uid=2002"

指定test70主机上的zsy用户的过期时间为2018年12月31日,使用”date -d 2018-12-31 +%s”命令可以获取到对应日期的unix时间戳

ansible test70 -m user -a 'name=zsy expires=1546185600'

指定test70主机上的zsy用户的注释信息

ansible test70 -m user -a 'name=zsy comment="www.zsythink.net"'

将test70主机上的zsy用户的密码设置为666666

首先生成666666的加密字符串

[root@test71 ~]# python;
Python 2.7.5 (default, Aug  4 2017, 00:39:18)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import crypt; crypt.crypt('666666')
'$6$ygRbo7Fj.mMU2KY0$OEqihCCn5UfOsvMyzPNPBgx3bzAtwrOFyFvacgUmA374XOAEtUCrdjbW5Ip.Zqo491o3kD5I.HaC9nLhh6x741'

使用生成的密码字符串设置用户密码

ansible test70 -m user -a ' name=zsy password="$6$ygRbo7Fj.mMU2KY0$OEqihCCn5UfOsvMyzPNPBgx3bzAtwrOFyFvacgUmA374XOAEtUCrdjbW5Ip.Zqo491o3kD5I.HaC9nLhh6x741" '

如下命令表示设置test70主机上的zsy用户的密码,但是如果用户当前的加密字符串与命令中设置的加密字符串不一致,则不进行密码更新的操作。

ansible test70 -m user -a 'name=zsy password="$6$a.ofrhIWn4gJGbi0$i6Xhr.F/YyhMe2UCodydwyF952bP4DOf0qYcGE8aK.EsgOR/GKU0Oy9Ov6oIH3RIJ9BnhvoVR9ozflmUJgxhL0" update_password=on_create'

为test70上的zsy用户生成ssh密钥对,默认在用户家目录的./ssh目录中生成名为id_rsa的私钥和名为id_rsa.pub的公钥,如果已经存在同名密钥,并不会覆盖原来的密钥,即不做任何操作。

ansible test70 -m user -a 'name=zsy generate_ssh_key=yes'

为test70上的zsy用户生成ssh密钥对,密钥对生成在/opt目录下,私钥名为id_rsa_zsy,公钥名为id_rsa_zsy.pub

ansible test70 -m user -a 'name=zsy generate_ssh_key=yes ssh_key_file=/opt/id_rsa_zsy'

为test70上的zsy用户生成ssh密钥对,同时指定公钥中的注释信息为”www.zsythink.net”,此参数只能在创建密钥时使用才会生效,并不能操作同名的老密钥

ansible test70 -m user -a 'name=zsy generate_ssh_key=yes ssh_key_comment="www.zsythink.net"'

为test70上的zsy用户生成ssh密钥对,同时指定私钥的密码为123456,此参数只能在创建密钥时使用才会生效,并不能操作同名的老密钥

ansible test70 -m user -a 'name=zsy generate_ssh_key=yes ssh_key_passphrase="123456"'

为test70上的zsy用户生成ssh密钥对,同时指定密钥对的类型为dsa,当不显式指定密钥类型时,默认类型为rsa,此参数只能在创建密钥时使用才会生效,并不能操作同名的老密钥

ansible test70 -m user -a 'name=zsy generate_ssh_key=yes ssh_key_type=dsa'

group模块

group模块可以帮助我们管理远程主机上的组。

此处我们介绍一些group模块的常用参数,你可以先对这些参数有一个大概了解,然后再看小示例。

name参数 :必须参数,用于指定要操作的组名称。

state参数 :用于指定组的状态,两个值可选,present,absent,默认为present,设置为absent表示删除组。

gid参数 :用于指定组的gid

group模块的ad-hoc示例命令如下:

确保test70主机中存在名为zsythink的组

ansible test70 -m group -a ' name=zsythink'

删除test70主机中存在名为zsythink的组,删除成功的前提是不能有用户把被删除的组当成主组。

ansible test70 -m group -a ' name=zsythink state=absent'

确保test70主机中存在名为zsythink的组,并且确定zsythink组的组id为1008

ansible test70 -m group -a 'name=zsythink gid=1008'

ansible笔记(7):常用模块之系统类模块

前文中,我们介绍了一些常用的文件类模块和命令类模块,这篇文章中我们会介绍一些常用的系统类操作模块。

cron模块

cron模块可以帮助我们管理远程主机中的计划任务,功能相当于crontab命令。

在了解cron模块的参数之前,先写出一些计划任务的示例,示例如下

#示例1

5 1 * * * echo test

#示例2

1 1 */3 * * echo test

#示例3

@reboot echo test

#示例4

@hourly echo test

上述示例1表示每天的1点5分输出test字符

上述示例2表示每3天执行一次计划任务,于当天的1点1分执行,具体任务为输出test字符

上述示例3表示每次系统启动后需要执行一次计划任务,具体任务为输出test字符

上述示例4表示每小时执行一次计划任务,具体任务 为输出test字符

根据上述示例,可以更好的了解cron模块的参数

cron模块通常使用的参数如下,你可以先大概的了解一下这些参数,然后再结合后面的示例去理解:

minute参数 :此参数用于设置计划任务中分钟设定位的值,比如,上述示例1中分钟设定位的值为5,即minute=5,当不使用此参数时,分钟设定位的值默认为”*”

hour参数 :此参数用于设置计划任务中小时设定位的值,比如,上述示例1中小时设定位的值为1,即hour=1,当不使用此参数时,小时设定位的值默认为”*”

day参数 :此参数用于设置计划任务中日设定位的值,当不使用此参数时,日设定位的值默认为”*”

month参数 :此参数用于设置计划任务中月设定位的值,当不使用此参数时,月设定位的值默认为”*”

weekday参数 :此参数用于设置计划任务中周几设定位的值,当不使用此参数时,周几设定位的值默认为”*”

special_time参数 :在上述示例3与示例4中,计划任务的时间设定格式为@reboot或者@hourly,@reboot表示重启时执行,@hourly表示每小时执行一次,相当于设置成”0 0 * * *” ,这种@开头的时间设定格式则需要使用special_time参数进行设置,special_time参数的可用值有reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时)。

注意:当上述时间单位设定参数都未指定时,计划任务的时间设定默认会被设定为”* * * * *”,这样表示每秒都会执行一次计划任务,所以,在使用cron模块时,我们应该确定对应的时间参数设置正确。

user参数 :此参数用于设置当前计划任务属于哪个用户,当不使用此参数时,默认为管理员用户

job参数 :此参数用于指定计划的任务中需要实际执行的命令或者脚本,比如上例中的”echo test”命令。

name参数 :此参数用于设置计划任务的名称,计划任务的名称会在注释中显示,当不指定计划任务的名称时,ansible会默认为计划任务加入注释,注释的内容为#Ansible: None,假设指定计划任务的名称为test,那么注释的内容为#Ansible: test,在一台机器中,计划任务的名称应该具有唯一性,方便我们以后根据名称修改或删除计划任务。

state参数 :当计划任务有名称时,我们可以根据名称修改或删除对应的任务,当删除计划任务时,需要将state的值设置为absent

disabled参数 :当计划任务有名称时,我们可以根据名称使对应的任务”失效”(注释掉对应的任务),注意,使用此参数时,除了需要指定任务的名称,还需要同时指定任务的job以及任务的时间设定,而且任务的时间设定必须和对应任务完全相同,否则在注释任务的同时,任务的时间设定会被修改,除非你确定这样做,如果你不明白这段话的意思,可以参考下文中的示例。

backup参数 :如果此参数的值设置为yes,那么当修改或者删除对应的计划任务时,会先对计划任务进行备份,然后再对计划任务进行修改或者删除,cron模块会在远程主机的/tmp目录下创建备份文件,以crontab开头并且随机加入一些字符,具体的备份文件名称会在返回信息的backup_file字段中看到,推荐将此此参数设置为yes。

cron模块的ad-hoc示例命令如下:

在test70主机上创建计划任务,任务名称为”test crontab”,任务于每天1点5分执行,任务内容为输出test字符

ansible test70 -m cron -a " name='test crontab' minute=5 hour=1 job='echo test' "

执行上述命令后,在test70主机中root用户下会有如下计划任务被创建

#Ansible: test crontab

5 1 * * * echo test

在test70主机上创建计划任务,任务名称为”crontab day test”,任务每3天执行一次,于执行当天的1点1分开始执行,任务内容为输出test字符

ansible test70 -m cron -a " name='crontab day test' minute=1 hour=1 day=*/3 job='echo test' "

执行上述命令后,在test70主机中root用户下会有如下计划任务被创建

#Ansible: crontab day test

1 1 */3 * * echo test

在test70主机上创建计划任务,任务名称为”test special time”,任务将在重启时执行,任务内容为输出test字符

ansible test70 -m cron -a " name='test special time' special_time=reboot job='echo test' "

执行上述命令后,在test70主机中root用户下会有如下计划任务被创建

#Ansible: test special time

@reboot echo test

在test70主机上创建计划任务,任务名称为”test special time”,任务将在重启时执行,任务内容为输出test字符

ansible test70 -m cron -a " name='test special time' special_time=reboot job='echo test' "

执行上述命令后,在test70主机中root用户下会有如下计划任务被创建

#Ansible: test special time

@reboot echo test

由于”test special time”已经存在,所以,当我们再次操作同名的任务时,ansible将会认为是修改原来的任务。

在”test special time”已经存在的情况下,执行如下命令,原计划任务会被修改,因为启用了backup,所以任务在修改前会被备份。

ansible test70 -m cron -a " name='test special time' special_time=hourly job='echo test' backup=yes "

执行上述命令后,从返回信息的backup_file字段中可以看到备份文件的远程主机中的位置,原来的”test special time”任务会变成如下设定

#Ansible: test special time

@hourly echo test

任务”test special time”已经存在于test70主机中,如果我们想要删除这个计划任务,可以执行如下命令,删除任务的同时可以进行备份。

ansible test70 -m cron -a " name='test special time' state=absent backup=yes "

命令执行后,从返回信息的backup_file字段中可以看到备份文件的远程主机中的位置

默认操作root用户的计划任务,如果想要操作远程主机中其他用户的计划任务,可以指定要操作的用户

ansible test70 -m cron -a "user=zsy name='test special time' special_time=hourly job='echo test'"

上述命令执行后,可以在远程主机中使用crontab -lu zsy查看对应的计划任务。

之前已经创建了名称为test crontab的计划任务,如果我们想要暂时注释这个计划任务,可以使用如下命令,但是需要注意,在注释任务时,所有设定需要 跟原设定保持一致,否则计划任务的设置将会发生改变,示例如下

比如,我们想要将crontab day test这个任务注释掉,则需要使用如下命令,注意,最好与backup参数同时使用

ansible test70 -m cron -a " name='crontab day test' minute=1 hour=1 day=*/3 job='echo test'  disabled=yes backup=yes"

执行上述命令后,对应的计划任务将会被注释,如下

#Ansible: crontab day test

#1 1 */3 * * echo test

如果你在使用disabled参数时,设置了错误的时间,那么对应任务被注释的同时,时间设定也会发生改变,比如,如果你执行了如下命令

ansible test70 -m cron -a " name='crontab day test' minute=55 job='echo test'  disabled=yes backup=yes"

那么对应任务被注释的同时,同时还会进行如下设置

#Ansible: crontab day test

#55 * * * * echo test

如果你忘记了任何时间设定,那么在任务被注释时,还会被设置为默认的时间设定,也就是 “* * * * *”

所以,在使用disabled参数时,最后结合backup参数一起使用,万一一时大意,还有回旋的余地。

service模块

service模块可以帮助我们管理远程主机上的服务,比如,启动或停止远程主机中的nginx服务。

注意:假如你想要管理远程主机中的某个服务,那么这个服务必须能被 BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart 中的任意一种所管理,否则service模块也无法管理远程主机的对应服务,这样说可能不容易理解,那么我们换个方式来解释,假设你在使用centos6,那么你的centos6中的nginx则必须能够通过”service nginx start”启动,如果你的nginx无法通过”service nginx start”进行启动,那么它将同样无法通过ansible的service模块启动,假设你在使用centos7,那么你的centos7中的nginx则必须能够通过”systemctl start nginx”启动,如果它无法通过”systemctl start nginx”进行启动,那么它将同样无法通过ansible的service模块进行启动,centos6中默认通过sysv管理服务,centos7中默认通过systemd管理服务,如果你的服务无法通过 BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart 中的任意一种所管理,那么它也无法被ansible的service模块管理。

service模块通常使用的参数如下,你可以先大概的了解一下这些参数,然后再结合后面的示例去理解:

name参数 :此参数用于指定需要操作的服务名称,比如nginx

state参数 :此参数用于指定服务的状态,比如,我们想要启动远程主机中的nginx,则可以将state的值设置为started,如果想要停止远程主机中的服务,则可以将state的值设置为stopped,此参数的可用值有started、stopped、restarted、reloaded。

enabled参数 :此参数用于指定是否将服务设置为开机 启动项,设置为yes表示将对应服务设置为开机启动,设置为no表示不会开机启动。

service模块的ad-hoc示例命令如下:

将test70中的nginx服务处于启动状态

ansible test70 -m service -a "name=nginx state=started"

将test70中的nginx服务处于停止状态

ansible test70 -m service -a "name=nginx state=stopped"

将test70中的nginx服务被设置为开机自动启动项

ansible test70 -m service -a " name='nginx' enabled=yes"

ansible笔记(6):常用模块之命令类模块

前文中,我们介绍了一些常用的文件类操作的模块,这篇文章中我们会介绍一些常用的命令类操作的模块。

command模块

command模块可以帮助我们在远程主机上执行命令

注意:使用command模块在远程主机中执行命令时,不会经过远程主机的shell处理,在使用command模块时,如果需要执行的命令中含有重定向、管道符等操作时,这些符号也会失效,比如”<“, “>”, “|”, “;” 和 “&” 这些符号,如果你需要这些功能,可以参考后面介绍的shell模块,还有一点需要注意,如果远程节点是windows操作系统,则需要使用win_command模块。

此处我们介绍一些command模块的常用参数,你可以先对这些参数有一个大概了解,然后再看小示例。

free_form参数 :必须参数,指定需要远程执行的命令,需要说明一点,free_form参数与其他参数并不相同,在之前的模块示例中,如果想要使用一个参数,那么则需要为这个参数赋值,举个例子,之前的示例模块中,大多都有path参数,当我们需要指定要操作的文件时,通常需要对path参数赋值,比如,path=/testdir/test,表示我们想要操作/testdir/test文件,但是free_form参数则不同,”free_form”并不是一个”实际存在”的参数名,比如,当我们想要在远程主机上执行ls命令时,我们并不需要写成”free_form=ls” ,这样写反而是错误的,因为并没有任何参数的名字是free_form,当我们想要在远程主机中执行ls命令时,直接写成ls即可,这就是free_form参数的含义,因为command模块的作用是执行命令,所以,任何一个可以在远程主机上执行的命令都可以被称为free_form,如果你还是不明白,看下面的小示例就行了。

chdir参数 : 此参数的作用就是指定一个目录,在执行对应的命令之前,会先进入到chdir参数指定的目录中。

creates参数 :看到creates,你可能会从字面上理解这个参数,但是使用这个参数并不会帮助我们创建文件,它的作用是当指定的文件存在时,就不执行对应命令,比如,如果/testdir/test文件存在,就不执行我们指定的命令。

removes参数 :与creates参数的作用正好相反,它的作用是当指定的文件不存在时,就不执行对应命令,比如,如果/testdir/tests文件不存在,就不执行我们指定的命令,此参数并不会帮助我们删除文件

对应上述参数的ad-hoc示例命令如下:

使用如下命令,表示在test70主机上执行ls命令,因为我使用的是root用户,所以默认情况下,ls出的结果是test70主机中root用户家目录中的文件列表。

ansible test70 -m command -a "ls"


chdir参数表示执行命令之前,会先进入到指定的目录中,所以如下命令表示查看test70主机上/testdir目录中的文件列表

ansible test70 -m command -a “chdir=/testdir ls”


如下命令表示/testdir/test文件如果存在于远程主机中,则不执行对应命令,如果不存在,才执行"echo test"命令

ansible test70 -m command -a “creates=/testdir/test echo test”

如下命令表示/testdir/test文件如果不存在于远程主机中,则不执行对应命令,如果存在,才执行”echo test”命令

ansible test70 -m command -a "removes=/testdir/test echo test"

shell模块

shell模块可以帮助我们在远程主机上执行命令,与command模块不同的是,shell模块在远程主机中执行命令时,会经过远程主机上的/bin/sh程序处理。

学习此模块之前,请先参考本文中的command模块。

此处我们介绍一些shell模块的常用参数。

free_form参数 :必须参数,指定需要远程执行的命令,但是并没有具体的一个参数名叫free_form,具体解释参考command模块。

chdir参数 : 此参数的作用就是指定一个目录,在执行对应的命令之前,会先进入到chdir参数指定的目录中。

creates参数 :使用此参数指定一个文件,当指定的文件存在时,就不执行对应命令,可参考command模块中的解释。

removes参数 :使用此参数指定一个文件,当指定的文件不存在时,就不执行对应命令,可参考command模块中的解释。

executable参数 :默认情况下,shell模块会调用远程主机中的/bin/sh去执行对应的命令,通常情况下,远程主机中的默认shell都是bash,如果你想要使用其他类型的shell执行命令,则可以使用此参数指定某种类型的shell去执行对应的命令,指定shell文件时,需要使用绝对路径。

shell模块中chdir、creates、removes参数的作用与command模块中的作用都是相同的,此处不再举例。

使用shell模块可以在远程服务器上执行命令,它支持管道与重定向等符号。

ansible test70 -m shell -a "chdir=/testdir echo test > test"

如果你想要执行的命令需要csh解析,那么可以指定使用csh在远程主机上执行对应的命令,比如在如下示例中,我们使用csh的语法定义了一个数字类型的变量TestNum,然后将TestNum变量的值重定向到了/testdir/TestNumFile,在bash中,@符号不能用于定义变量,所以,可以使用executable指定需要的shell类型。

ansible test70 -m shell -a 'executable=/bin/csh @ TestNum=666 ; echo $TestNum > /testdir/TestNumFile'

script模块

script模块可以帮助我们在远程主机上执行ansible主机上的脚本,也就是说,脚本一直存在于ansible主机本地,不需要手动拷贝到远程主机后再执行。

学习此模块之前,请先参考本文中的command模块。

此处我们介绍一些script模块的常用参数,你可以先对这些参数有一个大概了解,然后再看小示例。

free_form参数 :必须参数,指定需要执行的脚本,脚本位于ansible主机本地,并没有具体的一个参数名叫free_form,具体解释参考command模块。

chdir参数 : 此参数的作用就是指定一个远程主机中的目录,在执行对应的脚本之前,会先进入到chdir参数指定的目录中。

creates参数 :使用此参数指定一个远程主机中的文件,当指定的文件存在时,就不执行对应脚本,可参考command模块中的解释。

removes参数 :使用此参数指定一个远程主机中的文件,当指定的文件不存在时,就不执行对应脚本,可参考command模块中的解释。

上述参数对应的ad-hoc示例命令如下:

如下命令表示ansible主机中的/testdir/atest.sh脚本将在test70主机中执行,执行此脚本之前,会先进入到test70主机中的/opt目录

ansible test70 -m script -a "chdir=/opt /testdir/atest.sh"

如下命令表示,如果test70主机中的/opt/testfile文件已经存在,ansible主机中的/testdir/atest.sh脚本将不会在test70主机中执行,反之则执行。

ansible test70 -m script -a "creates=/opt/testfile /testdir/atest.sh"

如下命令表示,如果test70主机中的/opt/testfile文件不存在,ansible主机中的/testdir/atest.sh脚本将不会在test70主机中执行,反之则执行。

ansible test70 -m script -a "removes=/opt/testfile /testdir/atest.sh"

ansible笔记(5):常用模块之文件操作(二)

前文中已经总结了一些文件操作类的模块,如果你需要了解它们,可以点击直达链接 http://www.zsythink.net/archives/2542

这篇文章我们继续来了解一些文件操作类模块。

find模块

find模块可以帮助我们在远程主机中查找符合条件的文件,就像find命令一样。

此处我们介绍一些find模块的常用参数,你可以先对这些参数有一个大概了解,然后再看小示例。

paths参数 :必须参数,指定在哪个目录中查找文件,可以指定多个路径,路径间用逗号隔开,此参数有别名,使用别名path或者别名name可以代替paths。

recurse参数 : 默认情况下,只会在指定的目录中查找文件,也就是说,如果目录中还包含目录,ansible并不会递归的进入子目录查找对应文件,如果想要递归的查找文件,需要使用recurse参数,当recurse参数设置为yes时,表示在指定目录中递归的查找文件。

hidden参数 :默认情况下,隐藏文件会被忽略,当hidden参数的值设置为yes时,才会查找隐藏文件。

file_type参数 : 默认情况下,ansible只会根据条件查找”文件”,并不会查找”目录”或”软链接”等文件类型,如果想要指定查找的文件类型,可以通过file_type指定文件类型,可指定的文件类型有any、directory、file、link 四种。

patterns参数 : 使用此参数指定需要查找的文件名称,支持使用shell(比如通配符)或者正则表达式去匹配文件名称,默认情况下,使用shell匹配对应的文件名,如果想要使用python的正则去匹配文件名,需要将use_regex参数的值设置为yes。

use_regex参数 :默认情况下,find模块不会使用正则表达式去解析patterns参数中对应的内容,当use_regex设置为yes时,表示使用python正则解析patterns参数中的表达式,否则,使用glob通配符解析patterns参数中的表达式。

contains参数 :使用此参数可以根据文章内容查找文件,此参数的值为一个正则表达式,find模块会根据对应的正则表达式匹配文件内容。

age参数 :使用此参数可以根据时间范围查找文件,默认以文件的mtime为准与指定的时间进行对比,比如,如果想要查找mtime在3天之前的文件,那么可以设置age=3d,如果想要查找mtime在3天以内的文件,可以设置age=-3d,这里所说的3天是按照当前时间往前推3天,可以使用的单位有秒(s)、分(m)、时(h)、天(d)、星期(w)。

age_stamp参数 :文件的时间属性中有三个时间种类,atime、ctime、mtime,当我们根据时间范围查找文件时,可以指定以哪个时间种类为准,当根据时间查找文件时,默认以mtime为准。

size参数 :使用此参数可以根据文件大小查找文件,比如,如果想要查找大于3M的文件,那么可以设置size=3m,如果想要查找小于50k的文件,可以设置size=-50k,可以使用的单位有t、g、m、k、b。

get_checksum参数 :当有符合查找条件的文件被找到时,会同时返回对应文件的sha1校验码,如果要查找的文件比较大,那么生成校验码的时间会比较长。

对应上述参数的ad-hoc示例命令如下:

在test70主机的/testdir目录中查找文件内容中包含abc字符串的文件,隐藏文件会被忽略,不会进行递归查找。

ansible test70 -m find -a 'paths=/testdir contains=".*abc.*" '

在test70主机的/testdir目录以及其子目录中查找文件内容中包含abc字符串的文件,隐藏文件会被忽略。

ansible test70 -m find -a 'paths=/testdir contains=".*abc.*" recurse=yes '

在test70主机的/testdir目录中查找以.sh结尾的文件,包括隐藏文件,但是不包括目录或其他文件类型,不会进行递归查找。

ansible test70 -m find -a 'paths=/testdir patterns="*.sh" hidden=yes'

在test70主机的/testdir目录中查找以.sh结尾的文件,包括隐藏文件,包括所有文件类型,比如文件、目录、或者软链接,但是不会进行递归查找。

ansible test70 -m find -a 'paths=/testdir patterns="*.sh" file_type=any hidden=yes'

在test70主机的/testdir目录中查找以.sh结尾的文件,包括隐藏文件,包括所有文件类型,比如文件、目录、或者软链接,但是不会进行递归查找。

ansible test70 -m find -a 'paths=/testdir patterns="*.sh" file_type=any hidden=yes'

在test70主机的/testdir目录中查找以.sh结尾的文件,只不过patterns对应的表达式为正则表达式,查找范围包括隐藏文件,包括所有文件类型,但是不会进行递归查找,不会对/testdir目录的子目录进行查找。

ansible test70 -m find -a 'paths=/testdir patterns=".*.sh" use_regex=yes file_type=any hidden=yes'

在test70主机的/testdir目录中以及其子目录中查找mtime在4天以内的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型。

ansible test70 -m find -a "path=/testdir age=-4d recurse=yes"

在test70主机的/testdir目录中以及其子目录中查找atime在2星期以内的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型。

ansible test70 -m find -a "path=/testdir age=-2w age_stamp=atime recurse=yes"

在test70主机的/testdir目录中以及其子目录中查找大于2G的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型。

ansible test70 -m find -a "paths=/testdir size=2g recurse=yes"

在test70主机的/testdir目录中以及其子目录中查找以.sh结尾的文件,并且返回符合条件文件的sha1校验码,包括隐藏文件

ansible test70 -m find -a "paths=/testdir patterns=*.sh get_checksum=yes  hidden=yes recurse=yes"

replace模块

replace模块可以根据我们指定的正则表达式替换文件中的字符串,文件中所有被正则匹配到的字符串都会被替换。

此处我们介绍一些replace模块的常用参数,你可以先对这些参数有一个大概了解,然后再看小示例。

path参数 :必须参数,指定要操作的文件,2.3版本之前,只能使用dest, destfile, name指定要操作的文件,2.4版本中,仍然可以使用这些参数名,这些参数名作为path参数的别名使用。

regexp参数 : 必须参数,指定一个python正则表达式,文件中与正则匹配的字符串将会被替换。

replace参数 : 指定最终要替换成的字符串。

backup参数 :是否在修改文件之前对文件进行备份,最好设置为yes。

对应上述参数的ad-hoc示例命令如下:

把test70主机中的/testdir/test文件中的所有ASM替换成asm

ansible test70 -m replace -a 'path=/testdir/test regexp="ASM" replace=asm'

把test70主机中的/testdir/test文件中的所有ASM替换成asm,但是在操作文件之前进行备份。

ansible test70 -m replace -a 'path=/testdir/test regexp="ASM" replace=asm backup=yes'

ansible安装k8s步骤及注意事项(在线安装)

以下步骤都经本人实测,可以完美运行。

官方参考网址:https://github.com/gjmzj/kubeasz/

Ansible了解

ansible是个什么东西呢?官方的title是“Ansibleis Simple IT Automation”——简单的自动化IT工具。这个工具的目标有这么几项:

自动化部署APP;

自动化管理配置项;

自动化的持续交互;

自动化的(AWS)云服务管理;

所有的这几个目标从本质上来说都是在一个台或者几台服务器上,执行一系列的命令而已。通俗的说就是批量的在远程服务器上执行命令。当然,最主要的是它是基于 paramiko 开发的。这个paramiko是什么呢?它是一个纯Python实现的ssh协议库。因此fabric和ansible还有一个共同点就是不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。

未分类

由上面的图可以看到 Ansible 的组成由 5 个部分组成:

  • Ansible : 核心

  • Modules : 包括 Ansible 自带的核心模块及自定义模块

  • Plugins : 完成模块功能的补充,包括连接插件、邮件插件等

  • Playbooks : 剧本;定义 Ansible 多任务配置文件,由Ansible 自动执行

  • Inventory : 定义 Ansible 管理主机的清单

具体的命令可以查看参考(中文权威指南):http://www.ansible.com.cn/docs/intro_installation.html

安装k8s

1. 安装依赖工具

# 文档中脚本默认均以root用户执行# 安装 epel 源并更新
yum install epel-release –y(最好每台机器装一下)
yum install net-tools
yum update# 删除不要的默认安装
yum erase firewalld firewalld-filesystem python-firewall -y# 安装python
yum install python -y

2. 安装ansible

# CentOS 7
yum install git python-pip -y# pip安装ansible(国内如果安装太慢可以直接用pip阿里云加速)#pip install pip --upgrade#pip install ansible
pip install pip --upgrade -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
pip install --no-cache-dir ansible -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

3. 在deploy节点配置免密码登陆

ssh-keygen -t rsa -b 2048 回车 回车 回车
ssh-copy-id $IPs #$IPs为所有节点地址包括自身,按照提示输入yes 和root密码
(即使是本机也需要配置)

4. 在deploy节点编排k8s安装

# 下载项目文件
git clone https://github.com/gjmzj/kubeasz.git
mv kubeasz /etc/ansible# 下载已打包好的binaries,并且解压缩到/etc/ansible/bin目录# 国内请从我分享的百度云链接下载 https://pan.baidu.com/s/1c4RFaA # 如果你有合适网络环境也可以按照/down/download.sh自行从官网下载各种tar包到 ./down目录,并执行download.sh
tar zxvf k8s.191.tar.gz
mv bin/* /etc/ansible/bin
cd /etc/ansible
cp example/hosts.m-masters.example hosts# 根据上文实际规划修改此hosts文件
vi hosts

验证ansible安装

在deploy 节点使用如下命令

ansible all -m ping

如果配置正确可以看到类似输出:

192.168.1.42 | SUCCESS => {
    "changed": false, 
    "failed": false, 
    "ping": "pong"
}
192.168.1.43 | SUCCESS => {
    "changed": false, 
    "failed": false, 
    "ping": "pong"
}
192.168.1.44 | SUCCESS => {
    "changed": false, 
    "failed": false, 
    "ping": "pong"
}

5. 安装集群

注意:

1)如何重复安装时,注意在执行完卸载命令后,将/etc/kubernetes目录删除

2)安装02.etcd时往往不能够一次性成功安装,如何执行过程中有错误应执行第二遍02.etcd.yml(不管使用90.setup.yml或是02.etcd.yml安装)

#ansible-playbook 01.prepare.yml
#ansible-playbook 02.etcd.yml
#ansible-playbook 03.kubectl.yml
#ansible-playbook 04.docker.yml
#ansible-playbook 05.kube-master.yml
#ansible-playbook 06.kube-node.yml
#ansible-playbook 07.calico.yml 或者 ansible-playbook 07.flannel.yml 只能选择一种网络插件
#ansible-playbook 90.setup.yml # 一步安装
#ansible-playbook 99.clean.yml # 一步安装

source /etc/profile(环境变量设置未生效,kubectl工具不能使用)

自动安装时没有环境变量,需要source一下;

单主单节点

发现问题:ansible1.8在重新安装并没有完全删除掉/etc/kubernetes中的东西,1.9没啥问题,所以1.8需要将/etc/kubernetes中的东西全部删掉再运行;否则在安装06node时csr验证会报错。

还有装02.etcd时配置文件读不到的问题,运行两次就好了;

ansible 1.9没有问题

安装DNS/dashboard时,注意dashboard-controller.yaml中deployment的版本为extensions/v1beta1

规律,可以先执行90.setup,然后执行2.etcd

卸载的时候注意删除掉/etc/kubernetes目录

注意:api-server是以https(用户名密码启动的),所以最后需要为用户配置角色才可以通过url进行访问:

绑定api-server的权限(否则是注册不上的)

kubectlcreate clusterrolebinding kubelet-node-clusterbinding1 --clusterrole=cluster-admin--user=admin

使用 Ansible 自动部署项目

未分类

如今部署代码真的是一件天大的事。

开发人员努力敲代码,基本没有时间登录服务器并逐个运行部署脚本。但是开发人员知道他们的部署所需要花费的大概时间,对部署各个工作的轻重缓急十分了解。

因此,开发人员与运维人员一起参与部署工作将真正有助于产品发布成功。

未分类

下面我们谈谈用Git的方式更轻松的部署应用。

使用 Git 来自动部署

如果让开发人员使用自己的 Git 仓库工具做部署,这必须在Git配置文件中添加额外的远程Git 仓库地址。

就像这样:

[remote "origin"]
    url = [email protected]:company/project.git
    url = git@remote-server:project.git
    fetch = +refs/heads/*:refs/remotes/origin/*

或者这样

[remote "deploy"]
    url = git@remote-server:project.git      

开发人员只需要在同一时间在推送代码到不同的地方就可以了。如代码示例,一个放在Codebase,另一个用于生产环境部署。

下面是具体操作

我们只需要配置我们的git服务器,使得每当 git push 事件触发时,Git 服务器就远程或本地自动运行部署脚本。

所以,我们需要先配置git 服务器。

首先在 git 服务器上安装 git-core

sudo apt-get install git-core

然后我们需要创建一个用于Git操作用户

sudo useradd git
passwd git

然后添加开发人员的主机的公钥文件,以便开发人员的电脑能够有权限访问 Git 服务器。

cat〜/ .ssh / id_rsa.pub | ssh git @ remote-server“mkdir -p〜/ .ssh && cat >>〜/ .ssh / authorized_keys”

然后在Git服务器上创建一个空的仓库

mkdir -p /home/user/project.git
cd /home/swapnil/project-1.git
git init --bare

这将创建一个git仓库,您可以看到名为 hooks文件夹,这里会存脚本用于接收文件后自动部署项目。

开发人员只需要在最开始的时候将 Git 服务器的项目仓库地址添加到他的项目中即可。

git remote add deploy git @ remote-server:project.git
git push deploy master

这样就直接部署了开发人员的代码。不过这似乎浪费了开发人员不必要的时间,所以我们应该使用 Ansible 来让部署更加轻松。

未分类

首先运行下列命令

ansible-galaxy install PrabhuVignesh.push_to_deploy

然后将开发机器的公钥保存在中即可。

$ cat publickeys.txt

ssh-rsa AAuyFUVFY65tYTFV567YTYTytytYTYTfyuV56FUYTVYTFYTVyTFYUG877686V767R76R67R76R6YTYTfyuVFUYTVYTFYTVyTFYUG877686V767R76R67R76R676V767676V76V768V876V76576V768V876V76Vv76V876VB76v7V76V76V6VBT9LLlNGtLo5pnEXIOPiz9X42ZdxBD721bG5XqDfPnz0JfgAYl6Zw4CXM0F6q0jiAQNJrtrfSNS92x1KMLY8CcVLKOZbpWdUHnouLdKCeM6dBHStpX7yjlb90fRKVZFch87eO0dyAoGWS3oBEYttFYL7s5dm/QV [email protected]

ssh-rsa AAuyFUVFY65tYTFV567YTYTytytYTYTfyuV56FUYTVYTFYTVyTFYUG877686V767R76R67R76R6YTYTfyuVFUYTVYTFYTVyTFYUG877686V767R76R67R76R676V767676V76V768rrtrt54t46Vv76V876VB76v7V76V76V6VBT9LLlNGtLo5pnEXIOPiz9X42ZdxBD721bG5XqDfPnz0JfgAYl6Zb6sevtrrtyyw4CXM0F6q0jiAQNJrtrfSNS92x1KMLY8CcVLKOZbpWdUHnouLdKCeM6dBHStpX7yjlb90fRKVZFch87eO0dyAoGWS3oBEYttFYL7s5dm/QV [email protected]

ssh-rsa AAuyFUVFY65tYTFV567YTYTytytYTYTfyuV56FUYTVYTFYTVyTFYUG877686V767R76R67R76R6YTYTfyuVFUYTVYTFYTVyTFYUG877686V767R76R67R76R63435343r4r3453434r34r34f34356trfhgjhgkjmnhi87t665rg6dvrdxdcser536c5456yvu675678br56er56v5v7y5y5gbr5576un8n78i8it0F6q0jiAQNJrtrfSNS92x1KMLY8CcVLKOZbpWdUHnouLdKCeM6dBHStpX7yjlb90fRKVZFch87eO0dyAoGWS3oBEYttFYL7s5dm/QV [email protected]

接着在环境变量中添加 path_for_authorized_keys,git_repository_path,post_receive_script,pre_receive_script 中的路径。

---
  roles:
    - role: PrabhuVignesh.push_to_deploy
      path_for_authorized_keys: /path/to/public_key/file
      git_repository_path: /home/path/to/your/repo.git
      post_receive_script: "script to deploy the code"
      pre_receive_script: "Prepare storing code"

git服务器的所有配置将通过 Ansible 来完成。

当开发人员将代码推送到 git 服务器时,应用程序就会执行用于后接收和预接收运行的脚本,如“puppet deploy script”,“cap deploy …”等,并且将自动部署。

另外使用这样的方式,只有在推送Master分支的时候才会运行部署脚本,这就避免不必要的部署。

#!/bin/bash
do
    if [[ $ref =~ .*/master$ ]];
    then
        echo "I am master branch push and i will run deployment script"
        # Run deployment script.....
    else
        echo "Ref $ref successfully received.  Doing nothing: only the master branch may be deployed on this server."
    fi
done

结论

GIT真的是一个令人赞叹的IT自动化工具,特别让开发和运维更好的协作,让发布新版本更加轻松。

Ansible 批量创建用户 密码注意事项

user模块是请求的是useradd, userdel, usermod三个指令,goup模块请求的是groupadd, groupdel, groupmod 三个指令。

user模块

home:指定用户的家目录,需要与createhome配合使用

groups:指定用户的属组

uid:指定用的uid

password:指定用户的密码

name:指定用户名

createhome:是否创建家目录 yes|no

system:是否为系统用户

remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r

state:是创建还是删除(present,absent) 

shell:指定用户的shell环境

generate_ssh_key:是否为相关用户生成SSH密钥。 这不会覆盖现有的SSH密钥。 

ssh_key_bits:可选择指定要创建的SSH密钥中的位数。

ssh_key_passphrase:设置SSH密钥的密码。 如果没有提供密码,SSH密钥将默认没有密码。 

ssh_key_file:指定SSH密钥文件名(可选)。 如果这是一个相对的文件名,那么它将是相对于用户的主目录。 

ssh_key_type:指定要生成的SSH密钥的类型(可选)。 可用的SSH密钥类型将取决于目标主机上的实现。

使用ansibile创建用户有两种方法

方法1:使用user 模块,更简单,命令如下:

[root@ansible ~]# ansible ansible_group -m user -a 'name=test password=-18SyrVeFt/xU uid=1000 shell=/bin/bash home=/home/admin_group/test group=admin_group state=present' --sudo

验证创建的用户:

[root@ansible ~]# ansible ansible_group -m raw -a 'tail /etc/passwd|grep test'

online-web-asset-3 | SUCCESS | rc=0 >>
test:x:1000:501::/home/admin_group/test:/bin/bash
Shared connection to 192.168.5.1 closed.

注意:passwd的值不能是明文,passwd关键字后面应该是密文,且密文将被保存在/etc/shadow文件中,密文的生成命令为:

[root@ansible ~]# openssl passwd -salt -1 "you passwd"

然后将生成的密文,如: 填写到ansible ansible_group -m user -a ‘name=username password= ’ 中的passwd关键字后面即可。

方法2:使用playbook

创建playbook文件 useradd.yml,内容如下:

[root@ansible ansible]# more useradd.yml 

---
- hosts: "{{hosts}}"
  gather_facts: false
  user: centos
  sudo: yes
  vars:
#    user: test123
  tasks:
    - name: add user
      user: name={{user}} password={{passwd}} home=/home/admin_group/{{user}} group=admin_group shell=/bin/bash
      state: present
  tags:
    - user

保存后执行如下命令检测:

[root@ansible ~]# ansible-playbook --syntax-check useradd.yml -e "hosts=qsh_test user=test1 passwd=-11Fe1z.bZ5o."

然后运行playbook,使用 -e选项传入参数

[root@ansible ~]# ansible-playbook useradd.yml -e "hosts=qsh_test user=test1 passwd=-11Fe1z.bZ5o."

如何使用 Ansible 创建和删除 AWS ec2 密钥?

未分类

我想使用 Ansible 工具创建 Amazon EC2 密钥对。不想使用 AWS CLI 来创建。可以使用 Ansible 来创建 AWS ec2 密钥吗?

你需要使用 Ansible 的 ec2_key 模块。这个模块依赖于 python-boto 2.5 版本或者更高版本。 boto 是亚马逊 Web 服务的一个 Python API。你可以将 boto 用于 Amazon S3、Amazon EC2 等其他服务。简而言之,你需要安装 Ansible 和 boto 模块。我们一起来看下如何安装 boto 并结合 Ansible 使用。

第一步 – 在 Ubuntu 上安装最新版本的 Ansible

你必须给你的系统配置 PPA 来安装最新版的 Ansible。为了管理你从各种 PPA(Personal Package Archives)安装软件的仓库,你可以上传 Ubuntu 源码包并编译,然后通过 Launchpad 以 apt 仓库的形式发布。键入如下命令 apt-get 命令或者 apt 命令:

    $ sudo apt update 
    $ sudo apt upgrade 
    $ sudo apt install software-properties-common

接下来给你的系统的软件源中添加 ppa:ansible/ansible。

    $ sudo apt-add-repository ppa:ansible/ansible

更新你的仓库并安装 Ansible:

    $ sudo apt update 
    $ sudo apt install ansible

安装 boto:

$ pip3 install boto3

关于在CentOS/RHEL 7.x上安装 Ansible 的注意事项

你需要在 CentOS 和 RHEL 7.x 上配置 EPEL 源和 yum命令

    $ cd /tmp 
    $ wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 
    $ ls *.rpm 
    $ sudo yum install epel-release-latest-7.noarch.rpm 
    $ sudo yum install ansible

安装 boto:

$ pip install boto3

第二步 2 – 配置 boto

你需要配置 AWS credentials/API 密钥。参考 “AWS Security Credentials” 文档如何创建 API key。用 mkdir 命令创建一个名为 ~/.aws 的目录,然后配置 API key:

    $ mkdir -pv ~/.aws/ 
    $ vi ~/.aws/credentials
    [default]
    aws_access_key_id = YOUR-ACCESS-KEY-HERE
    aws_secret_access_key = YOUR-SECRET-ACCESS-KEY-HERE

还需要配置默认 AWS 区域:

    $ vi ~/.aws/config

输出样例如下:

    [default]
    region = us-west-1

通过创建一个简单的名为 test-boto.py 的 Python 程序来测试你的 boto 配置是否正确:

    #!/usr/bin/python3
    # A simple program to test boto and print s3 bucket names
    import boto3
    t = boto3.resource('s3')
    for b in t.buckets.all():
     print(b.name)

按下面方式来运行该程序:

    $ python3 test-boto.py

输出样例:

    nixcraft-images
    nixcraft-backups-cbz
    nixcraft-backups-forum

上面输出可以确定 Python-boto 可以使用 AWS API 正常工作。

第三步 3 – 使用 Ansible 创建 AWS ec2 密钥

创建一个名为 ec2.key.yml 的剧本,如下所示:

    ---
    - hosts: local
      connection: local
      gather_facts: no
      tasks:

     - name: Create a new EC2 key
       ec2_key:
       name: nixcraft-key
       region: us-west-1
       register: ec2_key_result

     - name: Save private key
       copy: content="{{ ec2_key_result.key.private_key }}" dest="./aws.nixcraft.pem" mode=0600
       when: ec2_key_result.changed

其中,

  • ec2_key: – ec2 密钥对。
  • name: nixcraft_key – 密钥对的名称。
  • region: us-west-1 – 使用的 AWS 区域。
  • register: ec2_key_result – 保存生成的密钥到 ec2keyresult 变量。
  • copy: content=”{{ ec2_key_result.key.private_key }}” dest=”./aws.nixcraft.pem” mode=0600 – 将 ec2_key_result.key.private_key 的内容保存到当前目录的一个名为 aws.nixcraft.pem 的文件中。设置该文件的权限为 0600 (unix 文件权限)。
  • when: ec2_key_result.changed – 仅仅在 ec2_key_result 改变时才保存。我们不想覆盖你的密钥文件。

你还必须创建如下 hosts 文件:

    [local]
    localhost

如下运行你的剧本:

    $ ansible-playbook -i hosts ec2.key.yml

最后你应该有一个名为 `aws.nixcraft.pem 私钥,该私钥可以和 AWS EC2 一起使用。使用 cat 命令查看你的密钥:

    $ cat aws.nixcraft.pem

如果你有 EC2 虚拟机,请按如下方式使用:

    $ ssh -i aws.nixcraft.pem user@ec2-vm-dns-name

未分类

查看有关 python 数据结构变量名的信息,比如
ec2keyresult.changed 和 ec2keyresult.key.private_key
你一定在想我是如何使用变量名的,比如 ec2_key_result.changed 和 ec2_key_result.key.private_key。它们在哪里定义过吗?变量的值是通过 API 调用返回的。简单地使用 -v 选项运行 ansible-playbook 命令来查看这样的信息:

    $ ansible-playbook -v -i hosts ec2.key.yml

未分类

我该如何删除一个密钥?

使用如下 ec2-key-delete.yml:

    ---
    - hosts: local
      connection: local
      gather_facts: no
      tasks:

     - name: Delete a EC2 key
       ec2_key:
       name: nixcraft-key
       region: us-west-1
    # absent means delete keypair
       state: absent

按照如下方式运行:

    $ ansible-playbook -i hosts ec2-key-delete.yml

CentOS 7 里使用自动化运维工具Ansible

PS:开源的自动化运维部署工具,在以前的项目中应用过Puppet,研发部门也开发过一套自动化部署系统(主要基于java在web界面调用shell脚本部署),使用过程中都有各种不满意。最近尝试一个新一点的Ansible,发现非常好用。配置简单,功能强大。

一、简介与优点

1、ansible是为类Unix系统开发的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、SaltStack、chef等)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

2、Puppet、SaltStack、Chef这三个都采用C/S模式,每台被控机器都需要安装客户端,对于数量在数百台以上的机器上部署仍然有些麻烦。相比之下,Ansible无需安装服务端和客户端,只要SSH 验证即可。典型的“去中心化”思想。

3、使用简单,快速上手。以前在用Puppet之前,花了时间研究。本来使用Puppet就是想把自己从重复的事情中解放出来,结果为了简化一件事,而深入另一件复杂的事。

4、配置文件易读。Ansible 的主机定义文件使用 INI 格式,支持分组,能够指定模式;此外也能动态生成,这对管理云主机很有用。Playbook是YAML格式,比Puppet的DSL要易读易写很多。

二、安装与基本使用

1、安装:
Ansible默认不在yum的默认库中,需要启用epel库。(建议用阿里云的库,下载速度最快。)

# cd /etc/yum.repos.d/
# wget http://mirrors.aliyun.com/repo/epel-7.repo
# yum install ansible -y

2、设置用于节点鉴权的SSH密钥:
在Ansible服务端生成密钥,并且复制密钥到各个被控节点中。

# ssh-keygen
# ssh-copy-id -i [email protected]

3、为Ansible定义节点清单
节点维护清单在配置文件/etc/ansible/hosts 里面。

[16-servers]
10.36.16.12
10.36.16.15
10.36.16.16
10.36.16.17
10.36.16.18
10.36.16.19
10.36.16.20
10.36.16.21
10.36.16.22

4、基本使用:
检查16-servers节点组的连通性:

ansible 16-servers -m ping

检查16-servers节点组的内核版本:

ansible 16-servers -m shell -a "uname -a"

检查16-servers节点组的磁盘使用情况并把结果输出到本地指定文件:

ansible 16-servers -m shell -a "df -Th" > /root/df.txt

5、常用模块用法:
shell和command的区别:shell模块支持管道符和变量等特殊字符,而command不支持。

command模块(执行远程命令)

ansible 16-servers -m command -a "uname -a"

shell模块(执行远程主机的shell/python脚本)

ansible 16-servers -m shell -a "/root/xxx.py"

script模块(在远程主机执行主控端的shell/python脚本)

ansible 16-servers -m script -a "/root/xxx.py"

raw模块(类似于command模块、支持管道传递)

ansible 16-servers -m raw -a "netstat -na|grep ESTABLISHED|wc -l"

先说这些了,更详细用法请参考官方文档:

http://docs.ansible.com/