• Ansible Ad-Hoc与常用模块


    ansible 执行结果信息–各颜色说明;ansible Ad-Hoc 说明;ansible 如何查看帮助文档与常用模块详解

    主机规划

    添加用户账号

    说明:

    1、 运维人员使用的登录账号;

    2、 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放;

    3、 该用户也被 ansible 使用,因为几乎所有的生产环境都是禁止 root 远程登录的(因此该 yun 用户也进行了 sudo 提权)。

    1 # 使用一个专门的用户,避免直接使用root用户
    2 # 添加用户、指定家目录并指定用户密码
    3 # sudo提权
    4 # 让其它普通用户可以进入该目录查看信息
    5 useradd -u 1050 -d /app yun && echo '123456' | /usr/bin/passwd --stdin yun
    6 echo "yun  ALL=(ALL)       NOPASSWD: ALL" >>  /etc/sudoers
    7 chmod 755 /app/

    Ansible 配置清单Inventory

    之后文章都是如下主机配置清单

     1 [yun@ansi-manager ansible_info]$ pwd
     2 /app/ansible_info
     3 [yun@ansi-manager ansible_info]$ cat hosts_key 
     4 # 方式1、主机 + 端口 + 密钥
     5 [manageservers]
     6 172.16.1.180:22
     7 
     8 [proxyservers]
     9 172.16.1.18[1:2]:22
    10 
    11 # 方式2:别名 + 主机 + 端口 + 密码
    12 [webservers]
    13 web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=22
    14 web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=22
    15 web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=22

    Ansible执行返回 => 颜色信息说明

    黄色:成功执行并且伴随着状态的改变

    ansible proxyservers -m command -a 'cat /etc/hosts' -i hosts_key

    绿色:成功执行并且没有发生状态的改变,或者只是对远程节点状态信息进行查看

    ansible proxyservers -m ping -i hosts_key

    红色:操作执行命令有异常

    ansible proxyservers -m command -a 'll /tmp' -i hosts_key

    紫色:表示对命令执行发出警告信息(可能存在的问题,给你一下建议)

    1 # 其中 hosts_kkk 文件不存在
    2 ansible proxyservers -m command -a 'll /tmp' -i hosts_kkk

    Ansible 之 Ad-Hoc

    Ansible中有两种模式, 分别是 Ad-Hoc 模式和 Playbooks 模式。

    ad-hoc简而言之,就是“临时命令”,不会保存。

    ad-hoc模式的使用场景

    场景一,在多台机器上,查看某个进程是否启动

    场景二,在多台机器上,拷贝指定日志文件到本地,等等

    ad-hoc模式的命令使用

    Ansible查看帮助方法

    1 [yun@ansi-manager ~]$ ansible-doc -l       # 查看所有模块与简要说明
    2 [yun@ansi-manager ~]$ ansible-doc copy     # 查看指定模块方法「可优先查看 EXAMPLES 信息」★★★★★
    3 [yun@ansi-manager ~]$ ansible-doc -s copy  # 查看指定模块的 Playbooks 代码段

    Ansible常用模块

    工作目录与主机清单

    当前所在的工作目录和主机清单

     1 [yun@ansi-manager ansible_info]$ pwd
     2 /app/ansible_info
     3 [yun@ansi-manager ansible_info]$ ll
     4 total 4
     5 -rw-rw-r-- 1 yun yun 226 Oct  8 16:07 hosts_key
     6 [yun@ansi-manager ansible_info]$ cat hosts_key 
     7 # 方式1、主机 + 端口 + 密钥
     8 [manageservers]
     9 172.16.1.180:22
    10 
    11 [proxyservers]
    12 172.16.1.18[1:2]:22
    13 
    14 # 方式2:别名 + 主机 + 端口 + 密码
    15 [webservers]
    16 web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=22
    17 web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=22
    18 web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=22

    command 命令模块

    默认模块, 用于执行命令。但不支持管道或重定向。

    正常示例

    1 [yun@ansi-manager ansible_info]$ ansible proxyservers -a 'df -h' -i hosts_key
    2 # 或者
    3 [yun@ansi-manager ansible_info]$ ansible proxyservers -m command -a 'df -h' -i hosts_key

    异常示例

    1 # 重定向不支持
    2 ansible proxyservers -m command -a 'df -h > /tmp/df.info' -i hosts_key
    3 # 管道不支持
    4 ansible proxyservers -m command -a "df -h | grep 'boot'" -i hosts_key

    shell 命令模块

    功能和 command 相同,且支持管道和重定向。与 command 相比,优先使用该模块。

    示例

    1 ansible proxyservers -m shell -a "df -h | grep 'boot'" -i hosts_key
    2 ansible proxyservers -m shell -a "df -h > /tmp/df.info" -i hosts_key

    script 脚本模块

    在本地运行模块,等同于在远程执行。且不需要将脚本文件推送到目标主机进行执行。

    示例

    脚本中有 sudo 提权

    1 # 在 ansible 管理机操作
    2 [yun@ansi-manager ansible_info]$ cat /app/yunwei/yum_test.sh 
    3 #!/bin/sh
    4 # 由于使用的是 yun 用户,而不是 root 用户,因此需要 sudo 提权
    5 sudo yum install -y iftop
    6 [yun@ansi-manager ansible_info]$ ansible proxyservers -m script -a "/app/yunwei/yum_test.sh" -i hosts_key

    脚本中无 sudo 提权

    1 # 在 ansible 管理机操作
    2 [yun@ansi-manager ansible_info]$ cat /app/yunwei/yum_test.sh 
    3 #!/bin/sh 
    4 yum install -y iftop
    5 #######################################
    6 # 由于我们使用的是 yun 普通用户
    7 # 因此这里需要使用 -b 选择进行提权,这样在远程会以 root 用户执行
    8 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m script -a "/app/yunwei/yum_test.sh" -i hosts_key

    在目标机器查看是否在 yum 安装 iftop

    1 [root@ansi-haproxy01 ~]# ps -ef | grep 'iftop'
    2 root       3867   3866  0 23:25 pts/1    00:00:00 sudo yum install -y iftop
    3 root       3868   3867 48 23:25 pts/1    00:00:12 /usr/bin/python /bin/yum install -y iftop
    4 root       4144   3155  0 23:25 pts/0    00:00:00 grep --color=auto iftop

    yum 安装软件模块

    在目标机器实现 yum 安装软件

    1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
    2 [yun@ansi-manager ansible_info]$ ansible-doc yum 
    3 # 由于我们使用的是 yun 普通用户
    4 # 因此必须使用 -b 选择进行提权
    5 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m yum -a 'name=httpd state=present' -i ./hosts_key

    相关选项说明:

    name:要安装软件包的名称

    state:状态说明

         ‘present’ 和 ‘installed’ 简单地确保安装了所需的包。「优先使用 present」

         ‘latest’ 将更新指定的软件包,如果它不是最新可用的版本。

         ‘absent’ and ‘removed’ 将删除指定的包【慎用!!!】。「如要使用优先使用 absent」

    download_only:只下载包,不安装

    copy 文件拷贝模块「本地到远端」

    将控制机的文件或目录拷贝到受控机,并且可以指定目标文件/目录的属性信息。

    控制机操作

     1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
     2 [yun@ansi-manager ansible_info]$ ansible-doc copy 
     3 # 由于我们使用的是 yun 普通用户
     4 # 因此有时需要使用 -b 选择进行提权
     5 # 将 content 中的内容直接写入目标文件中
     6 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m copy -a "content='123
    ' dest=/tmp/copy_test2 owner=root group=root mode=0644 backup=yes" -i ./hosts_key 
     7 ## 拷贝文件
     8 [yun@ansi-manager ansible_info]$ cat /tmp/copy_test 
     9 111111
    10 222222
    11 333333
    12 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m copy -a "src=/tmp/copy_test dest=/tmp/ owner=root group=root mode=0644 backup=yes" -i ./hosts_key
    13 ## 拷贝目录
    14 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m copy -a "src=/app/yunwei dest=/tmp/ owner=root group=root mode=0644 backup=yes" -i ./hosts_key

    被控端查看

    1 [yun@ansi-haproxy01 tmp]$ cat copy_test2
    2 123
    3 [yun@ansi-haproxy01 tmp]$ cat /tmp/copy_test 
    4 111111
    5 222222
    6 333333

    相关选项说明:

    src:源文件「可以是绝对路径或相对路径」

    remote_src:为 False「默认」,则源文件在本地;为 True ,则源文件在远端「了解」

    dest:推送数据的目标路径或目标文件

    owner:指定远端文件的属主

    group:指定远端文件的属组

    mode:指定远端文件的权限

    backup:如果推送的目标文件存在且与源文件内容不同,那么会对目标文件进行备份「通过 checksum 校验」

    content:将 content 中的内容直接写入目标文件中

    注意事项:

    1、同一个源文件,如果源文件内容没有任何修改,那么进行第二次相同的操作时,检测到要拷贝的文件和目标文件内容相同「通过 checksum 校验」,且目标文件属性前后未发生改变,那么就不会进行拷贝。由于目标文件属性未发生改变,所以返回数据颜色为绿色。如下图所示。

    2、同一个源文件,如果源文件内容没有任何修改,那么进行第二次相同的操作时,如果源文件和目标文件内容相同「通过 checksum 校验」,但目标文件属性前后要求发生改变「属主、属组、权限」,那样也不会进行拷贝。但由于目标文件属性发生改变,所以返回数据颜色为黄色。

    fetch 文件拷贝模块「远端到本地」

    该模块功能类似于 copy 模块,但是是反向的。将远端的文件拷贝到本地。备注:当前仅支持文件,暂不支持递归拷贝。

    由于ansible使用的是 yun 用户,因此从远端拷贝过来的文件属主、属组都是 yun。

    控制机操作

    1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
    2 [yun@ansi-manager ansible_info]$ ansible-doc fetch 
    3 # 由于我们使用的是 yun 普通用户
    4 # 因此有时需要使用 -b 选择进行提权

    被控端文件准备1

    1 [test1@ansi-haproxy01 tmp]$ ll /tmp/test1 
    2 -rw-rw-r-- 1 test1 test1 20 Nov  2 11:04 /tmp/test1
    3 [test1@ansi-haproxy01 tmp]$ cat /tmp/test1 
    4 111
    5 222
    6 333
    7 aaa
    8 bbb

    被控端文件准备2

    1 [test1@ansi-haproxy02 tmp]$ ll /tmp/test1 
    2 -rw-rw-r-- 1 test1 test1 20 Nov  2 11:04 /tmp/test1
    3 [test1@ansi-haproxy02 tmp]$ cat /tmp/test1 
    4 1111

    拷贝方式1

     1 [yun@ansi-manager ansible_info]$ ansible 172.16.1.181 -b -m fetch -a "src=/tmp/test1 dest=/tmp/" -i ./hosts_key  # 拷贝 172.16.1.181 主机的
     2 或者
     3 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m fetch -a "src=/tmp/test1 dest=/tmp/" -i ./hosts_key  # 拷贝 proxyservers 主机组的
     4 ## 查看拷贝结果「注意目录层次」
     5 [yun@ansi-manager ansible_info]$ ll /tmp/
     6 total 4
     7 drwxrwxr-x 3 yun  yun  17 Nov  2 11:21 172.16.1.181
     8 drwxrwxr-x 3 yun  yun  17 Nov  2 11:23 172.16.1.182
     9 [yun@ansi-manager ansible_info]$ tree /tmp/172.16.1.18*
    10 /tmp/172.16.1.181
    11 └── tmp
    12     └── test1
    13 /tmp/172.16.1.182
    14 └── tmp
    15     └── test1
    16 
    17 2 directories, 2 files

    拷贝方式2

     1 # 如果使用 flat=yes,那么最好只拷贝一台远端主机的文件,如果是多台那么后面执行的结果,会把前面的覆盖掉。
     2 # dest 路径有 / 结尾
     3 [yun@ansi-manager ansible_info]$ ansible 172.16.1.181 -b -m fetch -a "src=/tmp/test1 dest=/tmp/kkk2/ flat=yes" -i ./hosts_key # 推荐,只拷贝一台
     4 # dest 路径无 / 结尾
     5 [yun@ansi-manager ansible_info]$ ansible 172.16.1.181 -b -m fetch -a "src=/tmp/test1 dest=/tmp/kkk flat=yes" -i ./hosts_key  # 推荐,只拷贝一台
     6 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m fetch -a "src=/tmp/test1 dest=/tmp/kkk flat=yes" -i ./hosts_key  # 不推荐,会产生覆盖
     7 ## 查看拷贝结果
     8 [yun@ansi-manager ansible_info]$ cat /tmp/kkk2/test1 
     9 111
    10 222
    11 333
    12 aaa
    13 bbb
    14 [yun@ansi-manager ansible_info]$ ll /tmp/kkk 
    15 -rw-rw-r-- 1 yun yun 20 Nov  2 11:25 /tmp/kkk
    16 [yun@ansi-manager ansible_info]$ cat /tmp/kkk   # 该文件没有 "11111"信息; 产生了覆盖效应
    17 111
    18 222
    19 333
    20 aaa
    21 bbb

    相关选项说明:

    src:源文件,当前仅支持文件,不支持目录

    dest:推送数据的目标路径,默认为:dest[路径]/hostname/src[路径]。参见上面示例

    flat: 默认 False。当为 yes/True 时,那么拷贝效果类似于本地的 copy。

    template 模板使用

    该模块功能类似于 copy 模块,但 copy 模块不支持变量,不支持模板。

    template 模块支持变量,支持 Jinja 模板。因此如果生成中的配置文件涉及变量,那么请使用 template 模块。

    涉及到 playbook、变量和 Jinja ,这些在后面的文章会有详解。

     1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
     2 [yun@ansi-manager ansible_info]$ ansible-doc template 
     3 # 由于我们使用的是 yun 普通用户
     4 # 因此有时需要使用 -b 选择进行提权
     5 # palybook
     6 [yun@ansi-manager ansible_info]$ pwd
     7 /app/ansible_info
     8 [yun@ansi-manager ansible_info]$ ll
     9 total 16
    10 drwxrwxr-x 2 yun yun  35 Oct 11 11:23 file
    11 -rw-rw-r-- 1 yun yun 226 Oct  8 16:07 hosts_key
    12 -rw-rw-r-- 1 yun yun 304 Oct 11 11:40 test_template.yml
    13 [yun@ansi-manager ansible_info]$ ll file/  # 涉及的文件
    14 total 4
    15 -rw-rw-r-- 1 yun yun 175 Oct 11 11:23 test_template.conf.j2
    16 [yun@ansi-manager ansible_info]$ cat file/test_template.conf.j2 
    17 # facts 变量
    18 dns_info={{ ansible_dns['nameservers'][0] }}
    19 mem_total={{ ansible_memtotal_mb }}
    20 # 自定义变量
    21 listen_port={{ listen_port }}
    22 access_addr={{ access_addr }}
    23 
    24 [yun@ansi-manager ansible_info]$ 
    25 [yun@ansi-manager ansible_info]$ cat test_template.yml  # 涉及的 playbook
    26 ---
    27 # template 示例
    28 - hosts: proxyservers
    29   vars:
    30     - listen_port: 8080
    31     - access_addr: zhangblog.com
    32 
    33   tasks:
    34     - name: "template conf"
    35       template:
    36         src: ./file/test_template.conf.j2
    37         dest: /tmp/test_template.conf
    38         owner: root
    39         group: yun
    40         mode: '0600'
    41 [yun@ansi-manager ansible_info]$ ansible-playbook -b -i ./hosts_key test_template.yml  # 执行

    目标机器查看

    1 [root@ansi-haproxy01 tmp]# pwd
    2 /tmp
    3 [root@ansi-haproxy01 tmp]# cat test_template.conf 
    4 # facts 变量
    5 dns_info=223.5.5.5
    6 mem_total=1821
    7 # 自定义变量
    8 listen_port=8080
    9 access_addr=zhangblog.com

    相关选项说明:

    src:源文件「可以是绝对路径或相对路径」

    dest:推送数据的目标路径或目标文件

    owner:指定远端文件的属主

    group:指定远端文件的属组

    mode:指定远端文件的权限

    backup:如果推送的目标文件存在且与源文件内容不同,那么会对目标文件进行备份

    file 文件配置模块

    在受控机创建文件或目录,或修改属性信息「如:属主、属组、权限」

     1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
     2 [yun@ansi-manager ansible_info]$ ansible-doc file 
     3 # 由于我们使用的是 yun 普通用户
     4 # 因此有时需要使用 -b 选择进行提权
     5 ## 在受控机改变目标文件的属性【该文件是已存在的】
     6 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "path=/tmp/yum_test.sh owner=yun group=yun mode=0600" -i ./hosts_key 
     7 ## 在受控机创建软连接
     8 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "src=/tmp/yum_test.sh dest=/tmp/yum_link.sh owner=yun group=yun state=link" -i ./hosts_key
     9 ## 在受控机创建硬链接
    10 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "src=/tmp/yum_test.sh dest=/tmp/yum_hard.sh owner=yun group=root state=hard" -i ./hosts_key
    11 ## 在受控机,如果目标文件不存在则创建
    12 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "path=/tmp/dest_file owner=yun group=yun state=touch" -i ./hosts_key
    13 ## 在控制机,如果目标目录不存在则创建「可创建多级目录」
    14 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "path=/tmp/desc_dir/aaa/bbb owner=yun group=root mode=700 state=directory" -i ./hosts_key
    15 ## 在控制机,改变目标目录和目录下所有目录或文件的属性信息「递归修改」
    16 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "path=/tmp/desc_dir owner=yun group=zhang mode=766 state=directory recurse=yes" -i ./hosts_key
    17 ## 在受控机,如果目标文件或目录存在,则删除「慎用!!!」
    18 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m file -a "path=/tmp/desc_dir state=absent " -i ./hosts_key

    相关选项说明:

    path:指定目标文件或目录

    owner:指定目标文件的属主

    group:指定目标文件的属组

    mode:指定目标文件的权限

    state:状态说明

        file:默认值,指定文件

        link:创建软连接

        hard:创建硬链接

        touch:如果文件不存在则创建

        directory:如果目录不存在则创建

        absent:如果目标文件或目录存在,则删除「慎用!!!」

    recurse:递归授权

    lineinfile 行编辑模块

    此模块确保文件中有特定的行,或者使用反向引用的正则表达式替换现有的行。当您只想更改文件中的一行时,这非常有用。

    如果您想要更改多个相似的行,请查看[replace]模块。如果你想要插入/更新/删除文件中的一个行块,请查看[blockinfile]模块。对于其他情况,请参见[copy]或[template]模块。

    数据文件准备

     1 [yun@ansi-manager tmp]$ cat /tmp/lineinfile_test 
     2 #     disabled - No SELinux policy is loaded.
     3 SELINUX=disabled1
     4 #     disabled - No SELinux policy is loaded.
     5 SELINUX=disabled2
     6 #     disabled - No SELinux policy is loaded.
     7 SELINUX=disabled3
     8 # SELINUXTYPE= can take one of three two values:
     9 
    10 # httpd listen port
    11 Listen 80
    1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
    2 [yun@ansi-manager ansible_info]$ ansible-doc lineinfile 
    3 # 由于我们使用的是 yun 普通用户
    4 # 因此有时需要使用 -b 选择进行提权

    行插入

     1 # 如果文件中没有 line 中的字符串,那么就追加在文件末尾;有则不作任何操作。
     2 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m lineinfile -a "path=/tmp/lineinfile_test line='# who are you?'" -i ./hosts_key
     3 # 首先保证line 中的字符串在文件中没有,如果有则不会添加
     4 # 其次会使用insertafter中的正则规则进行正则匹配,匹配成功则在最后一次匹配行后面插入line,如果没匹配成功则在文件末尾插入
     5 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m lineinfile -a "path=/tmp/lineinfile_test insertafter='SELINUX' line='insertafter test1'" -i ./hosts_key
     6 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m lineinfile -a "path=/tmp/lineinfile_test insertafter='SELINUXXX' line='insertafter test2'" -i ./hosts_key
     7 # 首先保证line 中的字符串在文件中没有,如果有则不会添加
     8 # 其次会使用insertbefore中的正则规则进行正则匹配,匹配成功则在最后一次匹配行前面插入line,如果没匹配成功则在文件末尾插入
     9 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m lineinfile -a "path=/tmp/lineinfile_test insertbefore='SELINUX' line='insertbefore test1'" -i ./hosts_key
    10 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m lineinfile -a "path=/tmp/lineinfile_test insertbefore='SELINUXXX' line='insertbefore test2'" -i ./hosts_key

    行替换

    1 # state=present时,如果多次匹配,那么最后一次匹配会被修改;如果没有匹配成功则在文件末尾追加,不管line是否存在。
    2 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m lineinfile -a "path=/tmp/lineinfile_test regexp='^SELINUX=' line='SELINUX=enforcing'" -i ./hosts_key
    3 # state=present时,如果多次匹配,那么最后一次匹配会被修改;如果没有匹配成功则文件保持不变,使用backrefs=yes。
    4 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m lineinfile -a "path=/tmp/lineinfile_test regexp='^ELINUX=' line='SELINUX=enforcing' backrefs=yes" -i ./hosts_key

    行删除

    1 # state=absent时,如果多次匹配,那么每一次匹配都会删除匹配行
    2 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m lineinfile -a "path=/tmp/lineinfile_test regexp='^SELINUX=' state=absent" -i ./hosts_key
    3 # 根据line匹配,如果匹配则删除匹配行
    4 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m lineinfile -a "path=/tmp/lineinfile_test line='# httpd listen port' state=absent" -i ./hosts_key

    相关选项说明:

    path:要修改的文件。

    line:与 state=present 配合使用;在文件中要插入或者替换的行。

    state:状态说明

        present:添加或修改,默认值

        absent:删除

    backrefs:与 state=present 配合使用;如果设置了 line 可以包含反向引用(位置和命名),当‘regexp’匹配,就会填充反向引用。

        这个参数稍微改变了模块的操作;’insertbefore’ 和 ‘insertafter’ 将被忽略,如果 ‘regexp’ 与文件中的任何地方不匹配,文件将保持不变

    regexp:对文件的每行进行正则匹配;对于 state=present 只有最后的一次行匹配会被替换;对于 state=absent 只要匹配就会删除该行。

    backup:对源文件备份。默认:False

    create:与 state=present 配合使用;如果不存在则创建文件。默认:False

    insertafter:与 state=present 配合使用;在匹配行后插入。使用正则表达式,在指定正则表达式的最后一次匹配之后插入该行。如果需要第一个匹配,则使用(firstmatch=yes)。

        如果没有匹配成功,那么会在文件末尾处插入。优先级低于 regexp。

    insertbefore:与 state=present 配合使用;在匹配行前插入。使用正则表达式,在指定正则表达式的最后一次匹配之前插入该行。如果需要第一个匹配,则使用(firstmatch=yes)。

        如果没有匹配成功,那么会在文件末尾处插入。优先级低于 regexp。

    firstmatch:与 insertafter 或 insertbefore 配合使用;在 insertafter 或 insertbefore 的首次正则匹配。默认:False

    owner:指定远端文件的属主

    group:指定远端文件的属组

    mode:指定远端文件的权限

    blockinfile 多行编辑模块

    该模块可以帮助我们在指定的文件中插入”一段文本”,这段文本是被标记过的。

    换句话说就是,我们在这段文本上做了记号,以便在以后的操作中可以通过”标记”找到这段文本,然后修改或者删除它

    1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
    2 [yun@ansi-manager ansible_info]$ ansible-doc blockinfile
    3 # 由于我们使用的是 yun 普通用户
    4 # 因此有时需要使用 -b 选择进行提权

    对不存在的文件进行——多行插入与修改

     1 # /tmp/blockinfile_test 文件是不存在的,因此使用了create选项
     2 # 插入/修改  如果没有则插入,如果之前有信息则修改
     3 ##### 这里之前没有,则是创建文件并【插入】信息
     4 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m blockinfile -a 'path=/tmp/blockinfile_test block="Match User ansible-agent
    PasswordAuthentication no" create=yes' -i ./hosts_key
     5 [root@ansi-manager ansible_info]# cat /tmp/blockinfile_test  # 查看文件信息
     6 # BEGIN ANSIBLE MANAGED BLOCK
     7 Match User ansible-agent
     8 PasswordAuthentication no
     9 # END ANSIBLE MANAGED BLOCK
    10 ##### 文件已存在,mark标记已存在,这里是【修改】
    11 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m blockinfile -a 'path=/tmp/blockinfile_test block="iface eth0 inet static
        address 192.0.2.23
        netmask 255.255.255.0" create=yes' -i ./hosts_key
    12 [root@ansi-manager ansible_info]# cat /tmp/blockinfile_test  # 查看文件信息
    13 # BEGIN ANSIBLE MANAGED BLOCK
    14 iface eth0 inet static
    15     address 192.0.2.23
    16     netmask 255.255.255.0
    17 # END ANSIBLE MANAGED BLOCK

    对已存在的文件进行——多行插入与修改

     1 [root@ansi-manager ansible_info]# cat /tmp/blockinfile_test2  # 查看文件信息
     2 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
     3 <html>
     4 <head>
     5 <title>blockinfile info</title>
     6 </head>
     7 <body>
     8 <h1>welcome to here.</h1>
     9 </body></html>
    10 ##### 插入多行标记块信息  这里也使用了 insertafter 选项
    11 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m blockinfile -a 'path=/tmp/blockinfile_test2 marker="<!-- {mark} ANSIBLE MANAGED BLOCK -->" insertafter="<body>" block="<h1>Welcome to blockinfile</h1>
    <p>Last Login By you!</p>"' -i ./hosts_key
    12 [root@ansi-manager ansible_info]# cat /tmp/blockinfile_test2  # 查看文件信息
    13 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    14 <html>
    15 <head>
    16 <title>blockinfile info</title>
    17 </head>
    18 <body>
    19 <!-- BEGIN ANSIBLE MANAGED BLOCK -->
    20 <h1>Welcome to blockinfile</h1>
    21 <p>Last Login By you!</p>
    22 <!-- END ANSIBLE MANAGED BLOCK -->
    23 <h1>welcome to here.</h1>
    24 </body></html>
    25 ##### 删除标记块信息
    26 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m blockinfile -a 'path=/tmp/blockinfile_test2 marker="<!-- {mark} ANSIBLE MANAGED BLOCK -->" block=""' -i ./hosts_key
    27 [root@ansi-manager ansible_info]# cat /tmp/blockinfile_test2  # 查看文件信息
    28 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    29 <html>
    30 <head>
    31 <title>blockinfile info</title>
    32 </head>
    33 <body>
    34 <h1>welcome to here.</h1>
    35 </body></html>

    相关选项说明:

    path:要修改的文件。

    block:要插入标记行内的文本。如果该选项缺失或是一个空字符串,该块将被删除,就像 “state” 被指定为 “absent” 。(别名:content)

    state:状态说明

        present:添加或修改,默认值

        absent:删除

    create:文件不存在则创建。默认:False

    backup:对源文件备份。默认:False

    insertafter:在匹配行后插入。使用正则表达式,在指定正则表达式的最后一次匹配之后插入该block。

        如果没有匹配成功,那么会在文件末尾处插入。

    insertbefore:在匹配行前插入。使用正则表达式,在指定正则表达式的最后一次匹配之前插入该block。

        如果没有匹配成功,那么会在文件末尾处插入。

    marker:标记线模板。’{mark}’ 将被替换为 ‘in marker_begin’ 的值【默认:BEGIN】和 ‘marker_end’ 的值【默认:END】

    marker_begin:开始的标记变量信息。默认:BEGIN

    marker_end:结尾的标记变量信息。默认:END

    owner:指定远端文件/目录的属主

    group:指定远端文件/目录的属组

    mode:指定远端文件/目录的权限

    ini_file INI格式配置模块

    在一个ini的文件中管理(添加、删除、更改)单独的配置,而不必使用[template]或[assemble]来管理整个文件。添加不存在的section。

    1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
    2 [yun@ansi-manager ansible_info]$ ansible-doc ini_file
    3 # 由于我们使用的是 yun 普通用户
    4 # 因此有时需要使用 -b 选择进行提权

    添加与修改

    1 # 第一次执行,如果文件不存在,默认会创建  添加 section 和 option 信息
    2 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m ini_file -a "path=/tmp/test.ini section=drinks option=username value=bobe mode='0644'" -i ./hosts_key
    3 # 修改 option 信息
    4 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m ini_file -a "path=/tmp/test.ini section=drinks option=username value=alice" -i ./hosts_key
    5 # 添加另外一个section信息
    6 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m ini_file -a "path=/tmp/test.ini section=base_info option=address value='BeiJing'" -i ./hosts_key
    7 # 添加一个option信息,还是放在 drinks 这个section下
    8 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m ini_file -a "path=/tmp/test.ini section=drinks option=password value=123456" -i ./hosts_key

    删除

    1 # 删除整个section, 删除drinks这个section
    2 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m ini_file -a "path=/tmp/test.ini section=drinks state=absent" -i ./hosts_key
    3 # 删除指定section下的option
    4 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m ini_file -a "path=/tmp/test.ini section=base_info option=address state=absent" -i ./hosts_key

    相关选项说明:

    path:INI格式文件路径。如果没有则默认会创建。

    section:INI文件中的 section 名。当设置单个值时,如果是 ‘state=present’ 则会自动添加这个值。如果留空或设置为 ‘null’,’option’ 将放在第一个 ‘section’ 之前。

        如果配置格式不支持 section,也需要使用 “null”。

    option:如果设置(需要更改的 value),这是选项的名称。如果添加/删除整个“section”,可以省略。默认:null

    value:option 的值。删除 “option” 时可以省略。

    state:状态说明

        present:添加或修改,默认值

        absent:删除

    backup:对源文件备份。默认:False

    create:如果不存在则创建文件。默认:True

    owner:指定远端文件的属主

    group:指定远端文件的属组

    mode:指定远端文件的权限

    no_extra_spaces:在 = 符号前后不插入空格。默认:False

    replace 多行替换模块

    对文件所匹配的内容进行替换/删除。

    数据文件准备

     1 [yun@ansi-manager ~]$ cat /tmp/replace_test 
     2 172.16.1.181 test1.zhangblog.com
     3 172.16.1.182 test2.zhangblog.org
     4 172.16.1.183 test3.zhangblog.net
     5 
     6 # httpd listen port
     7 Listen 80
     8 ServerRoot "/etc/httpd"
     9 User apache
    10 Group apache
     1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
     2 [yun@ansi-manager ansible_info]$ ansible-doc replace
     3 # 由于我们使用的是 yun 普通用户
     4 # 因此有时需要使用 -b 选择进行提权
     5 # 将regexp正则匹配到的行,替换为replace的内容;且这里使用了反向引用。
     6 [yun@ansi-manager ansible_info]$ ansible  manageservers -b -m replace -a "path=/tmp/replace_test regexp='(s+)testd+.zhangblog.(w+)?$' replace='1new.host.name.2'" -i ./hosts_key
     7 # 将 after 之后的每行都替换为 replace 中的内容
     8 [yun@ansi-manager ansible_info]$ ansible  manageservers -b -m replace -a "path=/tmp/replace_test after='# httpd listen port' regexp='^(.+)$' replace='after replace'" -i ./hosts_key
     9 # 如果 after没有匹配完一行,那么 after匹配之后未匹配的该行内容也会替换为replace 中的内容
    10 [yun@ansi-manager ansible_info]$ ansible  manageservers -b -m replace -a "path=/tmp/replace_test after='# httpd listen' regexp='^(.+)$' replace='# after replace'" -i ./hosts_key
    11 # 将 before 之前的每行都替换为 replace 中的内容
    12 [yun@ansi-manager ansible_info]$ ansible  manageservers -b -m replace -a "path=/tmp/replace_test before='listen port' regexp='^(.+)$' replace='before replace'" -i ./hosts_key
    13 # 如果 before没有匹配完一行,那么 before匹配之前未匹配的该行内容也会替换为replace 中的内容
    14 [yun@ansi-manager ansible_info]$ ansible  manageservers -b -m replace -a "path=/tmp/replace_test before='listen port' regexp='^(.+)$' replace='before replace'" -i ./hosts_key
    15 # 删除匹配内容,行数不会改变。如果整行匹配,则最终为空行。
    16 [yun@ansi-manager ansible_info]$ ansible  manageservers -b -m replace -a "path=/tmp/replace_test regexp='zhangblog'" -i ./hosts_key
    17 [yun@ansi-manager ansible_info]$ ansible  manageservers -b -m replace -a "path=/tmp/replace_test regexp='.*test.*'" -i ./hosts_key

    相关选项说明:

    path:要操作的文件路径。

    after:如果指定,只有after匹配之后的内容将被替换/删除。可以与before组合使用。after可能匹配一行也可能匹配一行的部分;且不支持正则匹配。

    before:如果指定,只有before匹配之前的内容将被替换/删除。可以与after组合使用。before可能匹配一行也可能匹配一行的部分;不支持正则匹配。

    regexp:要在文件内容中查找的正则表达式。

    replace:替换regexp匹配项的字符串。可能包含反向引用,如果regexp匹配,将使用regexp捕获组展开这些反向引用。如果没有设置,则完全删除匹配项。

        反向引用可以像 ‘1’ 那样含糊地使用,也可以像 ‘g<1>’ 那样显式地使用。

    backup:对源文件备份。默认:False

    encoding:用于读写文件的字符编码。默认:utf-8

    owner:指定远端文件的属主

    group:指定远端文件的属组

    mode:指定远端文件的权限

    sysctl 修改内核参数模块

    这个模块操作 sysctl 条目,并在更改它们之后可选地执行 /sbin/sysctl -p 。

    1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
    2 [yun@ansi-manager ansible_info]$ ansible-doc sysctl
    3 # 由于我们使用的是 yun 普通用户
    4 # 因此有时需要使用 -b 选择进行提权
    5 # 会修改 /etc/sysctl.conf 文件并执行 /sbin/sysctl -p 使其生效
    6 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m sysctl -a 'name=net.ipv4.ip_forward value=1' -i ./hosts_key
    7 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m sysctl -a 'name=vm.swappiness value=5' -i ./hosts_key

    相关选项说明:

    name:内核参数变量名。(别名:key)

    value:sysctl键的期望值。(别名:val)

    reload:当为 yes 时,如果 sysctl_file 文件被修改,那么会执行 /sbin/sysctl -p,使修改的参数生效。当为 no 时,则不重载 sysctl ,尽管 sysctl_file 已被修改。

    state:状态说明

        present:添加或修改,默认值

        absent:删除

    sysctl_file:指定 sysctl.conf 文件的绝对路径。默认:/etc/sysctl.conf

    sysctl_set:使用sysctl命令验证令牌值,必要时使用 -w 进行设置。默认:no

    ignoreerrors:使用此选项可忽略关于未知键的错误。默认:no

    get_url 文件下载模块

    通过 HTTP,HTTPS或 FTP 下载一个文件。

    1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
    2 [yun@ansi-manager ansible_info]$ ansible-doc get_url 
    3 ## 下载一个文件
    4 [yun@ansi-manager ansible_info]$ ansible proxyservers -m get_url -a "url='http://www.zhangblog.com/uploads/jvm/jvm-01-01.png' dest=/tmp/ mode=0640" -i ./hosts_key
    5 ## 下载前会比对校验和,如果不匹配则不下载
    6 [yun@ansi-manager ansible_info]$ ansible proxyservers -m get_url -a "url='http://www.zhangblog.com/uploads/jvm/jvm-01-01.png' dest=/tmp/jvm-001.png checksum='md5:9af3f6066ea46ea81c0b3c9d719dbce0'" -i ./hosts_key

    相关选项说明:

    mode:指定目标文件的权限

    url:指定文件来源「支持 HTTP,HTTPS 和 FTP」

    dest:指定目标存放的目录或文件

    checksum:校验和「支持 sha256 和 md5」

    timeout:请求超时时间,默认 10 秒。

    owner:指定远端文件的属主

    group:指定远端文件的属组

    mode:指定远端文件的权限

    backup:源文件备份

    service、systemd 服务管理模块

    如果在 CentOS 6 及以下版本,优先使用 service 。

    如果在 CentOS 7 及以上版本,优先使用 systemd 。

    这里考虑到我们使用的 CentOS 7,因此使用的是 systemd 。至于 service 请自行查看文档。

     1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
     2 [yun@ansi-manager ansible_info]$ ansible-doc service 
     3 [yun@ansi-manager ansible_info]$ ansible-doc systemd 
     4 # 由于我们使用的是 yun 普通用户
     5 # 因此有时需要使用 -b 选择进行提权
     6 ## 启动 httpd 服务,并且加入开机自启动
     7 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m systemd -a "name=httpd state=started enabled=yes" -i ./hosts_key
     8 ## 重启 httpd 服务,并且重新加载 /usr/lib/systemd/system/httpd.service 服务配置文件,且加入开机自启动
     9 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m systemd -a "name=httpd state=restarted daemon_reload=yes enabled=yes" -i ./hosts_key
    10 ## 停止 httpd 服务,并且不加入开机自启动
    11 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m systemd -a "name=httpd state=stopped enabled=no" -i ./hosts_key

    相关选项说明:

    name:服务名称

    state:服务状态

        started:启动服务

        stopped:停止服务

        reloaded:重加载服务

        restarted:重启动服务

    enabled:是否加入开机自启动「yes 加入, no 不加入, 默认 null」

    daemon_reload:当我们修改了服务管理配置文件,是否重加载其配置「yes 重加载服务配置文件, no 不加载,默认值」

    group 组模块

    创建或删除用户组

     1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
     2 [yun@ansi-manager ansible_info]$ ansible-doc group 
     3 # 由于我们使用的是 yun 普通用户
     4 # 因此有时需要使用 -b 选择进行提权
     5 ## 创建 test 组,并指定组ID
     6 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m group -a " name=test gid=9001" -i ./hosts_key
     7 ## 创建 testsystem 组,并指定为系统组
     8 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m group -a "name=testsystem system=true" -i ./hosts_key
     9 ## 删除 testsystem 组
    10 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m group -a "name=testsystem state=absent" -i ./hosts_key

    相关选项说明:

    gid:指定组ID,默认 null

    name:指定组名称

    state:组状态

        present:创建组,默认

        absent:删除组

    system:是否为系统组

        true:是系统组

        false:不是系统组

    user 用户模块

    创建或删除用户

    1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
    2 [yun@ansi-manager ansible_info]$ ansible-doc user 
    3 # 由于我们使用的是 yun 普通用户
    4 # 因此有时需要使用 -b 选择进行提权

    1、创建用户,指定 UID,指定附加组,不创建家目录,不可以登录

    [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m user -a "name=zhangtest uid=1005 groups=zhang,yun create_home=no shell=/sbin/nologin" -i ./hosts_key

    受控机查看信息

    1 [yun@ansi-haproxy02 ~]$ id zhangtest
    2 uid=1005(zhangtest) gid=1005(zhangtest) groups=1005(zhangtest),1000(zhang),1050(yun)
    3 [yun@ansi-haproxy02 ~]$ tail -n1 /etc/passwd
    4 zhangtest:x:1005:1005::/home/zhangtest:/sbin/nologin  # /home/zhangtest 该目录不存在

    2、删除用户,但不删除用户的家目录

    [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m user -a "name=zhangtest state=absent" -i ./hosts_key

    3、为用户创建密码或SSH key 秘钥

    [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m user -a "name=zhangtest2 generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa" -i ./hosts_key

    4、为用户创建密码

    1 # 得到密码串
    2 [yun@ansi-manager ansible_info]$ ansible localhost -m debug -a "msg={{ '123456' | password_hash('sha512', 'salt') }}"
    3 localhost | SUCCESS => {
    4     "msg": "$6$salt$MktMKPZJ6t59GfxcJU20DwcwQzfMvOlHFVZiOVD71w.igcOo1R7vBYR65JquIQ/7siC7VRpmteKvZmfSkNc69."
    5 }
    6 ## 注意 -a '' 是单引号,而不是双引号。如果使用双引号,特殊字符会被解析
    7 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m user -a 'name=zhangtest2 password=$6$salt$MktMKPZJ6t59GfxcJU20DwcwQzfMvOlHFVZiOVD71w.igcOo1R7vBYR65JquIQ/7siC7VRpmteKvZmfSkNc69.' -i ./hosts_key

    相关选项说明:

    name:用户名称

    state:用户状态

        present:默认值,创建用户

        absent:删除用户

    password:用户密码,默认:null

    shell:设置用户的shell

    uid:指定用户 UID

    group:设置用户主组,默认:null

    groups:设置用户附加组,默认:null

    system:如果为 yes 则创建系统用户,默认:false

    home:设置用户家目录

    create_home:是否创建家目录,默认:true,如果不创建为:no

    comment:用户描述,默认:null

    expires:用户账号失效日期,默认:null

    update_password:更新密码

        always:如果密码不同,则更新,默认值

        on_create:只有新建用户时使用

    remove:只有在 state=absent 时生效,作用:删除用户家目录

    generate_ssh_key:是否生成SSH key 密钥对,默认:false

    ssh_key_bits:设置 SSH key 字节长度,默认:有 ssh-keygen 设置

    ssh_key_comment:设置 SSH key 的描述,默认为:$HOSTNAME

    ssh_key_file:指定 SSH key 的文件名,默认:null 【即为:.ssh/id_rsa】

    ssh_key_passphrase:指定 SSH key 密码,如果不提供则没有密码,默认:null

    ssh_key_type:设置 SSH key 类型,默认:rsa

    cron 定时任务模块

    创建、注释或删除定时任务

    1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
    2 [yun@ansi-manager ansible_info]$ ansible-doc cron 
    3 # 由于我们使用的是 yun 普通用户
    4 # 因此有时需要使用 -b 选择进行提权
    1 ## 创建定时任务, name 为定时任务说明
    2 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m cron -a 'name="crond test" minute=0 hour="2,5" job="ls /tmp >/dev/null 2>&1"' -i ./hosts_key
    3 ## 注释指定定时任务,其中 name ,时间参数,和 job 都需要。
    4 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m cron -a 'name="crond test" minute=0 hour="2,5" job="ls /tmp >/dev/null 2>&1" disabled=true' -i ./hosts_key
    5 ## 删除定时任务
    6 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m cron -a 'name="crond test" state=absent' -i ./hosts_key

    相关选项说明:

    name:定时任务描述

    state:状态

        present:添加,默认值

        absent:删除

    user:指定哪个用户的定时任务会修改,默认是 root 用户,默认:null

    minute:哪个分钟执行 ( 0-59, *, */2, etc ),默认:*

    hour:哪个小时执行 ( 0-23, *, */2, etc ),默认 *

    day:每月的哪天执行 ( 1-31, *, */2, 等 ),默认:*

    month:哪个月执行 ( 1-12, *, */2, etc ),默认:*

    weekday:每周的哪天执行 ( 0-6 为 Sunday-Saturday, *, etc ),默认:*

    disabled:是否注释指定定时任务,默认:false

    job:定时任务要操作的具体信息

    mount 文件系统挂载模块

    文件系统的挂载与取消。

    1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
    2 [yun@ansi-manager ansible_info]$ ansible-doc mount 
    3 # 由于我们使用的是 yun 普通用户
    4 # 因此有时需要使用 -b 选择进行提权

    案例示例:

    在 ansi-manager 机器作为 NFS 的服务端,ansi-haproxy01、ansi-haproxy02 作为 NFS 的客户端。

    1、在所有机器安装 NFS 必要的包

    [yun@ansi-manager ansible_info]$ ansible manageservers,proxyservers -b -m yum -a "name=nfs-utils,rpcbind state=present" -i ./hosts_key

    2、NFS 服务端配置与启动

    1 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m copy -a 'content="/data   172.16.1.0/24(rw,sync,root_squash,all_squash)
    " dest=/etc/exports' -i ./hosts_key
    2 # 创建 /data 目录,属主、属组为 nfsnobody
    3 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m file -a "path=/data owner=nfsnobody group=nfsnobody state=directory" -i ./hosts_key
    4 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m systemd -a "name=rpcbind state=started enabled=yes" -i ./hosts_key
    5 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m systemd -a "name=nfs state=started enabled=yes" -i ./hosts_key
    6 ## 查看 Export list 信息
    7 [yun@ansi-manager ansible_info]$ ansible manageservers -b -m shell -a "showmount -e" -i ./hosts_key

    3、NFS 客户端操作

    1 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m systemd -a "name=rpcbind state=started enabled=yes" -i ./hosts_key
    2 ## 检查共享信息
    3 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m shell -a "showmount -e 172.16.1.180" -i ./hosts_key

    4、NFS 客户端挂载

    1 ## 不挂载设备,仅在 /etc/fstab 中写入挂载配置信息
    2 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m mount -a "src=172.16.1.180:/data path=/mnt fstype=nfs state=present backup=yes" -i ./hosts_key
    3 ## 挂载设备,并在 /etc/fstab 中写入挂载配置信息
    4 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m mount -a "src=172.16.1.180:/data path=/mnt fstype=nfs state=mounted" -i ./hosts_key
    5 ## 不卸载设备,仅在 /etc/fstab 中删除挂载配置信息
    6 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m mount -a "src=172.16.1.180:/data path=/mnt fstype=nfs state=unmounted" -i ./hosts_key
    7 ## 卸载设备,并在 /etc/fstab 中删除挂载配置信息
    8 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m mount -a "src=172.16.1.180:/data path=/mnt fstype=nfs state=absent" -i ./hosts_key

    相关选项说明:

    src:要挂在的设备/磁盘

    path:挂载点

    opts:挂载参数选项,如:ro,noauto;默认:null

    fstype:文件系统类型

    state:状态

        present:不挂载设备,仅在 /etc/fstab 中写入挂载配置信息

        mounted:挂载设备,并在 /etc/fstab 中写入挂载配置信息

        unmounted:不卸载设备,仅在 /etc/fstab 中删除挂载配置信息

        absent:卸载设备,并在 /etc/fstab 中删除挂载配置信息

    backup:对之前的文件备份

    debug 调试模块与 register 变量

    这里会使用 playbook 书写。具体的 playbook 详解,参见后面的文章。

    涉及到 playbook、变量和 Jinja ,这些在后面的文章会有详解。

     1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
     2 [yun@ansi-manager ansible_info]$ ansible-doc debug 
     3 # 由于我们使用的是 yun 普通用户
     4 # 因此有时需要使用 -b 选择进行提权
     5 # Ad-Hoc 方式
     6 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m debug  -i ./hosts_key 
     7 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m debug -a 'msg="print customized message"' -i ./hosts_key
     8 ##################################################
     9 # Playbooks 方式
    10 [yun@ansi-manager ansible_info]$ pwd
    11 /app/ansible_info
    12 [yun@ansi-manager ansible_info]$ ll
    13 total 24
    14 -rw-rw-r-- 1 yun yun  483 Aug 18 09:12 hosts_key
    15 -rw-rw-r-- 1 yun yun  245 Aug 18 21:55 test_debug_register.yml
    16 [yun@ansi-manager ansible_info]$ cat test_debug_register.yml 
    17 ---
    18 # 如何使用 debug 模块与 register 变量
    19 - hosts: proxyservers
    20 
    21   tasks:
    22     - name: "get host port info"
    23       shell: netstat -lntp
    24       register: host_port
    25 
    26     - name: "print host port"
    27       debug:
    28         #msg: "{{ host_port }}"   # 输出全部信息
    29         #msg: "{{ host_port.cmd }}"   # 引用方式一
    30         msg: "{{ host_port['stdout_lines'] }}"  # 引用方式二
    31 
    32 [yun@ansi-manager ansible_info]$ ansible-playbook -b -i ./hosts_key test_debug_register.yml

    第一个 task 中,使用了 register 注册变量,名为 host_port ;当 shell 模块执行完毕后,会将数据放到该变量中。

    第二给 task 中,使用了 debug 模块,并从 host_port 中获取数据。

    assert 断言模块【了解】

    对自定义消息断言。

    涉及到 playbook、变量和 Jinja ,这些在后面的文章会有详解。

     1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
     2 [yun@ansi-manager ansible_info]$ ansible-doc assert 
     3 # 由于我们使用的是 yun 普通用户
     4 # 因此有时需要使用 -b 选择进行提权
     5 # Ad-Hoc 方式
     6 [yun@ansi-manager ansible_info]$ ansible proxyservers -m assert -a "that='2 == 3' success_msg=ok fail_msg=fail" -i ./hosts_key # 断言失败
     7 [yun@ansi-manager ansible_info]$ ansible proxyservers -m assert -a "that='2 <= 3' success_msg=ok fail_msg=fail" -i ./hosts_key # 断言成功
     8 [yun@ansi-manager ansible_info]$ ansible proxyservers -m assert -a "that='2 < 3' success_msg=ok fail_msg=fail" -i ./hosts_key  # 断言成功
     9 [yun@ansi-manager ansible_info]$ ansible proxyservers -m assert -a "that='2 < 3 and 4 == 4' success_msg=ok fail_msg=fail quiet=yes" -i ./hosts_key # 断言成功
    10 [yun@ansi-manager ansible_info]$ ansible proxyservers -m assert -a "that='2 < 3 and 4 > 4' success_msg=ok fail_msg=fail quiet=yes" -i ./hosts_key # 断言失败
    11 [yun@ansi-manager ansible_info]$ ansible proxyservers -m assert -a "that='3 < 3 or 4 == 4' success_msg=ok fail_msg=fail quiet=yes" -i ./hosts_key # 断言成功
    12 ##################################################
    13 # Playbooks 方式
    14 [yun@ansi-manager ansible_info]$ pwd
    15 /app/ansible_info
    16 [yun@ansi-manager ansible_info]$ ll
    17 total 12
    18 -rw-rw-r-- 1 yun yun 226 Oct  8 16:07 hosts_key
    19 -rw-rw-r-- 1 yun yun 902 Oct 11 10:57 test_assert.yml
    20 [yun@ansi-manager ansible_info]$ cat test_assert.yml  # playbook 信息
    21 ---
    22 # assert 示例
    23 - hosts: proxyservers
    24   # 使用如下变量,分别测试下
    25   vars:
    26     #- my_param: 20
    27     #- my_param: -2
    28     - my_param: 200
    29 
    30   tasks:
    31     - name: "assert example 1"
    32       assert:
    33         # ansible_os_family 为 facts 中的变量信息
    34         that:
    35           - ansible_os_family == "RedHat"
    36         success_msg: "success info"
    37         fail_msg: "fail info"
    38 
    39     - name: "assert example 2"
    40       assert:
    41         # that 下面的列表,为 && 关系
    42         that:
    43           - my_param >= 0
    44           - my_param <= 100
    45         fail_msg: "'my_param' must be between 0 and 100"
    46         success_msg: "success info"
    47       # 是否忽略该 task 的错误
    48       ignore_errors: True
    49 
    50     - name: "assert example 3"
    51       assert:
    52         that:
    53           - my_param <= 10 or my_param >= 100
    54         fail_msg: "'my_param' must be <= 10 or >= 100"
    55         success_msg: "success info"
    56 
    57 [yun@ansi-manager ansible_info]$ ansible-playbook -b -i ./hosts_key test_assert.yml  # 执行

    相关选项说明:

    that:列表字符串表达式

    success_msg:当断言成功时输出的信息

    fail_msg:别名 msg,当断言失败时输出的信息

    quiet:默认 False,设置为 yes 避免冗长输出

    selinux 安全模块

    配置 SELinux 。

    1 # 查看 yum 模块方法「可优先查看 EXAMPLES 信息的使用案例,知晓如何使用」
    2 [yun@ansi-manager ansible_info]$ ansible-doc selinux 
    3 # 由于我们使用的是 yun 普通用户
    4 # 因此有时需要使用 -b 选择进行提权
    5 ## 关闭 selinux
    6 [yun@ansi-manager ansible_info]$ ansible proxyservers -b -m selinux -a "state=disabled" -i ./hosts_key

    相关选项说明:

    state:状态

        disabled:不可用

        enforcing:强制执行

        permissive:会提醒


    ———END———
    如果觉得不错就关注下呗 (-^O^-) !

  • 相关阅读:
    充满了艰难的造题之幼儿园测试【历史考试】
    【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器
    windows下nginx的安装使用及解决80端口被占用nginx不能启动的问题
    使用hMailServer搭建免费邮件服务器(亲测可用)
    $.ajax()方法详解
    详细解读Jquery各Ajax函数:$.get(),$.post(),$.ajax(),$.getJSON()
    $.ajax()调用.cs里的方法实现ajax操作示例
    Asp.Net URL重写的具体实现(通过URLRewriter.dll)
    数据图
    C#解析JSON字符串总结
  • 原文地址:https://www.cnblogs.com/zhanglianghhh/p/12525566.html
Copyright © 2020-2023  润新知