ansible环境搭建(常用模块使用)(代码片段)

爱敲代码的三毛 爱敲代码的三毛     2022-12-02     640

关键词:

文章目录


ansible

1. ansible是什么

ansible是一种由Python开发的自动化运维工具,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

特点:

  • 默认使用ssh进行管理,基于python里的paramiko模块开发
  • 管理端和被管理端不需要启动服务
  • 部署简单,配置简单,功能强大,扩展性强
  • 能过playbook(剧本)进行多个任务的编排

2. ansible环境搭建

环境准备

主机名ip身份
master192.168.44.10管理机
node1192.168.44.20被管理机
node2192.168.44.30被管理机

1.配置静态ip
2.设置主机名和主机名相互绑定

# vim /etc/hosts
...
192.168.44.10 master
192.168.44.20 node1
192.168.44.30 node2

3.关闭防火墙和SELinux

4.时间同步

# yum install -y ntp
# systemctl restart ntpd
# systemctl enable ntpd

5.配置yum源(需要epel源)

# yum -y install epel-release
# yum clean all
# yum makecache

过程
第1步: 管理机上安装ansible,被管理节点必须打开ssh服务.

[root@master ~]# yum install ansible

[root@master ~]# ansible --version
ansible 2.9.27
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

第2步: 实现master对agent的免密登录,只在master上做。(如果这一步不做,则在后面操作agent时都要加-k参数传密码;或者在主机清单里传密码)

master# ssh-keygen

master# ssh-copy-id -i 192.168.44.20
master# ssh-copy-id -i 192.168.44.30

第3步: 在master上定义主机组,并测试连接

master# vim /etc/ansible/hosts 
[group1]
192.168.44.20
192.16844.30
[root@master ~]# ansible -m ping group1
192.168.44.20 | SUCCESS => 
    "ansible_facts": 
        "discovered_interpreter_python": "/usr/bin/python"
    , 
    "changed": false, 
    "ping": "pong"

192.168.44.30 | SUCCESS => 
    "ansible_facts": 
        "discovered_interpreter_python": "/usr/bin/python"
    , 
    "changed": false, 
    "ping": "pong"

[root@master ~]# ansible -m ping all
192.168.44.30 | SUCCESS => 
    "ansible_facts": 
        "discovered_interpreter_python": "/usr/bin/python"
    , 
    "changed": false, 
    "ping": "pong"

192.168.44.20 | SUCCESS => 
    "ansible_facts": 
        "discovered_interpreter_python": "/usr/bin/python"
    , 
    "changed": false, 
    "ping": "pong"


3. 服务器分组

ansible通过一个主机清单功能来实现服务器分组。

Ansible的默认主机清单配置文件为/etc/ansible/hosts.

[test]					组名
apache[1:10].aaa.com	表示apache1.aaa.com到apache10.aaa.com这10台机器
nginx[a:z].aaa.com		表示nginxa.aaa.com到nginxz.aaa.com共26台机器
10.1.1.[11:15]			表示10.1.1.11到10.1.1.15这5台机器

示例

[test]
10.1.1.13:2222			表示10.1.1.13这台,但ssh端口为2222

4. ansible模块

ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。

查看所有支持的模块

# ansible-doc -l

如果要查看ping模块的用法,使用下面命令(其它模块以此类推)

# ansible-doc ping

官方文档

1)hostname模块

文档
hostname模块用于修改主机名(注意: 它不能修改/etc/hosts文件)
将其中一远程主机名修改为 node1.test.com

[root@master ~]# ansible 192.168.44.20 -m hostname -a 'name=node1.test.com'
基本格式为: ansible 操作的机器名或组名 -m 模块名 -a "参数1=值1 参数2=值2"

可以到被修改的主机上用hostname命令查看

2)file模块*

file模块用于对文件相关的操作(创建, 删除, 软硬链接等)
文档

注意:下面的操作,是管理机器操作,改变的被管理的机器

创建一个目录

[root@master ~]# ansible group1 -m file -a 'path=/test state=directory'

创建一个文件

[root@master ~]# ansible group1 -m file -a 'path=/test/file1 state=touch'

递归修改递归修改owner,group,mode

[root@master ~]# ansible group1 -m file -a 'path=/test recurse=yes owner=bin group=daemon mode=1777'

删除目录(连同目录里的所有文件)

[root@master ~]# ansible group1 -m file -a 'path=/test state=absent'

创建文件并指定owner,group,mode等

[root@master ~]# ansible group1 -m file -a 'path=/tmp/file1 state=touch owner=bin group=daemon mode=1777'

删除文件

[root@master ~]# ansible group1 -m file -a 'path=/tmp/file1 state=absent'

创建软链接文件

[root@master ~]# ansible group1 -m file -a 'src=/etc/fstab path=/tmp/fstab state=link'

创建硬链接文件

[root@master ~]# ansible group1 -m file -a 'src=/etc/fstab path=/tmp/fstab2 state=hard'

3)copy模块*

copy模块用于对文件的远程拷贝操作(如把本地的文件拷贝到远程的机器上)
文档

在master上准备一个文件,拷贝此文件到group1组的所有机器上(把本机的file拷贝到组里的机器上,改名file2)

[root@master ~]# ansible group1 -m copy -a 'src=/tmp/file1 dest=/tmp/file2'

使用content参数直接往远程文件里写内容(会覆盖原内容)

[root@master ~]# ansible group1 -m copy -a 'content="Java\\n" dest=/tmp/file2'
# 注意:ansible中-a后面的参数里也有引号时,记得要单引双引交叉使用,如果都为双引会出现问题

使用force参数控制是否强制覆盖

# 如果被控制主机已经存在 file2文件就不覆盖
[root@master ~]# ansible group1 -m copy -a 'src=/tmp/file1 dest=/tmp/file2 force=no'
如果目标文件已经存在,则会强制覆盖
[root@master ~]# ansible group1 -m copy -a 'src=/tmp/file1 dest=/tmp/file2 force=yes'

使用backup参数控制是否备份文件

backup=yes表示如果拷贝的文件内容与原内容不一样,则会备份一份
group1的机器上会将/tmp/file2备份一份(备份文件命名加上时间),再远程拷贝新的文件为/tmp/file2
[root@master ~]# ansible group1 -m copy -a 'src=/etc/fstab dest=/tmp/file2 backup=yes owner=daemon group=daemon mode=1777'

opy模块拷贝时要注意拷贝目录后面是否带"/"符号

# /etc/yum.repos.d后面不带/符号,则表示把/etc/yum.repos.d整个目录拷贝到/tmp/目录下
[root@master ~] # ansible group1 -m copy -a 'src=/etc/yum.repos.d dest=/tmp/'

# /etc/yum.repos.d/后面带/符号,则表示把/etc/yum.repos.d/目录里的所有文件拷贝到/tmp/目录下
[root@master ~] # ansible group1 -m copy -a 'src=/etc/yum.repos.d/ dest=/tmp/'

3) stat模块stat模块类似linux的stat命令,用于获取文件的状态信息。

获取/etc/fstab文件的状态信息

[root@master ~]# ansible group1 -m stat -a 'path=/etc/fstab'

4) template模块

与copy模块功能几乎一样.

template模块首先使用变量渲染jinja2模板文件成普通文件,然后再复制过去.而copy模块不支持.(jinja2是一个基于python的模板引擎)
文档

[root@master ~]# ansible -m template group1 -a "src=/etc/hosts dest=/tmp/hosts"

注意:template模块不能拷贝目录

5)fetch模块

etch模块与copy模块类似,但作用相反。用于把远程机器的文件拷贝到本地。
文档

第1步: 在两台被管理机上分别创建一个同名文件(但内容不同)

[root@node1 ~]# echo "test Java" > /tmp/test.txt
[root@node2 ~]# echo "test linux" > /tmp/test.txt

第2步: 从master上fecth文件(因为group1里有2台机器,为了避免同名文件文件冲突,它使用了不同的目录)

[root@master ~]# ansible group1 -m fetch -a 'src=/tmp/test.txt dest=/tmp/'
192.168.44.30 | CHANGED => 
    "changed": true, 
    "checksum": "745f03caffbd25bc42cfb2611e782f78c009fa25", 
    "dest": "/tmp/192.168.44.30/tmp/test.txt",  # 192.168.44.30的在这里
    "md5sum": "154bf345581682d39742a7538967263a", 
    "remote_checksum": "745f03caffbd25bc42cfb2611e782f78c009fa25", 
    "remote_md5sum": null

192.168.44.20 | CHANGED => 
    "changed": true, 
    "checksum": "c768d732082d5f05df2ea7d3d09080e8d9e10771", 
    "dest": "/tmp/192.168.44.20/tmp/test.txt",  # 192.168.44.20的在这里
    "md5sum": "9cba24d13afebc8d5b916bf83d968120", 
    "remote_checksum": "c768d732082d5f05df2ea7d3d09080e8d9e10771", 
    "remote_md5sum": null


第3步: 先删除上面fetch过来的, 然后尝试只fetch其中一台机器的,也会使用名称来做子目录区分

[root@master tmp]# rm /tmp/192.168.44.* -rf

[root@master tmp]# ansible 192.168.44.20 -m fetch -a 'src=/tmp/test.txt dest=/tmp/'
192.168.44.20 | CHANGED => 
    "changed": true, 
    "checksum": "c768d732082d5f05df2ea7d3d09080e8d9e10771", 
    "dest": "/tmp/192.168.44.20/tmp/test.txt", 
    "md5sum": "9cba24d13afebc8d5b916bf83d968120", 
    "remote_checksum": "c768d732082d5f05df2ea7d3d09080e8d9e10771", 
    "remote_md5sum": null


注意: fetch模块不能从远程拷贝目录到本地

6) user模块

user模块用于管理用户账号和用户属性
文档

创建test用户,默认为普通用户,创建家目录

[root@master tmp]# ansible group1 -m user -a 'name=test state=present'

创建my_user系统用户,并且登录shell环境为/sbin/nologin

[root@master tmp]# ansible group1 -m user -a 'name=my_user state=present system=yes shell="/sbin/nologin"'

创建linux用户, 使用uid参数指定uid, 使用password参数传密码

# 密码哈希
[root@master tmp]# echo 123456789 | openssl passwd -1 -stdin
$1$IRNUtMXp$XRcAsmWTNNYLh.VAt1e2Q0


[root@master tmp]# ansible group1 -m user -a 'name=linux uid=2022 state=present password="$1$IRNUtMXp$XRcAsmWTNNYLh.VAt1e2Q0"'

创建一个普通用户叫hadoop,并产生空密码密钥对

[root@master tmp]# ansible group1 -m user -a 'name=hadop generate_ssh_key=yes'

删除test用户,但家目录默认没有删除

[root@master tmp]# ansible group1 -m user -a 'name=test state=absent'

删除my_user用户,使用remove=yes参数让其删除用户的同时也删除家目录

[root@master tmp]# ansible group1 -m user -a 'name=my_user state=absent remove=yes'

7) group模块

group模块用于管理用户组和用户组属性。
文档

创建组

[root@master tmp]# ansible group1 -m group -a 'name=groupa gid=3000 state=present'

删除组(如果有用户的gid为此组,则删除不了)

[root@master tmp]# ansible group1 -m group -a 'name=groupa state=absent'

8) cron模块

cron模块用于管理周期性时间任务
文档

创建一个cron任务,不指定user的话,默认就是root(因为我这里是用root操作的)。
如果minute,hour,day,month,week不指定的话,默认都为*

[root@master tmp]# ansible group1 -m cron -a 'name="test cron1" user=root job="touch /tmp/file1" minute=*/2'

删除cron任务

[root@master tmp]# ansible group1 -m cron -a 'name="test cron1" state=absent

9) yum_repository模块

yum_repository模块用于配置yum仓库。
文档
增加一个/etc/yum.repos.d/local.repo配置文件

[root@master tmp]# ansible group1 -m yum_repository -a "name=local description=localyum baseurl=file:///mnt/ enabled=yes gpgcheck=no"
注意:此模块只帮助配置yum仓库,但如果仓库里没有软件包,安装一样会失败。所以可以手动去挂载光驱到/mnt目录
# mount /dev/cdrom /mnt

删除/etc/yum.repos.d/local.repo配置文件

[root@master tmp]# ansible group1 -m yum_repository -a "name=local state=absent"

9) yum模块*

yum模块用于使用yum命令来实现软件包的安装与卸载
文档
使用yum安装一个软件(前提:group1的机器上的yum配置都已经OK)

ansible group1 -m yum -a 'name=vsftpd state=present'

使用yum安装httpd,httpd-devel软件,state=latest表示安装最新版本

[root@master tmp]# ansible group1 -m yum -a 'name=httpd,httpd-devel state=latest'

使用yum卸载httpd,httpd-devel软件

[root@master tmp]# ansible group1 -m yum -a 'name=httpd,httpd-devel state=absent'

10) service模块

service模块用于控制服务的启动,关闭,开机自启动等。
文档
启动vsftpd服务,并设为开机自动启动

[root@master tmp] # ansible group1 -m service -a 'name=vsftpd state=started enabled=on'

关闭vsftpd服务,并设为开机不自动启动

[root@master tmp]  # ansible group1 -m service -a 'name=vsftpd state=stopped enabled=false'

11) script模块

script模块用于在远程机器上执行本地脚本
文档

在master上准备一个脚本
#!/bin/bash
mkdir /tmp/file_dir
touch /tmp/file_dir/file1..10

在group1的远程机器里都执行master上的/tmp/touch.sh脚本(此脚本不用给执行权限)

[root@master tmp]# ansible group1 -m script -a '/tmp/touch.sh'

12)command与shell模块

两个模块都是用于执行linux命令的,这对于命令熟悉的工程师来说,用起来非常high。

shell模块与command模块差不多(command模块不能执行一些类似$HOME,>,<,|等符号,但shell可以)

command文档
shell文档

[root@master tmp]# ansible -m command group1 -a "useradd test_user"
[root@master tmp]# ansible -m command group1 -a "id test_user"

master# ansible -m command group1 -a "cat /etc/passwd |wc -l"		--报错
master# ansible -m shell group1 -a "cat /etc/passwd |wc -l"		--成功

master# ansible -m command group1 -a "cd $HOME;pwd"	  --报错
master# ansible -m shell  group1 -a "cd $HOME;pwd"	  --成功

注意: shell模块并不是百分之百任何命令都可以,比如vim或ll别名就不可以。不建议大家去记忆哪些命令不可以,大家只要养成任何在生产环境里的命令都要先在测试环境里测试一下的习惯就好


ansible------ansible概述,搭建,常用模块介绍(代码片段)

目录一.Ansible概述二.Ansible环境安装部署三.Ansible命令行模块1.command模块2.shell模块3.cron模块4.user模块5.group模块6.copy模块7.file模块8.hostname模块9.ping模块10.yum模块11.service/systemd模块12.script模块13.setup模块一.Ansible概述Ansible是一个基于P... 查看详情

自动化运维—ansible工具的使用(代码片段)

Ansible一、概述1.1特点1.2优点二、服务搭建2.1准备工作2.2ansible端设置三、ansible命令行模块3.1command模块概述命令使用常用参数3.2shell模块概述命令3.3cron模块概述常用参数命令3.4user模块概述常用参数命令3.5group模块概述命令3.6copy模... 查看详情

自动化运维—ansible工具的使用(代码片段)

Ansible一、概述1.1特点1.2优点二、服务搭建2.1准备工作2.2ansible端设置三、ansible命令行模块3.1command模块概述命令使用常用参数3.2shell模块概述命令3.3cron模块概述常用参数命令3.4user模块概述常用参数命令3.5group模块概述命令3.6copy模... 查看详情

ansible概述(代码片段)

文章目录一、Ansible概述(1)Ansible简介(2)Ansible的特点(3)Ansible组成结构(4)Ansible和其他管理软件的对比二、部署Ansible(1)实验环境(2)实验步骤(3)AnsibleInventory文件... 查看详情

ansible------ansible概述,搭建,用法(代码片段)

目录一.Ansible概述二.Ansible环境安装部署三.Ansible命令行模块1.command模块2.shell模块3.cron模块4.user模块5.group模块6.copy模块一.Ansible概述Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。... 查看详情

详解ansible服务常用命令模块(代码片段)

ansible可以使用命令行方式进行自动化管理,基本语法如下:ansible主机名-m模块名称-a模块特有参数ansible的命令行管理工具都是由一系列模块、参数所支持的,可以在命令后面加上-h或--help获取帮助。如使用ansible-doc-h或者ansible-doc... 查看详情

ansible概述及常用命令模块(代码片段)

Ansible概述及常用命令模块一、Ansible概述特点二、部署ansible1.使用yum安装epel源和ansible2.配置主机清单3.配置密钥对验证三、ansible常用命令行模块1.command模块2.shell模块3.cron模块4.user模块5.group模块6.copy模块7.file模块8.hostname模块9.ping... 查看详情

ansible概述及常用命令模块(代码片段)

Ansible概述及常用命令模块一、Ansible概述特点二、部署ansible1.使用yum安装epel源和ansible2.配置主机清单3.配置密钥对验证三、ansible常用命令行模块1.command模块2.shell模块3.cron模块4.user模块5.group模块6.copy模块7.file模块8.hostname模块9.ping... 查看详情

ansible常用模块详解(代码片段)

Ansible可以使用命令行方式进行自动化管理,且ansible的命令行管理工具都是由一系列模块、参数支持的,我们可以通过ansible-doc工具查看模块帮助信息。本篇博文将详细讲述ansible模块功能及操作。Ansible命令参数:-v:输出详细信... 查看详情

ansible常用模块的用法(代码片段)

模块文件ping模块相对简单,没有参数ansible192.168.56.200-mpingcommand模块ansiblewebsrvs-mcommand-a‘chdir=/etc/catcentos-release‘使用command时不支持*管道的使用$也不支持shell模块ansiblewebsrvs-mshell-a"echo123456|passwd--stdinyunlon 查看详情

自动化运维—ansible工具的使用(代码片段)

Ansible一、概述1.1特点1.2优点二、服务搭建2.1准备工作2.2ansible端设置三、ansible命令行模块3.1command模块概述命令使用常用参数3.2shell模块概述命令3.3cron模块概述常用参数命令3.4user模块概述常用参数命令3.5group模块概述命令3.6copy模... 查看详情

ansible中几个常用模块的使用(代码片段)

  这一篇博客写的是近几天学到的几个常用的Ansible模块,这些模块可以满足我们日常的一些运维工作。文中出现的srv代表目标主机清单名称。1.Command模块是在远程主机执行命令,但有一定的限制。Command:在远程主机执行... 查看详情

ansible的安装配置及常用模块介绍(代码片段)

Ansible的安装、配置及常用模块介绍 ansible安装方式1、ansible安装常用两种方式,yum安装和pip程序安装这里提供二种安装方式,任选一种即可:1、使用yum安装yuminstallepel-release-yyuminstallansible–y2、使用pip(python的包管理模块)安... 查看详情

ansible自动化运维之ansible命令运行方式及常用参数和常用模块(代码片段)

Ansible常用模块ansible实现管理的方式演示环境Ad-Hoc执行方式获得帮助ansible命令运行方式及常用参数ansible输出不同颜色含义ansible中的常用模块1.command2.shell3.script4.copy5.fetch6.file7.archive8.unarchive9.hostname10.cron11.yum_repository12.dnf/yum13.s 查看详情

ansiblead-hoc常用命令(代码片段)

AnsibleAd-Hoc常用命令Ansible可以通过命令行形式使用它的模块,Ansible自带了很多模块,可以直接使用这些模块。目前Ansible已经自带了259个模块,可以通过ansible-doc-l显示所有自带的模块,也可以通过ansible-doc-s模块名查看模块的介绍... 查看详情

ansible学习总结——ansible19个常用模块使用示例(代码片段)

一、模块列表1、setup2、ping3、file4、copy5、command6、shell7、script8、cron9、yum10、service11、group12、user13、stat14、mount15、fetch16、synchronize17、get_url18、hostname19、wait_for二、模块示例1、setup(搜集系统信息)搜集主机的 查看详情

ansible常用模块(代码片段)

cron使用ansible的cron模块可以在机器上创建计划任务ansible127.0.0.1-mcron-a"job='cat/home/suraer/Documents/tmp>>a.txt'name='test'"job指任务的具体内容name是指该任务的名称删除时根据任务的名称来删除任务ansible127.0.0.1-mc 查看详情

ansible使用一(ansible的安装及ansible常用模块的使用)(代码片段)

1、ansible概述        Ansible是一款基于Python开发的自动化运维工具,它不需要安装客户端,使用SSH进行通信,同时可支持系统账号认证或秘钥认证,也支持windows客户端。Ansible主要组成部分:  ... 查看详情