zoukankan      html  css  js  c++  java
  • ansible基础

    Ansible基础

    一、Ansible 介绍及安装

    1.介绍

        Ansible 是⼀个 IT ⾃动化⼯具。它能配置系统、部署软件、编
    排更复杂的 IT 任务,如连续部署或零停机时间滚动更新。
    Ansible ⽤ Python 编写,尽管市⾯上已经有很多可供选择的
    配置管理解决⽅案(例如 Salt、Puppet、Chef等),但它们各有优
    劣,⽽Ansible的特点在于它的简洁。让 Ansible 在主流的配置管理
    系统中与众不同的⼀点便是,它并不需要你在想要配置的每个节点上安
    装⾃⼰的组件。同时提供的另⼀个优点,如果需要的话,你可以在不⽌
    ⼀个地⽅控制你的整个基础架构。

    2.⼯作原理

    • 1、在ANSIBLE 管理体系中,存在"管理节点" 和 "被管理节点" 两 种⻆⾊。

    • 2、被管理节点通常被称为"资产"

    • 3、在管理节点上,Ansible将 AdHoc 或 PlayBook 转换为Python 脚本。 并通过SSH将这些Python 脚本传递到被管理服务器上。 在被管理服务器上依次执⾏,并实时的将结果返回给管理节点。

    3.如何安装

    管理节点------------ssh-copy-id--------------被管理节点

    OpenSSH
    Python>=2.6
    Ansible
    
    OpenSSH
    Python>=2.4(sampiesjson)
    
    # pip install ansible
    # yum -y install ansible
    

    3.1先决条件

    管理节点

    确保存在OpenSSH 确保Python 版本 >= 2.6 确保安装ansible

    被管理节点

    确保存在OpenSSH 确保Python 版本 >= 2.4 //若为2.4 版本, 确保安装了python-samplesjson 扩展 不需要安装ansible

    3.2安装ansible

    • yum方式

    [root@qfedu.com ~]# yum install epel-release
    [root@qfedu.com ~]# yum install ansible
    

      

    • pip方式

    [root@qfedu.com ~]# yum install epel-release
    [root@qfedu.com ~]# yum install python2-pip
    [root@qfedu.com ~]# pip install ansible
    

      

    • 查看版本

    [root@qfedu.com ~]# ansible --version
    ansible 2.9.6
     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, Aug 7
    2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat
    4.8.5-39)]
    

      

    二、管理节点与被管理节点建立SSH信任关系

    管理节点(ansible)中创建密钥对

    [root@qfedu.com ~]# ssh-keygen -t rsa
    

      

    将本地的公钥传输到被管理节点

    每个被管理节点都需要传递 过程中需要被管理节点(这⾥是 172.18.0.3)的⽤户名(这⾥是 root)及密码

    [root@qfedu.com ~]# ssh-copy-id root@172.18.0.3

    三、 快速⼊⻔

    1.场景假设

    管理节点:
    172.18.0.2 主机名 qfedu.com
    ​
    被管理节点(资产):
    172.18.0.3
    172.17.0.4
    ​
    且管理节点 和 被管理节点之间的节点已经打通 SSH 信任关系。
    

    2.场景⼀

    • 在管理节点上,测试与所有被管理节点的⽹络连通性。

    # ansible all -i 172.18.0.3,172.18.0.4 -m ping
    172.18.0.4 | SUCCESS => {
     "ansible_facts": {
     "discovered_interpreter_python":
    "/usr/bin/python"
     },
     "changed": false,
     "ping": "pong"
    }
    172.18.0.3 | SUCCESS => {
     "ansible_facts": {
     "discovered_interpreter_python":
    "/usr/bin/python"
     },
     "changed": false,
     "ping": "pong"
    }
    • 注意 -i 参数后⾯接的是⼀个列表(List)。因此当为⼀个被管理 节点时,我们后⾯⼀定要加⼀个英⽂逗号(,),告知是List

    • # ansible all -i 172.18.0.3, -m ping

    3. 场景⼆

    • 在管理节点上,确保⽂件 /tmp/a.conf 发布到所有被管理节 点

    # touch /tmp/a.conf
    # ansible all -i 172.18.0.3,172.18.0.4 -m copy -a
    "src=/tmp/a.conf dest=/tmp/a.conf"
    • all 在 ansible 中, 将其叫做pattern , 即匹配。我通常称它为 资产选择器。就是匹配资产(-i 参数指定) 中的⼀部分。这⾥的 all 是匹配所有指定的所有资产。将在下⾯资产部分详细阐述。

    • -i 指定Ansible 的资产,也就是被管理服务器。

    • -m 指定要运⾏的模块,⽐如这⾥的 ping 模块和 copy 模块

    • -a 指定模块的参数, 这⾥模块 ping 没有指定参数。 模块 copy 指定了 src 和 dest 参数。

    四、 Ansible 资产

    在快速⼊⻔的场景中,我们⼀共管理了两台服务器。但是在实际场 景中,我们要管理的服务器往往要多得多。难道依然要在Ansible 的 -i 参数后⾯⼀个个追加IP指定吗? 这显然不合乎常理。

    因此这⼀节我们主要去介绍⼀下Ansible的资产。

    Ansible 的资产分为静态资产和动态资产,动态资产会在后⾯的⾼ 级部分详细阐释。

    下⾯仅介绍静态资产

    1. 静态资产

    顾名思义它本身是⼀个⽂本⽂件,⼀个格式类似INI的⽂件

    默认情况下,Ansible的资产⽂件位于 /ect/ansible/hosts。 pip 安装的可能没有这个⽂件,创建⼀个即可。

    1.1 ⾃定义资产

    这个⽂件可以⾃定义,之后使⽤相应的参数指定。

    下⾯给出⼀个⾃定义的静态资产实例,然后再具体解释其含义。

    # cat inventory.ini
    1.1.1.1
    2.2.2.2
    3.3.3.[1:15]
    test01.qfedu.com
    test03.qfedu.com
    test[05:09].qfedu.com
    
    [web_servers]
    192.168.1.2
    192.168.1.3
    192.168.1.5
    
    [dbdb_servers]
    192.168.2.2
    192.168.2.3
    192.168.1.5
    
    [alldb_servers]
    [alldb_servers:children]
    dbdb_servers
    web_servers
    • Ansible 的资产⽂件中,可以以IP地址的形式或者主机名的形 式存在。

    • Ansible 的资产若连续,可以使⽤[stat:end] 的形式去表达。

    • 可以将服务器按照业务场景定义成组,⽐如dbdb_servers 和 web_servers

    • 组和组之间可以存在继承关系,⽐如dbdb_servers 和 web_servers 同时继承 alldb_servers 组

    1.2 如何使⽤⾃定义资产

    • 通过 -i 参数指定⾃定义资产的位置即可(可以是全路径,也可以 是相对路径)。

    # ansible all -i inventory.ini ... // 伪指令,不可执⾏

    1.3 如何验证⾃定义资产

    假如我们刚刚定义的资产为 inventory.ini

    • 列举出所有资产

      • # ansible all -i inventory.ini --list-hosts
         hosts (29):
         1.1.1.1
         2.2.2.2
         3.3.3.1
         ...
    • 列举出选定资产

      • ⽐如这⾥列举出 web_servers

      • # ansible web_servers -i inventory.ini --list-hosts
         hosts (3):
         192.168.2.2
         192.168.2.3
         192.168.1.5

    注意这⾥使⽤的了资产选择器(pattern),不要慌,将会在下⾯ 对他进⾏详细的阐述

    2. 资产选择器

    • 有时操作者希望只对资产中的⼀部分服务器进⾏操作,⽽不是资产 中所有服务器。此时可以使⽤ Ansible 的资产选择器 PATTERN。

    • 下⾯学习如何通过资产选择器,更灵活的选择想要操作的服务器。

    2.1 基本语法格式

    ansible PATTERN -i inventory -m module -a argument
    

      

    选择⼀台或者⼏台服务器

    # ansible 1.1.1.1 -i inventory.ini --list-hosts
     hosts (1):
     1.1.1.1
     
    # ansible test01.qfedu.com -i inventory.ini --listhosts
     hosts (1):
     test01.qfedu.com
     
    # ansible 1.1.1.1,2.2.2.2 -i inventory.ini --listhosts
     hosts (2):
     1.1.1.1
     2.2.2.2
    

      

    选择⼀组服务器

    # ansible web_servers -i inventory.ini --list-hosts
     hosts (3):
     192.168.1.2
     192.168.1.3
     192.168.1.5
    

      

    使⽤ * 匹配

    # ansible 3.3.3.1* -i inventory.ini --list-hosts
     hosts (7):
     3.3.3.13
     3.3.3.10
     3.3.3.11
     3.3.3.12
     3.3.3.14
     3.3.3.15
     3.3.3.1
    

      

    使⽤逻辑匹配

    • web_servers 和 dbdb_servers 的并集

      两个组内的所有主机

      # ansible 'web_servers:db_servers' -i
      inventory.ini --list-hosts
       hosts (5):
       192.168.1.2
       192.168.1.3
       192.168.1.5
       192.168.2.2
       192.168.2.3
      

        

    • web_servers 和 dbdb_servers 的交集

      两个组共有的主机

      # ansible 'web_servers:&db_servers' -i
      inventory.ini --list-hosts
       hosts (1):
       192.168.1.5
      

        

    • 排除

      在 web_servers 中,但是不在 db_servers 中

      # ansible 'web_servers:!db_servers' -i
      inventory.ini --list-hosts
       hosts (2):
       192.168.1.2
       192.168.1.3
      

        

    五、Ansible Ad-Hoc 命令

    Ad-hoc 命令是什么呢? 这其实是⼀个概念性的名字,是相对于写 Ansible playbook 来说的.类似于在命令⾏敲⼊shell命令和 写shell scripts两者之间的关系。可以⽤于执⾏⼀些临时命令。

    如果我们敲⼊⼀些命令去⽐较快的完成⼀些事情,⽽不需要将这些 执⾏的命令特别保存下来, 这样的命令就叫做 ad-hoc 命令。

    Ansible提供两种⽅式去完成任务,⼀是 ad-hoc 命令,⼀是写 Ansible playbook(这部分在⾼级课程中会详细阐释)。

    前者可以解决⼀些简单的任务, 后者解决较复杂的任务,⽐如做配 置管理或部署

    1. 命令格式

    在快速⼊⻔中执⾏的 Ansible 命令,类似于批量执⾏命令。

    在Ansible 中统称为Ansible Ad-Hoc。

    命令语法格式如下:

    ansible pattern [-i inventory] -m module -a argument

    • pattern 资产选择器

    • -i 指定资产清单⽂件的位置

    • -m 指定本次Ansible ad-hoc 要执⾏的模块。可以类别成 SHELL 中的命令。

    • -a 模块的参数. 可以类⽐成SHELL 中的命令参数

    # ansible all -i 172.18.0.3,172.18.0.4 -m copy -a
    "src=/tmp/a.conf dest=/tmp/a.conf"
    

      

    2.模块类型

    • Ansible 模块分三种类型: 核⼼模块(core module)、附加模块 (extra module)及⽤户⾃定义模块(consume module)。

    • 核⼼模块是由Ansible 的官⽅团队提供的。

    • 附加模块是由各个社区提供的。例如: OPENSTACK 社区、 DOCKER 社区等等。

    • 当核⼼模块和附加模块都⽆法满⾜你的需求时,⽤户可以⾃定义模 块。

    • 默认情况下,在安装Ansible 的时候, 核⼼模块和附加模块都已经 安装⽽⽆需⽤户⼲预。

    3.联机帮助

    Ansible 的核⼼模块和附加模块,数量有3000+ 。这样庞⼤的模块 数量,对于任何⼀个接触Ansible 的⼈都不可能将其完全记住、掌握使 ⽤。 因此能够顺利使⽤Ansible 的帮助⽂档,对我们来说是很有必要 的。Ansible 的帮助⽂档,由它本身提供的命令 ansible-doc 实现。

    常⽤帮助参数

    • 列举出所有的核⼼模块和附加模块

    # ansible-doc -l
    

      

    • 查询某个模块的使⽤⽅法

    # ansible-doc modulename
    

      

    • 查询某个模块的使用方法,比较简洁的信息

    # ansible-doc -s modulename
    

      

    Example

    # ansible-doc yum
    # ansible-doc -s yum
    

      

    4.常⽤模块

    为了便于演示和操作,现在把之前的测试主机 IP 172.18.0.3 和 172.18.0.4 保存到 当前⽬录下的 hosts ⽂件中。

    [root@qfedu.com ~]# cat hosts
    [dbservers]
    172.18.0.3
    [webservers]
    172.18.0.4
    

      

    4.1 command & shell 模块

    两个模块都是在远程服务器上去执⾏命令。

    但command模块是ad-hoc的默认模块,在执⾏ad-hoc时,若不指定 模块的名字则默认使⽤此模块。

    # ansible all -i hosts -a "echo 'hello'"
    172.18.0.4 | CHANGED | rc=0 >>
    hello
    172.18.0.3 | CHANGED | rc=0 >>
    hello
    
    # ansible all -i hosts -m shell -a "echo 'hello'"
    172.18.0.4 | CHANGED | rc=0 >>
    hello
    172.18.0.3 | CHANGED | rc=0 >>
    hello
    • shell 模块可以执⾏SHELL 的内置命令和 特性(⽐如管道 符)。

    • command 模块⽆法执⾏SHELL 的内置命令和特性

    实例

    # ansible all -i hosts -m shell -a "echo
    'hello'|grep -o 'e'"
    172.18.0.3 | CHANGED | rc=0 >>
    e
    172.18.0.4 | CHANGED | rc=0 >>
    e
    
    # ansible all -i hosts -a "echo 'hello'|grep -o
    'e'"
    172.18.0.4 | CHANGED | rc=0 >>
    hello|grep -o e
    172.18.0.3 | CHANGED | rc=0 >>
    hello|grep -o e
    

      

    4.2 script 模块

    将管理节点上的脚本传递到被管理节点(远程服务器)上进⾏执⾏。

    实例

    管理节点上的⼀个脚本

    # cat /root/a.sh
    touch /tmp/testfile

    执⾏

    [root@qfedu.com ~]# ansible webservers -i hosts -m
    script -a "/root/a.sh"
    172.18.0.4 | CHANGED => {
     "changed": true,
     "rc": 0,
     "stderr": "Shared connection to 172.18.0.4
    closed.
    ",
     "stderr_lines": [
     "Shared connection to 172.18.0.4 closed."
     ],
     "stdout": "",
     "stdout_lines": []
    }
    

      

    验证

    [root@qfedu.com ~]# ansible webservers -i hosts -m
    shell -a "ls -l /tmp/testfile"
    172.18.0.4 | CHANGED | rc=0 >>
    -rw-r--r-- 1 root root 0 Apr 12 07:17 /tmp/testfile
    

      

    4.3 copy 模块

    copy 模块的主要⽤于管理节点和被管理节点之间的⽂件拷⻉。

    • src 指定拷⻉⽂件的源地址

    • dest 指定拷⻉⽂件的⽬标地址

    • backup 拷⻉⽂件前,若原⽬标⽂件发⽣了变化,则对⽬标⽂件进⾏备份

    • woner 指定新拷⻉⽂件的所有者

    • group 指定新拷⻉⽂件的所有组

    • mode 指定新拷⻉⽂件的权限

    (1)实例
    • copy 管理节点上的 nginx.repo 到被管理节点上

    # cat nginx.repo
    # ansible webservers -i hosts -m copy -a
    "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo"
    

      

    • copy 前, 在被管理节点上对原⽂件进⾏备份(被管理节点有相同名会先备份文件为其他名称,相同名称的为新文件)

    # ansible all -i hosts -m copy -a "src=./nginx.repo
    dest=/etc/yum.repos.d/nginx.repo backup=yes"
    

      

    • copy ⽂件的同时对⽂件进⾏⽤户及⽤户组设置

    # ansible all -i hosts -m copy -a "src=./nginx.repo 
    dest=/etc/yum.repos.d/nginx.repo owner=nobody
    group=nobody"
    

      

    • copy ⽂件的同时对⽂件进⾏权限设置

    # ansible all -i hosts -m copy -a "src=./nginx.repo
    dest=/etc/yum.repos.d/nginx.repo mode=0755"
    

      

    4.4 yum_repsitory

    添加 YUM 仓库

    常⽤参数

    • name 仓库名称,就是仓库⽂件中第⼀⾏的中括号中名称,必 须的参数。

    • description 仓库描述信息,添加时必须的参数

    • baseurl yum存储库 “repodata” ⽬录所在⽬录的URL,添加 时必须的参数。

      它也可以是多个URL的列表。

    • file 仓库⽂件保存到被管理节点的⽂件名,不包含 .repo。 默认是 name 的值。

    • state preset 确认添加仓库⽂件, absent 确认删除仓库⽂ 件。

    • gpgcheck 是否检查 GPG yes|no, 没有默认值,使 ⽤/etc/yum.conf 中的配置。

    实例

    添加epel源

    [root@qfedu.com ~]# ansible dbservers -i hosts -m
    yum_repository -a "name=epel
    baseurl='https://download.fedoraproject.org/pub/epel/
    $releasever/$basearch/' description='EPEL YUM repo'"
    172.18.0.3 | CHANGED => {
     "ansible_facts": {
     "discovered_interpreter_python":
    "/usr/bin/python"
     },
     "changed": true,
     "repo": "epel",
     "state": "present"
    }
    

      

    删除 epel 源

    [root@qfedu.com ~]# ansible dbservers -i hosts -m
    yum_repository -a "name=epel state=absent"
    172.18.0.3 | CHANGED => {
     "ansible_facts": {
     "discovered_interpreter_python":
    "/usr/bin/python"
     },
     "changed": true,
     "repo": "epel",
     "state": "absent"
    }
    

      

    4.5 yum 模块

    等同于 Linux 上的YUM 命令, 对远程服务器上RPM包进⾏管理。

    常⽤参数:

    • name 要安装的软件包名, 多个软件包以英⽂逗号(,) 隔开

    • state 对当前指定的软件安装、移除操作(present installed latest absent removed) ⽀持的参数 - present 确认已经安 装,但不升级 - installed 确认已经安装 - latest 确保安装,且 升级为最新 - absent 和 removed 确认已移除

    实例

    • 安装⼀个软件包

    # ansible webservers -i hosts -m yum -a
    "name=nginx state=present"
    
    # ansible webservers -i hosts -m yum -a
    "name=nginx state=latest"
    
    # ansible webservers -i hosts -m yum -a
    "name=nginx state=installed"
    

      

    • 移除⼀个软件包

    # ansible webservers -i hosts -m yum -a
    "name=nginx state=absent"
    
    # ansible webservers -i hosts -m yum -a
    "name=nginx state=removed"
    

      

    • 安装⼀个软件包组

    # ansible webservers -i hosts -m yum -a
    "name='@Development tools' state=present"
    

      

    4.6 systemd 模块

    Centos6 之前的版本使⽤ service 模块。 请使⽤ ansible-doc service 命令⾃⾏查看帮助信息。

    管理远程节点上的 systemd 服务,就是由 systemd 所管理的服 务。

    常⽤参数:

    • daemon_reload 重新载⼊ systemd,扫描新的或有变动的单 元

    • enabled 是否开机⾃启动 yes|no

    • name 必选项,服务名称 ,⽐如 httpd vsftpd

    • state 对当前服务执⾏启动,停⽌、重启、重新加载等操作 (started,stopped,restarted,reloaded)

    实例

    • 重新加载 systemd

    # ansible webservers -i hosts -m systemd -a
    "daemon_reload=yes"
    

      

    • 启动 Nginx 服务

    # ansible webservers -i hosts -m systemd -a
    "name=nginx state=started"
    

      

    • 关闭 Nginx 服务

    # ansible webservers -i hosts -m systemd -a
    "name=nginx state=stopped"
    

      

    • 重启 Nginx 服务

    # ansible webservers -i hosts -m systemd -a
    "name=nginx state=restarted"
    

      

    • 重新加载 Nginx 服务

    # ansible webservers -i hosts -m systemd -a
    "name=nginx state=reloaded"
    

      

    • 将 Nginx 服务设置开机⾃启动

    # ansible webservers -i hosts -m systemd -a
    "name=nginx enabled=yes"
    

      

    4.7 group 模块

    在被管理节点上,对组进⾏管理。

    常⽤参数:

    • name 组名称, 必须的

    • system 是否为系统组, yes/no , 默认是 no

    • state 删除或这创建,present/absent ,默认是present

    实例

    • 创建普通组 db_admin

    # ansible dbservers -i hosts -m group -a
    "name=db_admin"
    

      

    4.8 user 模块

    ⽤于在被管理节点上对⽤户进⾏管理。

    常⽤参数:

    • name 必须的参数, 指定⽤户名-

    • password 设置⽤户的密码,这⾥接受的是⼀个加密的值,因 为会直接存到 shadow, 默认不设置密码

    • update_password 假如设置的密码不同于原密码,则会更新 密码. 在 1.3 中被加⼊

    • home 指定⽤户的家⽬录

    • shell 设置⽤户的 shell

    • comment ⽤户的描述信息

    • create_home 在创建⽤户时,是否创建其家⽬录。默认创建, 假如不创建,设置为 no。2.5版本之前使⽤

    • createhome group 设置⽤户的主组

    • groups 将⽤户加⼊到多个其他组中,多个⽤逗号隔开。 默认会把⽤户从其他已经加⼊的组中删除。

    • append yes|no 和 groups 配合使⽤,yes 时, 不会把⽤户从其他已经加⼊的组中删除

    • system 设置为 yes 时,将会创建⼀个系统账号

    • expires 设置⽤户的过期时间,值为时间戳,会转为为天数后, 放在 shadow 的第 8 个字段⾥

    • generate_ssh_key 设置为 yes 将会为⽤户⽣成密钥,这不会 覆盖原来的密钥

    • ssh_key_type 指定⽤户的密钥类型, 默认 rsa, 具体的类型取 决于被管理节点

    • state 删除或添加⽤户, present 为添加,absent 为删除; 默认值 present

    • remove 当与 state=absent ⼀起使⽤,删除⼀个⽤户及关联的 ⽬录,

      ⽐如家⽬录,邮箱⽬录。可选的值为: yes/no

    实例

    • 创建⽤户并设置密码

      先⽣成加密密码

      [root@qfedu.com ~]# pass=$(echo "123456" |
      openssl passwd -1 -stdin)
      

        

      执⾏ ansible 命令 创建⽤户 foo 并设置密码

      # ansible all -i hosts -m user -a "name=foo
      password=${pass}"
      

        

    • 创建⽤户 yangge, 并且为其创建密钥对,并且密钥类型为: ecdsa

    # ansible all -i hosts -m user -a "name=yangge
    generate_ssh_key=yes ssh_key_type=ecdsa"
    

      

    • 创建⽤ tom, 并且设置其有效期到 2020年4⽉15⽇, 加⼊到组 db_admin 中, 不改变⽤户原有假如的组。

    # ansible dbservers -i hosts -m user -a
    "name=tom expires=$(date +%s -d 20200415)
    gorups=db_admin append=yes"
    %s 从1970年1月1日00:00:00到目前经历的秒数
    -d<字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号;

    date 命令说明

    // 计算 3 ⼩时之后是⼏点⼏分
    # date +%T -d '3 hours'
    // 任意⽇期的前 N 天,后 N 天的具体⽇期
    # date +%F -d "20190910 1 day"
    # date +%F -d "20190910 -1 day"
    
    // 计算两个⽇期相差天数, ⽐如计算⽣⽇距离现在还有多少天
    # d1=$(date +%s -d 20180728)
    # d2=$(date +%s -d 20180726)
    # echo $(((d1-d2)/86400))
    

      

    4.9 file 模块

    file 模块主要⽤于远程主机上的⽂件操作。

    常⽤参数:

    • owner 定义⽂件/⽬录的属主

    • group 定义⽂件/⽬录的属组

    • mode 定义⽂件/⽬录的权限

    • path 必选项,定义⽂件/⽬录的路径

    • recurse 递归的设置⽂件的属性,只对⽬录有效

    • src 链接(软/硬)⽂件的源⽂件路径,只应⽤于state=link的情况

    • dest 链接⽂件的路径,只应⽤于state=link的情况

    • state

      • directory 如果⽬录不存在,创建⽬录

      • file ⽂件不存在,则不会被创建,存在则返回⽂件的信 息,常⽤于检查⽂件是否存在。

      • link 创建软链接

      • hard 创建硬链接

      • touch 如果⽂件不存在,则会创建⼀个新的⽂件,如 果⽂件或⽬录已存在,则更新其最后修改时间

      • absent 删除⽬录、⽂件或者取消链接⽂件

    实例

    // 创建⼀个⽂件
    # ansible all -i hosts -m file -a
    "path=/tmp/foo.conf state=touch"
    
    // 改变⽂件所有者及权限
    # ansible all -i hosts -m file -a
    "path=/tmp/foo.conf owner=nobody group=nobody
    mode=0644"
    
    // 创建⼀个软连接
    # ansible all -i hosts -m file -a "src=/tmp/foo.conf
    dest=/tmp/link.conf state=link"
    
    // 创建⼀个⽬录
    # ansible all -i hosts -m file -a "path=/tmp/testdir
    state=directory"
    
    // 取消⼀个连接
    # ansible all -i hosts -m file -a
    "path=/tmp/link.conf state=absent"
    
    // 删除⼀个⽂件
    # ansible all -i hosts -m file -a
    "path=/tmp/foo.conf state=absent"
    

      

    4.10 cron 模块

    管理远程节点的CRON 服务。等同于Linux 中的 计划任务。

    注意:使⽤ Ansible 创建的计划任务,是不能使⽤本地 crontab -e去编辑,否则 Ansible ⽆法再次操作此计划任务了。

    常⽤参数:

    • name 指定⼀个cron job 的名字。⼀定要指定,便于⽇之后删 除。

    • minute 指定分钟,可以设置成(0-59, *, */2 等)格式。 默认是 * , 也就是每分钟。

    • hour 指定⼩时,可以设置成(0-23, *, */2 等)格式。 默认是 * , 也就是每⼩时。

    • day 指定天, 可以设置成(1-31, *, */2 等)格式。 默认是 * , 也 就是每天。

    • month 指定⽉份, 可以设置成(1-12, *, */2 等)格式。 默认是 * , 也就是每周。

    • weekday 指定星期, 可以设置成(0-6 for Sunday-Saturday, * 等)格式。默认是 *,也就是每星期。

    • job 指定要执⾏的内容,通常可以写个脚本,或者⼀段内容。

    • state 指定这个job的状态,可以是新增(present)或者是删除 (absent)。 默认为新增(present)

    实例

    // 新建⼀个 CRON JOB 任务
    # ansible all -i hosts -m cron -a "name='create new
    job' minute='0' job='ls -alh > /dev/null'"
    
    // 删除⼀个 CRON JOB 任务,删除时,⼀定要正确指定job 的name
    参数,以免误删除。
    # ansible all -i hosts -m cron -a "name='create new
    job' state=absent"
    

      

    登录任何⼀台管理机验证cron

    # crontab -l
    #Ansible: create new job
    0 * * * * ls -alh > /dev/null
    

      

    4.11 debug模块

    debug 模块主要⽤于调试时使⽤,通常的作⽤是将⼀个变量的值 给打印出来。

    常⽤参数:

    • var 直接打印⼀个指定的变量值

    • msg 打印⼀段可以格式化的字符串

    实例

    • 这里引入变量,我们只需了解debug模板的使⽤即可。在学 习变量、剧本时,我们会对它有更深刻的理解。

    # ansible all -i hosts -m debug -a "var=role" -e
    "role=web"
    
    # ansible all -i hosts -m debug -a "msg='role is
    {{role}} '" -e "role=web"
    

      

    4.12 template 模块

    template 模块使⽤了Jinjia2格式作为⽂件模版,可以进⾏⽂档内 变量的替换。⽂件以 .j2 结尾。

    常⽤参数:

    • src 指定 Ansible 控制端的 ⽂件路径

    • dest 指定 Ansible 被控端的 ⽂件路径

    • owner 指定⽂件的属主

    • group 指定⽂件的属组

    • mode 指定⽂件的权限

    • backup 创建⼀个包含时间戳信息的备份⽂件,这样如果您以 某种⽅式错误地破坏了原始⽂件, 就可以将其恢复原状。 yes/no

    实例

    ⽤法其实和 copy 模块基本⼀样, template 模块的强⼤之处就是 使⽤变量替换,就是可以把传递给 Ansible 的变量的值替换到模板⽂件 中。

    1. 建⽴⼀个 template ⽂件, 名为 hello_world.j2
    # cat hello_world.j2
    Hello {{var}} !
    
    2. 执⾏命令,并且设置变量 var 的值为 world
    # ansible all -i hosts -m template -a
    "src=hello_world.j2 dest=/tmp/hello_world.world" -e
    "var=world"
    
    3. 在被控主机上验证
    # cat /tmp/hello_world.world
    Hello world !
    

      

    4.13 lineinfile 模块

    在被管理节点上,⽤正则匹配的⽅式对⽬标⽂件的⼀⾏内容修改删 除等操作。

    如果是在⼀个⽂件中把所有匹配到的多⾏都进⾏统⼀处理,请参 考replace 模块。

    如果想对⼀个⽂件进⾏⼀次性添加/更新/删除多⾏内容等操作,参 考blockinfile模块

    常⽤参数

    • path 被管理节点的⽬标⽂件路径, 必须。

    • state 可选值absent 删除 |present 替换(默认值)。

    • regexp 在⽂件的每⼀⾏中查找的正则表达式。 对于 state=present ,仅找到的最后⼀⾏将被替换。

    • line 要在⽂件中插⼊/替换的⾏。需要state=present。

    • create ⽂件不存在时,是否要创建⽂件并添加内容。yes/no

    实例

    • 删除被控节点⽂件⾥的某⼀条内容

    # ansible dbservers -i hosts -m lineinfile -a
    "path=/etc/sudoers regexp='^%wheel' state=absent"
    • 替换某⼀⾏

    # ansible dbservers -i hosts -m lineinfile -a
    "path=/etc/selinux/config regexp='^SELINUX='
    line='SELINUX=disabled' state=present"
    

      

    4.14 blockinfile 模块

    对⽬标⽂件进⾏多⾏的添加/更新/删除操作。

    常⽤参数

    • path ⽬标⽂件路径

    • block ⽂件中被操作的块内容

    • state 块内容如何处理,absent 删除, present 添加/更新(默 认值)

    实例

    • 向文件/etc/ssh/sshd_config的最后添加⼏⾏内容

      添加的内容是

    Match User ansible-agent
    PasswordAuthentication no
    

      

    # ansible dbservers -i hosts -m blockinfile -a
    "path=/etc/ssh/sshd_config block='Match User
    ansible-agent
    PasswordAuthentication no'"

    注意: 是换⾏符的意思。

    • 更新之前的内容

    # sansible dbservers -i hosts -m blockinfile -a
    "path=/etc/ssh/sshd_config block='Match User
    ansible-agent
    PasswordAuthentication yes'"
    

      

    • 删除⽂件中的连续出现⼏⾏内容

    # ansible dbservers -i hosts -m blockinfile -a
    "path=/etc/ssh/sshd_config block='Match User
    ansible-agent
    PasswordAuthentication yes'
    state=absent"
    

      

    模块索引 https://docs.ansible.com/ansible/latest/modules/mo dules_by_category.html

     


    出处:千锋教育

    配置若有遗漏或错误,请评论留言。
  • 相关阅读:
    shp2pgsql向postgresql导入shape数据
    node.js的Promise库-bluebird示例
    iOS中点击事件失效的解决办法
    [PHP] 获取IP 和JS获取IP和地址
    [Bootstrap ] 模态框(Modal)插件
    [html][javascript] 关于SVG环形进度条
    [javascript] js实现小数的算术运算方法
    [GO] linux 下安装GO
    小知识点:session的存放位置
    [linux] linux的top命令参数详解
  • 原文地址:https://www.cnblogs.com/BrokenEaves/p/14632242.html
Copyright © 2011-2022 走看看