侧边栏壁纸
  • 累计撰写 30 篇文章
  • 累计创建 3 个标签
  • 累计收到 4 条评论
标签搜索

目 录CONTENT

文章目录

Ansible模块讲解

小裴
2024-05-27 / 0 评论 / 0 点赞 / 237 阅读 / 8,234 字

Ansible

Ansible 是一种自动化工具,用于配置管理、应用程序部署、任务自动化等。它基于 YAML 格式的简单语法,无需编写复杂的脚本或程序即可完成各种自动化任务。下面是一些关于 Ansible 的简要介绍:

什么是 Ansible?

自动化工具: Ansible 是一种自动化工具,可用于自动执行各种系统管理任务,如配置管理、软件部署、应用程序管理等。

基于 SSH: Ansible 使用 SSH 协议来与远程主机通信,并在远程主机上执行任务。

基于 YAML: Ansible 使用 YAML 格式来定义任务和剧本,这使得编写和理解 Ansible 配置变得非常简单。

无代理: Ansible 无需在远程主机上安装代理,只需在控制节点上安装 Ansible 即可进行远程管理。

用途

Ansible 可以用于各种自动化任务,包括但不限于:

系统配置管理: 自动化配置管理,例如设置主机名、安装软件包、配置文件等。

应用程序部署: 自动化应用程序部署,例如将代码部署到多台服务器上并启动服务。

持续集成/持续部署(CI/CD): 在持续集成和持续部署流程中使用 Ansible 自动化构建、测试和部署应用程序。

云基础设施管理: 使用 Ansible 来管理云基础设施,例如在云服务提供商上创建虚拟机、配置网络和存储等。

生活中的例子

假设您是一家公司的系统管理员,您的任务是管理公司的 IT 基础设施。以下是一些生活中可能用到 Ansible 的例子:

系统配置管理: 使用 Ansible 自动化配置公司所有服务器的软件包安装、用户账户管理和系统配置。

应用程序部署: 当公司开发团队开发新的网站或服务时,您可以使用 Ansible 自动化部署应用程序到测试和生产环境中。

故障排除和修复: 当某个服务器出现故障时,您可以使用 Ansible 进行快速修复,例如重启服务、修复配置文件等。

企业案例

一些企业案例示例:

Netflix: Netflix 使用 Ansible 来自动化其基础设施的配置管理和应用程序部署,以便实现快速、可靠的服务交付。

Atlassian: Atlassian 使用 Ansible 来自动化其软件产品的测试和部署流程,以便更快地交付软件更新和修复。

NASA: NASA 使用 Ansible 来管理其计算机集群和云基础设施,以支持其科学研究和任务。

ansible常用模块

1. ping 模块

功能: 用于测试Ansible能否与目标主机正常通信。
示例:
yaml
复制代码

- name: 检查所有主机是否可到达
  hosts: all
  tasks:
    - name: ping测试
      ping:

2. command 模块

功能: 在目标主机上执行任意的命令。
示例:
yaml
复制代码

- name: 执行命令
  hosts: web_servers
  tasks:
    - name: 获取主机名
      command: hostname
      register: hostname_output

    - debug:
        msg: "主机名是 {{ hostname_output.stdout }}"

3. copy 模块

功能: 将文件从控制节点复制到目标主机。
示例:
yaml
复制代码

- name: 复制文件到目标主机
  hosts: all
  tasks:
    - name: 复制配置文件
      copy:
        src: /path/to/local/file.conf
        dest: /path/to/remote/file.conf

4. template 模块

功能: 根据Jinja2模板在控制节点上渲染文件,并将结果复制到目标主机。
示例:
yaml
复制代码

- name: 渲染并复制配置文件
  hosts: all
  tasks:
    - name: 渲染模板并复制文件
      template:
        src: /path/to/template.j2
        dest: /path/to/remote/file.conf

5. apt 模块

功能: 在Debian/Ubuntu系统上管理软件包。
示例:
yaml
复制代码

- name: 安装nginx
  hosts: web_servers
  tasks:
    - name: 安装nginx
      apt:
        name: nginx
        state: present

6. yum 模块

功能: 在CentOS/RHEL系统上管理软件包。
示例:
yaml
复制代码

- name: 安装nginx
  hosts: web_servers
  tasks:
    - name: 安装nginx
      yum:
        name: nginx
        state: present

7. service 模块

功能: 管理系统服务的状态(启动、停止、重新启动等)。
示例:
yaml
复制代码

- name: 启动nginx服务
  hosts: web_servers
  tasks:
    - name: 启动nginx
      service:
        name: nginx
        state: started

8. user 模块

功能: 管理系统用户和用户属性。
示例:
yaml
复制代码

- name: 创建用户
  hosts: all
  tasks:
    - name: 创建用户
      user:
        name: john
        state: present
        shell: /bin/bash

9. file 模块

功能: 管理文件和目录的属性。
示例:
yaml
复制代码

- name: 创建目录
  hosts: all
  tasks:
    - name: 创建目录
      file:
        path: /path/to/directory
        state: directory

10. lineinfile 模块

功能: 在文件中添加、修改或删除一行。
示例:
yaml
复制代码

- name: 添加一行到文件
  hosts: all
  tasks:
    - name: 添加一行到配置文件
      lineinfile:
        path: /path/to/config/file
        line: 'new_line_to_add'
        insertafter: EOF

11. wait_for 模块

功能: 等待条件满足后继续执行任务。
示例:
yaml
复制代码

- name: 等待端口开启
  hosts: web_servers
  tasks:
    - name: 等待端口开启
      wait_for:
        port: 80

12. debug 模块

功能: 打印调试信息。
示例:
yaml
复制代码

- name: 打印调试信息
  hosts: all
  tasks:
    - name: 调试输出
      debug:
        msg: "这是一个调试消息"

13. git 模块

功能: 克隆Git存储库或在目标主机上进行Git操作。
示例:
yaml
复制代码

- name: 克隆Git存储库
  hosts: all
  tasks:
    - name: 克隆代码仓库
      git:
        repo: https://github.com/example/repo.git
        dest: /path/to/local/directory

14. cron 模块

功能: 管理cron作业。
示例:
yaml
复制代码

- name: 添加cron作业
  hosts: all
  tasks:
    - name: 添加cron作业
      cron:
        name: "daily_backup"
        minute: "0"
        hour: "2"
        job: "/path/to/backup_script.sh"

15. shell 模块

功能: 在目标主机上执行shell命令。
示例:
yaml
复制代码

- name: 在目标主机上执行shell命令
  hosts: all
  tasks:
    - name: 运行shell命令
      shell: |
        echo "Hello, World!"
        ls -l

16. block 和 include 模块

功能: 创建包含多个任务的块,并在不同的主机、角色或条件下重用这些块。
示例:
yaml
复制代码

- name: 包含块
  hosts: all
  tasks:
    - name: 执行多个任务
      block:
        - name: 任务1
          debug:
            msg: "这是任务1"
        - name: 任务2
          debug:
            msg: "这是任务2"

17. assert 模块

功能: 断言某些条件是否为真,如果条件不满足,则任务失败。
示例:
yaml
复制代码

- name: 断言文件存在
  hosts: all
  tasks:
    - name: 检查文件是否存在
      assert:
        that:
          - "ansible_facts['file_exists'] == true"

18. uri 模块

功能: 向指定的URI发送HTTP或HTTPS请求。
示例:
yaml
复制代码

- name: 发送HTTP GET请求
  hosts: localhost
  tasks:
    - name: 发送GET请求
      uri:
        url: https://api.example.com/data
        method: GET

absible-Playbook

Playbook基本语法

随着你面临的机器越多,配置的需求越复杂,你可能需要了解后面介绍的一些稍微复杂逻辑的语句。

执行Playbook语法

$ ansible-playbook deploy.yml

查看输出的细节

ansible-playbook playbook.yml  --verbose

查看该脚本影响哪些hosts

ansible-playbook playbook.yml --list-hosts

并行执行脚本

ansible-playbook playbook.yml -f 10

完整的playbook脚本示例
最基本的playbook脚本分为三个部分:
在什么机器上以什么身份执行
hosts
users

执行的任务是都有什么
tasks
善后的任务都有什么
handlers
deploy.yml文件

---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

执行的任务(Tasks)

tasks是从上到下顺序执行,如果中间发生错误,那么整个playbook会中止。你可以改修文件后,再重新执行。
每一个task的对module的一次调用。使用不同的参数和变量而已。
每一个task最好有name属性,这个是供人读的,没有实际的操作。然后会在命令行里面输出,提示用户执行情况。
语法
task的基本写法:

tasks:
  - name: make sure apache is running
    service: name=httpd state=running

其中name是可选的,也可以简写成下面的例子。

tasks:
  - service: name=httpd state=running

写name的task在playbook执行时,会显示对应的名字,信息更友好、丰富。写name是个好习惯!

TASK: [make sure apache is running] *************************************************************
changed: [yourhost]
没有写name的task在playbook执行时,直接显示对应的task语法。在调用同样的module多次后,不同意分辨执行到哪步了。

TASK: [service name=httpd state=running] **************************************
changed: [yourhost]
参数的不同写法
最上的代码展示了最基本的传入module的参数的方法 key=value

tasks:
  - name: make sure apache is running
    service: name=httpd state=running

当需要传入参数列表太长时,可以分隔到多行:

 tasks:
  - name: Copy ansible inventory file to client
    copy: src=/etc/ansible/hosts dest=/etc/ansible/hosts
            owner=root group=root mode=0644

或者用yml的字典传入参数

 tasks:
  - name: Copy ansible inventory file to client
    copy:
      src: /etc/ansible/hosts
      dest: /etc/ansible/hosts
      owner: root
      group: root
      mode: 0644

TASK的执行状态
task中每个action会调用一个module,在module中会去检查当前系统状态是否需要重新执行。

如果本次执行了,那么action会得到返回值changed;
如果不需要执行,那么action得到返回值ok
module的执行状态的具体判断规则由各个module自己决定和实现的。例如,”copy” module的判断方法是比较文件的checksum,代码如下:

https://github.com/ansible/ansible-modules-core/blob/devel/files/copy.py

状态示例
以一个copy文件的task为例子:

  tasks:
  - name: Copy the /etc/hosts
    copy: src=/etc/hosts dest=/etc/hosts

第一次执行,它的结果是这个样子的:

TASK的状态是changed

第二次执行是下面这个样子的:

TASK的状态是ok,由于第一次执行copy_hosts.yml的时候,已经拷贝过文件,那么ansible目标文件的状态避免重复执行.

下面我更改vm-rhel7-1的/etc/hosts, 再次执行看看:

Ansible-Playbook实操案例

案例细节
基础配置
1、关闭selinux、firewalld
2、删除系统自带yum
3、复制mysql-python包,安装mysql-python包
4、解压zabbix,zabbix-web包
5、挂载centos镜像包
6、配置centos zabbix zabbix-web的yum仓库
zabbix配置
1、安装zabbix所需服务工具
- zabbix-server-mysql
- zabbix-agent
- zabbix-java-gateway
- zabbix-get
- curl
- curl-devel
2、安装zabbix前端服务
- zabbix-web-mysql-scl
- zabbix-apache-conf-scl
3、安装mariadb数据库
4、配置数据库密码
5、创建数据库zabbix设置字符类型为utf8
6、创建数据库用户zabbix赋权
7、使用zabbix数据库工具 导入mariadb信息
8、配置zabbix配置文件DBPassword,DBHost
9、配置php时区php_value[date.timezone]为Asia/Shanghai
10、开启服务zabbix-server、zabbix-agent、httpd、rh-php72-php-fpm
ansible-playbook --syntax-check
检测playbook语法错误
ansible-playbook -C
测试yaml

ad hoc 命令方式

Ansible Ad-hoc是一种在Ansible中执行一次性任务的命令方式,无需创建和运行完整的Ansible剧本(playbook)。通过Ad-hoc命令,用户可以快速地对远程主机执行一些简单的管理任务,例如安装软件包、管理服务、执行shell命令等。
周五班

copy模块

功能:实现ansible主机向目标主机复制文件。
常用参数:
src #ansible主机分发文件的路径
dest #要将源文件复制到远程机器的绝对路径,必选项。
owner #文件复制过去后的所有者
group #文件复制过去后的所属组
mode #文件的权限设定
backup #默认为no,当文件内容不一致时会直接覆盖文件,开启为yes时会先备份文件,然后再拷贝。
force #默认是yes,当文件不一致时强制覆盖
content #指定文本内容直接在受控主机中生成文件
操作:
复制/root/ansible/shell_1.sh到远程主机/root下。

ansible   node -m copy -a "src=/root/shell_1.sh dest=/root/"

拷贝文件,设置权限:

ansible   node -m copy -a "src=/root/shell_1.sh dest=/root/ mode=600"

在传输数据文件信息时对远程主机源文件进行备份:

[root@ansible ~]# echo 'ls' > /root/shell_1.sh 
[root@ansible ~]# ansible node -m copy -a "src=/root/shell_1.sh dest=/root  backup=yes"

在传输文件时修改文件的属主和属组信息:

[root@master ~]# ansible client -m copy -a "src=/root/ansible/shell_1.sh dest=/root  owner=nobody group=nobody"

创建一个文件并直接编辑文件的信息:

[root@master ~]# ansible client -m copy -a " content='# This file was moved to /root/other.conf' dest=/root/other.conf"

file 模块

周三
file 模块可以帮助我们完成一些对文件的基本操作。比如,创建文件或目录、删除文件或目录、修改文件权限等。
常用参数:
mode #定义文件/目录的权限
group #定义文件/目录的属组
owner #定义文件/目录的属主
path #必选项,定义文件/目录的路径
recurse #递归设置文件的属性,只对目录有效
src #被链接的源文件路径,只应用于state=link的情况
dest #被链接到的路径,只应用于state=link的情况
force #需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链接,然后创建新的软链接,有两个选项:yes|no
state #状态
 =directory:如果目录不存在,就创建目录
 =file:即使文件不存在,也不会被创建
 =link:创建软链接
 =hard:创建硬链接
 =touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
 =absent:删除目录、文件或者取消链接文件
操作:
创建一个目录,如果目录存在,则不做任何操作。

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

创建一个文件,如果文件存在,则更新文件时间,与touch命令相同

[root@master ~]# ansible client1 -m file -a 'path=/root/shell_1.sh state=touch'

创建软链接文件信息

[root@master ~]# ansible client1 -m file -a 'src=/root/shell_1.sh dest=/root/work/shell-1.sh state=link'

创建硬链接文件信息

[root@master ~]# ansible client1 -m file -a 'src=/root/shell_1.sh dest=/root/work/shell-2.sh state=hard'

删除远程文件或者是目录

[root@master ~]# ansible client1 -m file -a 'path=/root/work/shell-2.sh state=absent'

创建文件时,指定权限或者修改权限和属主

[root@master ~]# ansible client1 -m file -a 'path=/root/text1 state=touch owner=nobody mode=666'

fetch 模块

从远程主机把文件复制到ansible主机,但不支持目录
常用参数:
src #远程系统上要获取的文件。
dest #保存文件的目录,例如:dest目录是/backup,主机host.example上名为/etc/profile的src文件将保存到/backup/host.example/etc/profile。
flat     #允许您覆盖将主机名/path/to/文件追加到目标的默认行为。如果dest以’/'结尾,它将使用源文件的基名,类似于copy模块。如果使用单个主机,或者检索每个主机唯一命名的文件,这可能很有用。如果使用多个具有相同文件名的主机,则每个主机的文件将被覆盖。
实例:
将/root/text1拉取到ansible管理端本地的/root目录下:

[root@master ~]# ansible client1 -m fetch -a 'src=/root/text1 dest=/root '

使用flat

[root@master ~]# ansible client1 -m fetch -a 'src=/root/text1 dest=/root/text1 flat=yes'

lineinfile模块

lineinfile 模块:类似linux工具中的sed工具,确保某一行文本存在于指定的文件中,或者确保从文件中删除指定的文本(即确保指定的文本不存在于文件中),还可以根据正则表达式,替换修改某一行文本。
常用参数:
path #必须参数,指定要操作的文件。2.3版本之前,只能使用 dest, destfile, name指定要操作的文件,2.4版本中,仍然可以使用这些参数名,这些参数名作为 path 参数的别名使用。
line #使用此参数指定文本内容。
regexp #使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
state #当想要删除对应的文本时,需要将state参数的值设置为absent,absent为缺席之意,表示删除,state的默认值为present。
insertafter #借助insertafter参数可以将文本插入到“指定的行”之后,参数的值可以设置为EOF或者正则表达式,EOF为End Of File之意,表示插入到文档的末尾,默认情况下insertafter的值为EOF,如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行之后,如果没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
insertbefore #借助insertbefore参数可以将文本插入到“指定的行”之前,insertbefore参数的值可以设置为BOF或者正则表达式,BOF为Begin Of File之意,表示插入到文档的开头,如果将insertbefore的值设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
backup #是否在修改文件之前对文件进行备份。
create #当要操作的文件并不存在时,是否创建对应的文件,两个值false和true,默认为false
实例:
向text1文件末尾添加文本

[root@client1 ~]# cat text1 
hello ansible
test test
lineinfile
Shared connection to client1 close
[root@master ~]# ansible client1 -m lineinfile -a "path=/root/text1 line='test1 test1' "

再次执行,命令执行成功,结果并不会改变

[root@master ~]# ansible client1 -m lineinfile -a "path=/root/text1 line='test1 test1' "

正则表达式-删除稳重以line开头的文件

[root@master ~]# ansible client1 -m lineinfile -a "path=/root/text1 regexp='^line' state=absent"

替换test开头的行为test222,只能替换最后一行

[root@master ~]# ansible client1 -m lineinfile -a "path=/root/text1 regexp="^test" line='test222'"

replace模块

replace模块:可以根据我们指定的正则表达式替换文件中的字符串,文件中所有被匹配到的字符串都会被替换。
常用参数
path #必须参数,指定要操作的文件,2.3版本之前,只能使用 dest, destfile, name指定要操作的文件,2.4版本中,仍然可以使用这些参数名,这些参数名作为 path 参数的别名使用。
regexp #必须参数,指定正则表达式,文件中与正则匹配的字符串将会被替换。
replace #指定最终要替换成的字符串。
backup #是否在修改文件之前对文件进行备份。
Remote 设置true为表示归档文件已经在远程系统上,而不是 Ansible 控制器的本地。选择:false ← (default)true
实例:

[root@client1 ~]# cat text1 
hello ansible
test test
Shared connection to client1 close
test222
[root@master ~]# ansible client1 -m replace -a "path=/root/text1 regexp="^test" replace='test333'"

替换前备份

[root@master ~]# ansible client1 -m replace -a "path=/root/text1 regexp="^test" replace='text' backup=yes"

get_url模块

该模块主要用于从http、ftp、https服务器上下载文件(类似于wget)
常用参数:
dest #下载到哪里(绝对路径),如果目标是一个目录,就用服务器上面文件的名称,如果目标设置了名称就用目标设置的名称。
url #文件的下载地址(网址)—必须
url_username #用于http基本认证的用户名
url_password #用于http基本认证的密码
validate_certs #如果否,SSL证书将不会验证。这只应在使用自签名证书的个人控制站点上使用
owner #指定属主
group #指定属组
mode #指定权限
timeout #下载超时时间,默认10s
checksum #对下载的资源进行校验,支持sha256、md5等方式,以确保其完整性
实例:
下载文件

[root@master ~]# ansible client2 -m get_url -a "url=https://mirrors.aliyun.com/openssh/ dest=/root"

archive模块

archive是压缩命令的模块
常用参数
path :需要压缩的文件或目录
dest :压缩后的文件位置
format:bz2, gz, tar, xz, zip :指定打包的类型
owner #指定属主
group #指定属组
mode #指定权限
实例:

ansible 10.1.1.60 -m archive -a 'path=/var/log dest=/tmp/system_log.tar.gz'

unarchive解压
tar -czvf exam.tar.gz example

ansible 10.1.1.60 -m unarchive -a "dest=/tmp/boysec src=test.tar.gz"    # 解压远程的包到受控端
ansible 10.1.1.60 -m unarchive -a 'src=/package/test.tar.gz dest=/tmp/ copy=no' # 解压受控端本地的包到本地目录

安装模块

yum_repository
yum_repository模块管理远程主机上的yum仓库

ame	:相当于.repo文件定义中括号的[仓库ID]
baseurl	:相当于.repo文件中baseurl
description	:相当于.repo文件中的name
file	:相当于.repo文件的名称,不使用时默认以name加.repo命令
enabled=yes|no	:相当于.repo文件中enabled
gpgcheck=yes|no	:相当于.repo文件中gpgcheck
gpgkey	:前提是gpgcheck=yes,相当于.repo文件中gpgkey,验证gpg公钥
state=present|absent	:默认present,absent表示删除

实例:
创建阿里云epel源

ansible all -m yum_repository -a 'name=epel baseurl=https://mirrors.aliyun.com/epel/7/x86_64/ enabled=yes gpgcheck=no gpgcakey=https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-7 state=present file=AlicloudEpel'

删除阿里云epel源

ansible all -m yum_repository -a 'file=AlicloudEpel name=epel state=absent'

使用yum软件包管理器安装,升级,降级,删除和列出软件包和组。

name  --- 指定安装软件名称
state --- 指定是否安装软件
	installed   --- 安装软件
	present
	latest
	absent      --- 卸载软件
    removed
    latest      --- 安装最新的软件

安装软件:

ansible 10.1.1.20 -m yum -a "name=iotop state=installed"

用户模块

group
远程批量创建用户组信息

gid	 :指定创建的组ID信息name	: 指定创建组名称信息
state
   absent : 删除指定的用户组
   present : 创建指定的用户组

创建用户组:

ansible 10.1.1.12 -m group -a "name=boysec gid=1111"

删除用户组:

ansible 10.1.1.12 -m group -a "name=boysec gid=1111 state=absent"

user
远程批量创建用户信息

name        指定用户名信息
uid        指定用户uid信息
group      指定用户主要属于哪个组
groups      指定用户属于哪个附加组信息
shell      指定是否能够登录
create_home 是否创建家目录信息
home 指定家目录创建在什么路径默认/home
password    * 设置密码时不能使用明文方式,只能使用密文方式
可以给用户设置密码还可以给用户修改密码

实例:

# 普通用法
ansible 10.1.1.60 -m user -a "name=boysec01"
# 指定用户uid信息
ansible 10.1.1.60 -m user -a "name=boysec02 uid=1111"

# 指定用户组信息
ansible 10.1.1.60 -m user -a "name=boysec03 group=boysec02"
ansible 10.1.1.60 -m user -a "name=boysec04 groups=boysec02"

# 创建虚拟用户
ansible 10.1.1.60 -m user -a "name=boysec create_home=no shell=/sbin/nologin"

# 给指定用户创建密码
# 方法一PS: 利用ansible程序user模块设置用户密码信息,需要将密码明文信息转换为密文信息进行设置
	生成密文密码信息方法:[root@zabbix ]# ansible 10.1.1.60 -m debug -a "msg={{ '123456' | password_hash('sha512', 'boysec01') }}"      10.1.1.60 | SUCCESS => {
    "msg": "$6$boysec01$OE3fthAQpwCRsNwaSZbFN0/CW/aJSAOVtDqK1KoyZ.IdfcfcdNSWTStWydm/pCxH3UlF0NsRngNOSsP1LvvQi."}
# 方法二
yum install -y python-pip
pip install passlib
python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"Password:   $6$rJJeiIerQ8p2eR82$uE2701X7vY44voF4j4tIQuUawmTNHEZhs26nKOL0z39LWyvIvZrHPM52Ivu9FgExlTFgz1VTOCSG7KhxJ9Tqk.

ansible 10.1.1.60 -m user -a "name=boysec password='$6$rJJeiIerQ8p2eR82$uE2701X7vY44voF4j4tIQuUawmTNHEZhs26nKOL0z39LWyvIvZrHPM52Ivu9FgExlTFgz1VTOCSG7KhxJ9Tqk'"

# 删除用户
ansible 10.1.1.60 -m user -a "name=boysec02 state=absent"

service模块
用于管理服务运行状态

name:   --- 指定管理的服务名称state:  --- 指定服务状态
       started   启动
	   restarted 重启
	   stopped   停止
enabled --- 指定服务是否开机自启动

启动服务

ansible 10.1.1.60 -m service -a "name=nfs state=started enabled=yes" 

cron模块
cron模块主要用于添加、删除、更新操作系统的crontab任务计划
cron模块使用详解:

name:任务计划名称
cron_file:替换客户端该用户的任务计划的文件
minute:分(0-59, * ,*/2)
hour:时(0-23, * ,*/2)
day:日(1-31, * ,*/2)
month:月(1-12, * , */2)
weekday:周(0-6或1-7, *)
job:任何计划执行的命令,state要等于present
backup:是否备份之前的任务计划
user:新建任务计划的用户
state:指定任务计划present、absent

实例:

ansible all -m cron -a "minute=0 hour=0 day=* month=* weekday=* name='sync time' backup=yes job='/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1'"
也可以简写
ansible all -m cron -a "minute=0  name='time1' job='/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1'" #其他默认为*

# 删除
 ansible all -m cron -a "minute=0 hour=0 day=* month=* weekday=* name='sync time' state=absent"
 
# 注释定时任务
ansible all -m cron -a "minute=0  name='time1' job='/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1'  disabled=yes"

mount模块
用于批量管理主机进行挂载卸载操作
mount模块参数:

src:  需要挂载的存储设备或文件信息path: 指定目标挂载点目录fstype: 指定挂载时的文件系统类型
state
  present/mounted     --- 进行挂载
  present: 不会实现立即挂载,修改fstab文件,实现开机自动挂载
  mounted: 会实现立即挂载, 并且会修改fstab文件,实现开机自动挂载 *****
  absent/unmounted    --- 进行卸载
  absent:     会实现立即卸载, 并且会删除fstab文件信息,禁止开机自动挂载
  unmounted:  会实现立即卸载, 但是不会会删除fstab文件信息  *****

实例:

# 实现远程批量挂载操作
ansible 10.1.1.20 -m mount -a "src=10.1.1.60:/data path=/mnt/test fstype=nfs state=present"
## 以上信息只是在/etc/fstab文件中添加了配置信息,不会真正进行挂载
ansible 10.1.1.20 -m mount -a "src=10.1.1.60:/data path=/mnt/test fstype=nfs state=mounted"
## 以上信息是在/etc/fstab文件中添加了配置信息,并且也会真正进行挂载
 
 
# 卸载
ansible 10.1.1.20 -m mount -a "src=10.1.1.60:/data path=/mnt/test fstype=nfs state=absent"
ansible 10.1.1.20 -m mount -a "src=10.1.1.60:/data path=/mnt/test fstype=nfs state=unmounted"

获取主机信息及调试

setup
可以用来查看远程主机的一些基本信息:

ansible 10.1.1.20 -m setup

只将主机某个信息打印出来

ansible rsync -m setup -a "filter=ansible_all_ipv4_addresses"

常用主机信息:

ansible_all_ipv4_addresses:				    仅显示ipv4的信息。
ansible_devices:							仅显示磁盘设备信息。
ansible_distribution:						显示是什么系统,例:centos,suse等。
ansible_distribution_major_version:		    显示是系统主版本。
ansible_distribution_version:				仅显示系统版本。
ansible_machine:							显示系统类型,例:32位,还是64位。
ansible_eth0:								仅显示eth0的信息。
ansible_hostname:							仅显示主机名。
ansible_kernel:							    仅显示内核版本。
ansible_lvm:								显示lvm相关信息。
ansible_memtotal_mb:						显示系统总内存。
ansible_memfree_mb:						    显示可用系统内存。
ansible_memory_mb:							详细显示内存情况。
ansible_swaptotal_mb:						显示总的swap内存。
ansible_swapfree_mb:						显示swap内存的可用内存。
ansible_mounts:							    显示系统磁盘挂载情况。
ansible_processor:							显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_vcpus:					显示cpu个数(只显示总的个数)。

debug
使用 Ansible 最痛苦的就是远程命令没有生效,但又看不到报错信息,Debug 就是为了解决这个烦恼。

msg:调试输出的消息var:将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出
verbosity:debug的级别(默认是0级,全部显示)

区别:

shell:

[root@ansible ~]# ansible node -m command -a 'echo 000000 | passwd --stdin admin4' 
node1 | CHANGED | rc=0 >>
000000 | passwd --stdin admin4
node2 | CHANGED | rc=0 >>
000000 | passwd --stdin admin4
[root@ansible ~]# ansible node -m shell -a 'echo 000000 | passwd --stdin admin4' 
node1 | CHANGED | rc=0 >>
Changing password for user admin4.
passwd: all authentication tokens updated successfully.
node2 | CHANGED | rc=0 >>
Changing password for user admin4.
passwd: all authentication tokens updated successfully.

command

[root@ansible ~]# ansible node -m command -a 'useradd admin1'
node1 | CHANGED | rc=0 >>
node2 | CHANGED | rc=0 >>
[root@ansible ~]# ansible node -m command -a 'echo 000000 | passwd --stdin admin1' 
node1 | CHANGED | rc=0 >>
000000 | passwd --stdin admin1
node2 | CHANGED | rc=0 >>
000000 | passwd --stdin admin1

标准输入 --stdin
可以看到返回了命令
并更改,系统以为这一串命令是字符串,而不是特殊符号,
command只认识符号,不认识特殊字符

script

远程执行脚本

vi test.sh
#!/bin/bash
ifconfig
df -hT
[root@ansible ~]# ansible node -m script  -a 'test.sh' 

shell VS command

command 模块命令将不会使用 shell 执行. 因此,像 $HOME 这样的变量是不可用的。还有像<,>,,&都将不可用。
shell 模块通过shel程序执行,默认是/in/s,,,,;,&可用。但这样有潜在的 shel 注入风险
因为他不受用户环境的影响。 也很大的避免command 模块更安全,了潜在的 shel 注入风险

模块选择

两个模块都要避免使用,你应该优先考虑更具体的 ansible 模块。比如用 command 或者 shell 执行 yum 命令前,应该先了解到直接的 yum模块。使用具体模块比执行命令要优雅很多,因为这些模块设计都是具有幂等性的,并满足其他标准,如异常处理等.
I(Ansible包含众多的模块,大部分模块都能够保证操作的幂等性,即相关操作的多次执行能够达到相同结果这一特性)
如果没有更具体的模块, 相对来说 command 更安全点。
如果您需要用户环境和流式操作,则只能使用 shell 模块

Ansible-AD hoc实操案例

案例细节
1、关闭selinux、firewalld
3、删除系统自带yum
4、挂载镜像包
5、配置yum
6、安装httpd
7、更换http网页文件
8、更改服务端口号为666
9、启动httpd
10、执行,测试网页

网页文件
[root@ansible ~]# vi index.html 
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>济南职业技术学院云计算ansible</title>
</head>
<body>
    <h1>济南职业技术学院云计算ansible</h1>
</body>
</html>
0

评论区