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

     


    出处:千锋教育

    配置若有遗漏或错误,请评论留言。
  • 相关阅读:
    Linux内核RPC请求过程
    二分图
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 文本加密
    Java蓝桥杯 算法提高 九宫格
    Java蓝桥杯 算法提高 九宫格
  • 原文地址:https://www.cnblogs.com/BrokenEaves/p/14632242.html
Copyright © 2011-2022 走看看