2019-08-24 ansible模块说明

ansible模块说明

1)command
命令执行模块,但命令中不能包括>,<,;,&,|字符
2)shell
万能模块,能够执行shell命令,能够在远程节点上,调用/bash/sh来执行,能够使用特殊参数

[root@m01 ~]# ansible web01 -m shell -a "cd /tmp;pwd"
web01 | CHANGED | rc=0 >>
/tmp

3)script
在连接远程主机后,能够在远程主机运行本地的脚本

[root@m01 ~]# cat d.sh 
#!/bin/bash
echo oldboy
[root@m01 ~]# ansible web01 -m script -a "/root/d.sh"
web01 | CHANGED => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to web01 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to web01 closed."
    ], 
    "stdout": "oldboy\r\n", 
    "stdout_lines": [
        "oldboy"
    ]
}
===========================================================================
PS:
1)本地脚本不必有执行权限
2)本地脚本不用传输到远端主机

4)copy
将文件复制到远程位置

参数:
src 服务端本地的目录和文件;传输目录时,oldboy/是传输oldboy里面的内容,oldboy是传输oldboy的目录及里面的东西
dest 远程主机端的目录,如果远程端目录没有会自动创建
owner 目录或文件的属主
group 目录或文件的属组
mode 目录的权限
backup 开启数据的备份功能
remote_src 相当于远程主机的cp功能,备份远程主机的数据,在管理端主机可以没有文件
content 可以编辑文件信息,直接复制到的远程主机,不用在管理端创建文件

5)fetch
从远程主机的文件或数据复制到管理端

参数:
src 远程主机的目录文件
dest 管理端的目录

6)file
管理文件和文件属性

参数:
path 指定文件路径信息
mode 修改文件权限
owner 修改文件的属主
group 修改文件的属组
state 修改文件状态信息
(hard 硬链接 soft 软连接 touch 创建文件 directory 目录)
src 针对软连接和硬链接,目录或文件的源路径
dest 针对软连接和硬链接 ,目录或文件的目标路径
rescure 是否递归修改目录里面文件的熟性 yes/no

7)user
管理用户账户

参数:
name 指定用户的名称
create_home 是否创建用户的家目录 yes/no
shell 指定登录用户的shell
uid 指定登录用户的uid
group 指定登录用户的属组(主要组)
groups 指定登录用户的附属组
password 指定登录用户的密码信息(必须是密文),相当于直接在/etc/shadow里面指定
state present表创建用户(默认) absent表删除用户

补充:

如何指定用户密码的密文信息
1)使用ansible模块
      ansible all -i localhost, -m debug -a "msg={{ 'mypassword' | password_hash('sha512', 'mysecretsalt') }}"
mypassword:指定用户的密码
sha512:加密的算法
mysecretsalt:指定加密的方式
localhost:指在本机显示
[root@m01 ~]# ansible localhost -m debug -a "msg={{ '123456'|password_hash('sha512','123456') }}"
localhost | SUCCESS => {
    "msg": "$6$123456$37mxvJGRzjWxgD3HYl.bKq4aUXrcYV8mk0pxmqg8ARv3t9ke5ZM/NBbwTkx1FDcnLhrOX3jQc6L/NKAohhQJn/"
}
[root@m01 ~]# ansible web01 -m user -a 'name=oldboy password=$6$123456$37mxvJGRzjWxgD3HYl.bKq4aUXrcYV8mk0pxmqg8ARv3t9ke5ZM/NBbwTkx1FDcnLhrOX3jQc6L/NKAohhQJn/'
web01 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "append": false, 
    "changed": true, 
    "comment": "", 
    "group": 1003, 
    "home": "/home/oldboy", 
    "move_home": false, 
    "name": "oldboy", 
    "password": "NOT_LOGGING_PASSWORD", 
    "shell": "/bin/bash", 
    "state": "present", 
    "uid": 1000
}
2)利用python模块加密
  第一个历程: 安装pip下载工具
      yum install -y python-pip
      第二个历程: 利用pip工具下载python程序包
      pip install passlib
      第三个历程: 生成密文信息
      [root@m01 ~]# python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
      Password: 
    $6$IQhh.egT4ow2dzmd$fk9W1.J4q1ArQ8nykkhh5A0waFbgU1Qa4sUdNm42.oYSpSMmIIl0262cSDg1Q6Ph8p3rnqHOs372A.GzD11.w/

8)group
用户组的管理

参数:
name:指定组名称
gid:指定组gid
state: present添加组(默认)absent()\删除组

9)yum
红帽系列安装软件包的模块

参数:
name 指定安装包的名字
state present/installed/latest 安装软件包 absent/removed删除软件包

10)service
服务模块
参数:

name 启动服务的名字
state 服务的状态 started启动状态 restarted重启 reloaded平滑重启 stopped停止
enabled yes/no 开机是否自启

11)cron
定时任务模块

参数:
minute 分钟
hour 小时
day 天
month 月
weekday 星期
name 定时任务的名字,一般用来删除定时任务使用
job 定时任务的命令
disable 注释定时任务,注释时,把定时任务的详细信息写上,包括时间信息和job信息

12)mount
系统的挂载参数

参数:
src 要挂载的设备路径
dest 要挂载的目录
state mounted永久挂载,同时挂载 present只写如/etc/fstab中并不进行挂载 absent 删除/etc/fstab里面的挂载信息,同时卸除挂载点
unmounted 只进行卸载,并不删除/etc/fstab里面的文件


剧本的编写

剧本:将多个模块操作命令进行整合
作用说明:
01)可以实现服务自动化部署
02)可以提高运维工作效率
03)可以减少运维工作问题
04)可以节省公司运维成本
剧本编写组成

1 .剧本的角色信息: hosts ---主机信息
2 .剧本任务信息: tasks --任务信息

剧本编写规范
遵循yaml语法规范====Python的代码语法规范
01 .缩进规范:两个空格表示一个缩进关系

标题一
  标题二
    标题三
PS:在缩进时只能用空格缩进,不能使用tab键缩进

02:字典规范
冒号后面要有空格,当冒号出现在结尾不需要有空格,冒号出现的注释信息中不需要有空格

key: vlaue

03:列表规范
- 号后面要有空格

name:
  - nfs
  - rpcbind
  - rsyncd

脚本测试执行方法

1 .检验脚本的语法格式
anislbe-playbook --syntax-check play.yml
2 .检测脚本的模拟运行
ansible-playbook -C play.yml

剧本测试编写

一键自动化安装nfs
服务端

1 .安装nfs ,rpcbind
2 .编写配置文件
3 . 创建存储目录
4 .启动服务程序

客户端

1 .安装程序软件
2 .进行挂载操操作

脚本编写方法*

1 .利用变量编写
2 .利用字典编写
3 .采用json格式编写

剧本一采用变量编写
nfs服务端

[root@m01 /etc/ansible]# cat nfs_server.yml 
- hosts: nfs_server
  tasks:
  - name: install nfs rpc_bind
    yum: name=rpcbind state=installed
    yum: name=nfs-utils state=installed
  - name: copy configuartion
    copy: src=/root/exports dest=/etc/
  - name: create dir
    file: path=/data state=directory owner=nfsnobody group=nfsnobody
  - name: boot server
    service: name=rpcbind state=started enabled=yes
    service: name=nfs state=started enabled=yes

nfs客户端

[root@m01 /etc/ansible]# cat nfs_client.yml 
- hosts: nfs_client
  tasks:
    - name: installed softward
      yum: name=nfs-utils state=installed
    - name: mount nfs
      shell: mount -t nfs 172.16.1.31:/data /mnt

剧本二采用字典编写
nfs服务端

[root@m01 /etc/ansible]# cat nfs_server_dir.yml 
- hosts: nfs_server
  tasks:
    - name: install softward
      yum:
        name:
          - nfs-utils
          - rpcbind
        state: installed
    - name: copy config
      copy:
        src: /root/exports
        dest: /etc/
    - name: mkdir dir
      file:
        path: /data
        state: directory
        owner: nfsnobody
        group: nfsnobody
    - name: boot service
      service:
        name: rpcbind
        state: started
        enabled: yes
      service:
        name: rpcbind
        state: started
        enabled: yes

nfs客户端


[root@m01 /etc/ansible]# cat nfs_client_dir.yml 
- hosts: nfs_client
  tasks:
    - name: install softward
      yum:
        name: nfs-utils
        state: installed
    - name: mount dir
      mount:
        src: 172.16.1.31:/data
        fstype: nfs
        path: /mnt
        state: present

剧本扩展

1 .在 剧本中设置变量信息
2 .在剧本中设置注册信息
3 .在剧本中设置判断信息
4 .在剧本中设置循环信息
5 .在剧本中设置错误忽略信息
6 .在剧本中设置标签信息
7 .在剧本中设置触发信息

设置剧本变量信息
方法一 在剧本中设置变量

[root@m01 /etc/ansible]# cat playbook_var.yml 
- hosts: nfs_server
  vars:
    data_dir: /oldbaby
  tasks:
    - name: create dir
      file: path={{ data_dir }} state=directory

字典格式设置变量

[root@m01 /etc/ansible]# cat playbook_var_dir.yml 
- hosts: web01
  vars: 
    data_dir: /oldbaby
  tasks:
    - name: create dir
      file:
        path: "{{ data_dir }}"
        state: directory

python字典格式查看

[root@m01 /etc/ansible]# cat /server/scripts/test_python.sh 
#!/bin/python
import yaml
file = open("/etc/ansible/playbook_var_dir.yml")
x = yaml.load(file)
print x
====================================================
[root@m01 /etc/ansible]# python /server/scripts/test_python.sh
[{'tasks': [{'name': 'create dir', 'file': {'path': 'data_dir', 'state': 'directory'}}], 'hosts': 'web01', 'vars': {'data_dir': '/oldbaby'}}]

方法二 在命令行中设置变量

[root@m01 /etc/ansible]# ansible-playbook -e data_dir=/oldgirl playbook_var.yml

方法三:在主机清单中配置

[root@m01 /etc/ansible]# cat /etc/ansible/hosts
[nfs_server]
nfs01 data_dir=/old01
[backup01]
backup
[nfs_client]
web01
backup

三种变量的优先级

命令行中最高
配置文件其次
主机清单最低

剧本中的注册信息

[root@m01 /etc/ansible]# cat zhuce.yml 
- hosts: web01
  tasks:
    - name: check mount
      shell: df -h
      register: oldboy
    - name: dispaly mount info
      debug: msg={{ oldboy.stdout_lines }}
[root@m01 /etc/ansible]# ansible-playbook  zhuce.yml 

PLAY [web01] ************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************
ok: [web01]

TASK [check mount] ******************************************************************************************************
changed: [web01]

TASK [dispaly mount info] ***********************************************************************************************
ok: [web01] => {
    "msg": [
        "Filesystem      Size  Used Avail Use% Mounted on", 
        "/dev/sda3        19G  2.0G   17G  11% /", 
        "devtmpfs        224M     0  224M   0% /dev", 
        "tmpfs           235M     0  235M   0% /dev/shm", 
        "tmpfs           235M   26M  209M  11% /run", 
        "tmpfs           235M     0  235M   0% /sys/fs/cgroup", 
        "/dev/sda1       197M  105M   93M  54% /boot", 
        "tmpfs            47M     0   47M   0% /run/user/0"
    ]
}

PLAY RECAP **************************************************************************************************************
web01                      : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

剧本中设置判断信息
常见主机信息:

ansible_all_ipv4_address: 仅显示ipv4地址
ansible_devices:仅显示磁盘设备信息
ansible_distribution:显示是什么系统例如:centos suse
ansible_distribution_major_version: 显示系统主版本号
ansible_dirtribution_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_swaptotal_mb: 显示总的swap内存
ansible_swapfree_mb:显示swap内存的可用内存
ansible_mounts: 显示系统磁盘挂载情况
ansible_processor: 显示cpu的个数(具体显示每个cpu的型号)
ansible_processor_vcpus:显示cpu的个数(只显示总的个数)

[root@m01 /etc/ansible]# cat nfs_client.yml 
- hosts: nfs_client
  tasks:
    - name: installed softward
      yum: name=nfs-utils state=installed
    - name: mount nfs
      shell: mount -t nfs 172.16.1.31:/data /mnt
    - name:  create dir
      file: path=/oldbaby state=directory
      when: (ansible_hostname == "web01")

对多个条件进行并且判断

when: (ansible_hostname == "web01") and (ansilbe_hostname == "nfs")

对多个条件进行或者判断

when: (ansible_hostname == "web01") or (ansible_hostname == 'nfs')

对条件进行取反操作

when: (ansible_hostname !=  "web01")
作业:
01. 修改目录权限属性信息: 问题* 如何递归修改目录权限???
[root@m01 /etc/ansible]# ansible web01 -m file -a "path=/oldboy mode=666 recurse=yes"
02. 默认在删除用户是不会删除用户家目录. 问题* 如何将用户家目录删除 == userdel -r 
[root@m01 /etc/ansible]# ansible web01 -m user -a "name=oldboy01 state=absent remove=yes"
03. 在进行判断匹配时,如何取出内置变量指定子集信息
    描述人特点: 身高 体重 性别 学历: 金融学历_企业管理 财务学历_注册会计师 工作
04. 扩展研究 lineinfile

lineinfile

参数:
regexp: 正则匹配
line: 匹配到的文本,要替换成什么(必须选项)
path: 匹配文件的路径(必须选项)
owner: 改变文件的属主
group: 改变文件的属组
mode: 改变文件的权限
insertafter: 如果匹配不到regexp才会匹配insertafter,然后在匹配到的内容的下一行写入line 不能与insertbefore一起使用
insertbefore:如果匹配不到regexp 才会匹配insertbefore,然后在匹配到的内容上一行写入line
create: yes/no no为默认 如果设为yes,如果文件不存在则创建文件,如果匹配不到regexp则在文件的末尾加入line,不能与insertbefore和insertafter一起使用
backrefs: yes/no no为默认 yes 表示可以使用后项引用,这个参数会忽略insertafer和insertbefore.如果匹配到将会line 替换,如果匹配不到则不会影响 不能全局替换,只能从下往上替换???
validate: 对配置文件语法进行检查

你可能感兴趣的:(2019-08-24 ansible模块说明)