• Ansible自动化运维


             前言:  Ansible是近年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误。

    目录

    🍶案例环境

    🧊Ansible安装

    🧊Ansible配置

    🧊Ansible命令

    🍇ansible

    🍇Ansible-doc

    🍇Ansible-playbook

    🍇Ansible-console

    🧊Ansible模块

    🍣command模块

    🍣Shell模块

    🍣copy模块

    🍣hostname模块

    🍣yum模块

    🍣service模块

    🍣user模块

    🧊playbook配置文件

    🧊触发器

    🧊角色


    博客主页——大虾好吃吗

    👍点赞🍊关注📝留言📁收藏

    各位大佬不要再卷了,探讨一下学习方向可好。动动发财的小手,在评论区留下你们的建议。

            Ansible特点如下:

    1. Ansible基于Python开发,运维工程师对其二次开发相对较容易。

    2. Ansible丰富的内置模块,基本可以满足一切需求。

    3. 管理模式非常简单,一条命令可以影响上千台机器。

    4. 无客户端模式 ,底层通过SSH通信。

    案例环境

            Ansible可以使上千台机器受到影响,本次案例环境中只添加连台管理操作即可。

    Ansible安装

    🍤通过YUM安装Ansible,本次通过配置网络仓库。配置参考文章配置网络源仓库

    1. [root@ansible ~]# yum -y install ansible //yum安装Ansible
    2. [root@ansible ~]# ansible --version //查看版本,验证安装结果
    3. ansible 2.9.27
    4. config file = /etc/ansible/ansible.cfg
    5. configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
    6. ansible python module location = /usr/lib/python2.7/site-packages/ansible
    7. executable location = /usr/bin/ansible
    8. python version = 2.7.5 (default, Nov 6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]

    🍤创建SSH免交互登录

            Ansible通过SSH对设备进行管理,而SSH包含两种认证方式:一种是通过密码认证,另一种是通过密钥对认证。前者需要和系统交互,而后者是免交互登录。

    1. [root@ansible ~]# ssh-keygen -t rsa //生成密钥对
    2. Generating public/private rsa key pair.
    3. Enter file in which to save the key (/root/.ssh/id_rsa): //密钥对存放路径
    4. Created directory '/root/.ssh'.
    5. Enter passphrase (empty for no passphrase): //输入私钥密码,直接按Enter表示无密码
    6. Enter same passphrase again:
    7. Your identification has been saved in /root/.ssh/id_rsa.
    8. Your public key has been saved in /root/.ssh/id_rsa.pub.
    9. The key fingerprint is:
    10. 3e:8a:bc:b7:70:9b:f4:a1:21:3f:77:af:54:20:a7:7a root@ansible
    11. The key's randomart image is:
    12. +--[ RSA 2048]----+
    13. |                 |
    14. |                 |
    15. |       . o     |
    16. |         + .     |
    17. |       S   .   |
    18. |       o   .     |
    19. |   o = E .     |
    20. |   . BoO.+.     |
    21. |   +oB+...o.   |
    22. +-----------------+
    23. [root@ansible ~]# ssh-copy-id root@192.168.1.20 //通过scp命令复制公钥到远端IP
    24. [root@ansible ~]# ssh-copy-id root@192.168.1.30
    25. [root@ansible ~]# ssh 192.168.1.20 //测试查看可以免密码登录
    26. Last login: Tue Aug 9 20:09:08 2022
    27. [root@localhost ~]# exit //查看后退出SSh登录
    28. logout
    29. Connection to 192.168.1.20 closed.

            经过以上操作,对于Ansible的部署就已经完成了,下面就是通过Ansible对设备进行管理了。

    Ansible配置

            inventory是Ansible管理主机信息的配置文件,相对于系统Hosts文件的功能,默认存放在/etc/ansible/hosts。默认情况下,通过访问22端口(SSH)来管理设备,若目标使用非默认的SSH端口,需要在主机IP或域名后添加冒号加端口号标明,以行为单位分隔配置。hosts文件也还支持通配符。

            可以将同一个主机同时归置在多个不同的组中。

    1. [root@ansible ~]# vim /etc/ansible/hosts
    2. ......//配置文件内添加下面配置
    3. [web]
    4. 192.168.1.20
    5. 192.168.1.30

            🍤配置完成后,可以针对hosts定义的组进行远程操作,也可以针对组中指定的某一个主机操作。下面介绍如何针对特定的服务器操作。

    • 只对web组中192.168.1.20主机操作。通过--limit参数限定主机的变更。
    1. [root@ansible ~]# ansible web -m command -a "systemctl status httpd" --limit "192.168.1.20"
    2. 192.168.1.20 | FAILED | rc=4 >> //因为1.20主机没有安装httpd服务,所以可能会显示红色错误
    3. Unit httpd.service could not be found.non-zero return code

            因为没有安装httpd服务,可以用“ansible all -f 5 -m ping”测试是否成功。

    • 只对192.168.1.20主机操作。通过ip限定主机的变更。
    1. [root@ansible ~]# ansible 192.168.1.20 -m command -a "systemctl status httpd"
    2. 192.168.1.20 | FAILED | rc=4 >>
    3. Unit httpd.service could not be found.non-zero return code
    • 只对192.168.1.0网段主机操作。通过配置通配符限定主机的变更。
    1. [root@ansible ~]# ansible 192.168.1.* -m command -a "systemctl status httpd"
    2. 192.168.1.20 | FAILED | rc=4 >>
    3. Unit httpd.service could not be found.non-zero return code
    4. 192.168.1.30 | FAILED | rc=4 >>
    5. Unit httpd.service could not be found.non-zero return code

    Ansible命令

            Ansible的维护命令大多以Ansible开头,在中断输入ansible后连续按两次Tab键,会补全所有以ansible字母开头的命令。

    1. [root@ansible ~]# ansible
    2. ansible               ansible-doc           ansible-playbook-2
    3. ansible-2             ansible-doc-2         ansible-playbook-2.7
    4. ansible-2.7           ansible-doc-2.7       ansible-pull
    5. ansible-config       ansible-galaxy       ansible-pull-2
    6. ansible-connection   ansible-galaxy-2     ansible-pull-2.7
    7. ansible-console       ansible-galaxy-2.7   ansible-vault
    8. ansible-console-2     ansible-inventory     ansible-vault-2
    9. ansible-console-2.7   ansible-playbook     ansible-vault-2.7

    ansible

            ansible是生产环境中使用非常频繁的命令之一,主要在以下场景使用。

    1. 非固化需求。

    2. 临时一次性操作。

    3. 二次开发接口调用。

    🍤语法如下:

    ansible [options]

    🍤可用选项如下:

    -v(--verbose):输出详细的执行过程信息,可以得到执行过程所有信息。 ​

    -i PATH(-inventory=PATH):指定inventory信息,默认为/etc/ansible/hosts。

    ​-f NUM(--forks=NUM):并发线程数,默认为5个线程。 ​

    --private-key=PRIVATE_KEY_FILE:指定秘钥文件。 ​

    -m NAME,--module-name=NAME:指定执行使用的模块。 ​

    -M DIRECTORY(--module-path=DIRECTORY):指定模块存放路径,默认为/usr/share/ansible,也可以通过ANSIBLE_LIBRARY设定默认路径。 ​

    -a ARGUMENTS(--args=ARGUMENTS):指定模块参数。

    ​-u USERNAME(--user=USERNAME):指定远程主机以USERNAME运行命令。 ​

    -l subset(--limit=SUBSET):限制运行主机。 ​

    --list-hosts:列出符合条件的主机列表,不执行任何命令。

    🍤检查所有主机是否存活。命令如下:

            执行主机为192.168.1.20和192.168.1.30,SUCCESS表示命令执行成功。“=>{}”表示返回结果,“changed”:false表示没有对主机做出更改,“ping”:“pong”表示执行了ping命令的返回结果。

    1. [root@ansible ~]# ansible all -f 5 -m ping
    2. 192.168.1.30 | SUCCESS => {
    3.   "ansible_facts": {
    4.       "discovered_interpreter_python": "/usr/bin/python"
    5.   },
    6.   "changed": false,
    7.   "ping": "pong"
    8. }
    9. 192.168.1.20 | SUCCESS => {
    10.   "ansible_facts": {
    11.       "discovered_interpreter_python": "/usr/bin/python"
    12.   },
    13.   "changed": false,
    14.   "ping": "pong"
    15. }

    🍤列出web组所有的主机列表。命令如下:

            --list选项列出web组所有主机列表信息,web组中包括两台主机192.168.1.20和192.168.1.30。

    1. [root@ansible ~]# ansible web --list
    2. hosts (2):
    3.   192.168.1.20
    4.   192.168.1.30

    🍤批量显示web组中的磁盘使用空间。命令如下:

    1. [root@ansible ~]# ansible web -m command -a "df -hT"
    2. 192.168.1.20 | CHANGED | rc=0 >>
    3. 文件系统           类型     容量 已用 可用 已用% 挂载点
    4. /dev/mapper/cl-root xfs       17G 4.3G   13G   25% /
    5. devtmpfs           devtmpfs 473M     0 473M   0% /dev
    6. tmpfs               tmpfs     489M 144K 489M   1% /dev/shm
    7. tmpfs               tmpfs     489M 7.1M 482M   2% /run
    8. tmpfs               tmpfs     489M     0 489M   0% /sys/fs/cgroup
    9. /dev/sda1           xfs     1014M 173M 842M   18% /boot
    10. tmpfs               tmpfs     98M 8.0K   98M   1% /run/user/0
    11. /dev/sr0           iso9660   4.1G 4.1G     0 100% /run/media/root/CentOS 7 x86_64
    12. 192.168.1.30 | CHANGED | rc=0 >>
    13. 文件系统           类型     容量 已用 可用 已用% 挂载点
    14. /dev/mapper/cl-root xfs       17G 4.3G   13G   25% /
    15. devtmpfs           devtmpfs 473M     0 473M   0% /dev
    16. tmpfs               tmpfs     489M   88K 489M   1% /dev/shm
    17. tmpfs               tmpfs     489M 7.1M 482M   2% /run
    18. tmpfs               tmpfs     489M     0 489M   0% /sys/fs/cgroup
    19. /dev/sda1           xfs     1014M 173M 842M   18% /boot
    20. tmpfs               tmpfs     98M 8.0K   98M   1% /run/user/0
    21. /dev/sr0           iso9660   4.1G 4.1G     0 100% /run/media/root/CentOS 7 x86_64

            🍤 Ansible的返回结果非常友好,由三种颜色来表示执行结果。红色:表示执行过程有异常;橘黄色:表示命令执行后目标有状态变化;绿色:表示执行成功且没有对目标机器做修改。

    Ansible-doc

            Ansible-doc用来查询ansible模块文档的说明,类似于man命令,针对每个模块都有详细的用法说明及案例介绍。

    🍤语法如下:

    ansible-doc [otions] [module......]

    🍤列出支持的模块:

    [root@ansible ~]# ansible-doc -l                                 //按q退出

    查询ping模块的说明信息。

    [root@ansible ~]# ansible-doc ping

    Ansible-playbook

            Ansible-playbook是日常应用中使用频率最高的命令,类似于Linux中的sh或source命令,用来执行系列任务。playbook.yml文件需要体现编写好,建议指定playbook.yml的绝对路径。

    🍤使用方法如下:

    [root@ansible ~]# ansible-playbook playbook.yml

    Ansible-console

            Ansible-console是Ansible为用户提供的一款交互式工具,类似于windows的cmd以及Linux中的Shell。exit退出或者快捷键Ctrl+D或Ctrl+C。

    🍤命令如下(输入命令后会有一个浅色的字体出现):

    1. [root@ansible ~]# ansible-console
    2. Welcome to the ansible console.
    3. Type help or ? to list commands.
    4. root@all (2)[f:5]$ cd web
    5. root@web (2)[f:5]$ list
    6. 192.168.1.20
    7. 192.168.1.30

    Ansible模块

    command模块

            command模块在远程主机执行命令,不支持管道、重定向等Shell的特性。

    🍤常用参数如下:

    chdir:在远程主机上运行命令前要提前进入的目录。

    creates:在命令运行时创建一个文件,如果文件已经存在,则不执行创建命令。

    removes:在命令运行时移除一个文件,如果文件不存在,则不会执行移除任务。

    executeble:指明运行命令的shell程序。

    🍤在所有主机上运行“ls ./”命令,运行前切换到/home目录。命令如下:

    1. [root@ansible ~]# ansible all -m command -a "chdir=/home ls ./"
    2. 192.168.1.20 | CHANGED | rc=0 >>
    3. z3
    4. 192.168.1.30 | CHANGED | rc=0 >>
    5. z3

    Shell模块

            Shell模快在远程主机执行命令,相当于调用远程主机的Shell进程,然后在Shell下打开一个子Shell运行命令。和command模块的区别是它支持Shell特性,如管道、重定向等。

    1. [root@ansible ~]# ansible web -m shell -a 'echo "hello" >> /tmp/hello.txt'
    2. 192.168.1.20 | CHANGED | rc=0 >>
    3. 192.168.1.30 | CHANGED | rc=0 >>
    4. [root@ansible ~]# ssh 192.168.1.20 cat /tmp/hello.txt
    5. hello
    6. [root@ansible ~]# ssh 192.168.1.30 cat /tmp/hello.txt
    7. hello

    copy模块

            copy模块用于复制指定主机文件到远程主机的指定位置。

    🍤常见参数如下:

    dest:指出复制文件的目标目录位置,使用绝对路径。如果源是目录,则目标也要是目录,如果目标文件已存在,会覆盖原有内容。

    src:指出源文件的路径,可以使用相对路径和绝对路径,支持直接指定目录。如果源是目录,则目标也要是目录。

    mode:指出复制时,目标文件的权限,可选。

    owner:指出复制时,目标文件的属主,可选。

    group:指出复制时,目标文件的属组,可选。

    content:指出复制到目标主机上的内容,不能与src一起使用,相当于复制content致命的数据到目标文件中。

    1. [root@ansible ~]# ansible web -m copy -a "src=/etc/hosts dest=/tmp/ mode=777 owner=nobody group=root"
    2. 192.168.1.20 | CHANGED => {
    3.   "ansible_facts": {
    4.       "discovered_interpreter_python": "/usr/bin/python"
    5.   },
    6.   "changed": true,
    7.   "checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
    8.   "dest": "/tmp/hosts",
    9.   "gid": 0,
    10.   "group": "root",
    11.   "md5sum": "54fb6627dbaa37721048e4549db3224d",
    12.   "mode": "0777",
    13.   "owner": "nobody",
    14.   "size": 158,
    15.   "src": "/root/.ansible/tmp/ansible-tmp-1660217157.43-4832-6734297780200/source",
    16.   "state": "file",
    17.   "uid": 99
    18. }
    19. 192.168.1.30 | CHANGED => {
    20.   "ansible_facts": {
    21.       "discovered_interpreter_python": "/usr/bin/python"
    22.   },
    23.   "changed": true,
    24.   "checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
    25.   "dest": "/tmp/hosts",
    26.   "gid": 0,
    27.   "group": "root",
    28.   "md5sum": "54fb6627dbaa37721048e4549db3224d",
    29.   "mode": "0777",
    30.   "owner": "nobody",
    31.   "secontext": "unconfined_u:object_r:admin_home_t:s0",
    32.   "size": 158,
    33.   "src": "/root/.ansible/tmp/ansible-tmp-1660217157.44-4833-6859918093267/source",
    34.   "state": "file",
    35.   "uid": 99
    36. }
    37. [root@ansible ~]# ssh 192.168.1.20 ls -l /tmp/hosts
    38. -rwxrwxrwx 1 nobody root 158 811 19:25 /tmp/hosts
    39. [root@ansible ~]# ssh 192.168.1.30 ls -l /tmp/hosts
    40. -rwxrwxrwx. 1 nobody root 158 811 19:25 /tmp/hosts

    hostname模块

            hostname模块用于管理远程主机上的主机名。

    🍤常用参数如下:

    name:指明主机名。

    [root@ansible ~]# ansible 192.168.1.20 -m hostname -a "name=demo"
    192.168.1.20 | CHANGED => {
        "ansible_facts": {
            "ansible_domain": "", 
            "ansible_fqdn": "demo", 
            "ansible_hostname": "demo", 
            "ansible_nodename": "demo", 
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "name": "demo"
    }
    [root@node1 ~]# hostname                //在node1主机查看
    demo

    yum模块

            yum模块基于yum机制,对远程主机管理程序包。

    🍤常用参数如下:

    name:程序包的名称,可以带上版本号。若不指明版本,则默认为最新版本。

    state=present|latest|absent:指明对程序包执行的操作,present表示安装程序包,latest表示安装最新版本的程序包,absent表示卸载程序包。

    disablerepo:再用yum安装时,临时禁用某个仓库的ID。

    enablerepo:再用yum安装时,临时启用某个仓库的ID。

    conf_file:yum运行时的配置文件,而不是使用默认的配置文件。

    diable_gpg_check=yes|no:其否启用完整性效验功能。

            管理端只是发送yum指令到被管理端,被管理端要存在可用的yum仓库才可以安装成功。

    1. [root@ansible ~]# ansible web -m yum -a "name=httpd state=present"
    2. ......//因为两台服务器都配置了yum所以安装成功
    3. [root@ansible ~]# ssh 192.168.1.20 rpm -qa | grep httpd
    4. httpd-tools-2.4.6-97.el7.centos.5.x86_64
    5. httpd-2.4.6-97.el7.centos.5.x86_64
    6. [root@ansible ~]# ssh 192.168.1.30 rpm -qa | grep httpd
    7. httpd-tools-2.4.6-97.el7.centos.5.x86_64
    8. httpd-2.4.6-97.el7.centos.5.x86_64

    service模块

            servicee模块为用来管理远程主机上的服务的模块。

    🍤常用参数如下:

    name:被管理的服务器名称。

    state=started|stopped|restarted:动作包含启动、关闭、重启。

    enabled=yes|no:表示是否设置该服务开机自动启动。

    runlevel:如果设定了enabled开机自启动,则要定义在那些运行目标下自动启动。

    [root@ansible ~]# ansible web -m service -a "name=httpd state=started enabled=yes"      //启动httpd服务,并设置为开机自启

    user模块

            user模块用于管理远程主机上的用户账号。

    🍤常用参数如下:

    name:必选参数,账号名称。

    state=present|absent:创建账号或者删除账号,present表示创建,absent表示删除。

    system=yes|no:是否为系统账号。

    uid:用户UID。

    group:用户的基本组。

    groups:用户的附加组。

    shell:默认使用的shell。

    home:用户的家目录。

    move_home=yes|no:如果设置的家目录已经存在,是否将已存在的家目录进行移动。

    password:用户的密码,建议使用后加密后的字符串。

    comment:用户的注释信息。

    remove=yes|no:当state=absent时,是否要删除用户的家目录。

    🍤创建用户示例如下:

    1. [root@ansible ~]# ansible web -m user -a 'name=user1 system=yes uid=501 group=root groups=sshd shell=/sbin/nologin home=/home/user1 password=user1 comment="testuser"'
    2. ......//省略部分内容
    3. [root@ansible ~]# ssh 192.168.1.20 tail -1 /etc/passwd
    4. user1:x:501:0:testuser:/home/user1:/sbin/nologin
    5. [root@ansible ~]# ssh 192.168.1.30 tail -1 /etc/passwd
    6. user1:x:501:0:testuser:/home/user1:/sbin/nologin

    🍤删除用户及家目录示例如下:

    1. [root@ansible ~]# ansible web -m user -a "name=user1 remove=yes state=absent"
    2. ......//省略部分内容
    3. [root@ansible ~]# ssh 192.168.1.20 tail -1 /etc/passwd
    4. apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    5. [root@ansible ~]# ssh 192.168.1.30 tail -1 /etc/passwd
    6. apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

    playbook配置文件

    执行配置文件

            playbook配置文件使用YAML语法,具有简洁明了、结构清晰等特点。playbook配置文件类似于Shell脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表。YAML语法和其他高级语言类似,其结构通过缩进来展示,通过“-”来代表项,通过冒号“:”来分隔键和值,整个文件以“---”开始并以“...”结束,示例如下。

    1. [root@ansible ~]# vim /etc/ansible/hosts //修改hosts文件
    2. [web1]
    3. 192.168.1.20
    4. [web2]
    5. 192.168.1.30
    6. [root@ansible ~]# vim /etc/ansible/a.yml //创建a.yml文件
    7. ---
    8. - hosts: web1 //针对web1的操作
    9. remote_user: root //远端执行用户身份为root
    10. tasks: //任务列表
    11.       - name: adduser //任务名称
    12.         user: name=user2 state=present //执行user模块,创建用户
    13.         tags: //创建tag标签
    14.         - aaa //tag标签为aaa
    15.       - name: addgroup //任务名称
    16.         group: name=root system=yes //执行group模块,创建组
    17.         tags: //创建tag标签
    18.         - bbb //tag标签为bbb
    19. - hosts: web2 //针对web2的操作
    20. remote_user: root //远端执行用户身份为root
    21. tasks: //任务列表
    22.       - name: copy file to web //任务名称
    23.         copy: src=/etc/passwd dest=/home //执行copy模块,复制文件
    24.         tags: //创建tag标签
    25.                 - ccc //tag标签为ccc
    26. ...

    🍤注意:所有的“-”和“:”都有空格,注意缩进和对齐。

            playbook文件定义的任务需要通过ansible-playbook命令进行调用并执行,ansible-playbook命令用法如下:

    ansible-playbook [option] /PATH/TO/PLAYBOOK.yaml

    🍤[option]部分功能如下:

    --syntax-check:检测yaml文件的语法。

    -C(--check):预测试,不会改变目标主机的任何设置。

    --list-hosts:列出yaml文件影响的主机列表。

    --list-tasks:列出yaml文件的任务列表。

    --list-tags:列出yaml文件中的标签。

    -t TAGS(--tags=TAGS):表示只执行指定标签的任务。

    --skip-tags=SKIP_TAGS:表示出了指定标签的任务,执行其他任务。

    --start-at-task=START_AT:从指定的任务开始往下运行。

    🍤示例如下:

    1. [root@ansible ~]# ansible-playbook --syntax-check /etc/ansible/a.yml //语法检查
    2. playbook: /etc/ansible/a.yml //没有报错提示
    3. [root@ansible ~]# ansible-playbook -C /etc/ansible/a.yml //预测试
    4. PLAY [web1] ***************************************************************************
    5. TASK [Gathering Facts] ****************************************************************
    6. ok: [192.168.1.20]
    7. TASK [adduser] ************************************************************************
    8. changed: [192.168.1.20]
    9. TASK [addgroup] ***********************************************************************
    10. ok: [192.168.1.20]
    11. PLAY [web2] ***************************************************************************
    12. TASK [Gathering Facts] ****************************************************************
    13. ok: [192.168.1.30]
    14. TASK [copy file to web] ***************************************************************
    15. changed: [192.168.1.30]
    16. PLAY RECAP ****************************************************************************
    17. 192.168.1.20               : ok=3   changed=1   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  
    18. 192.168.1.30               : ok=2   changed=1   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  
    19. [root@ansible ~]# ansible-playbook --list-hosts /etc/ansible/a.yml //列出主机
    20. playbook: /etc/ansible/a.yml
    21. play #1 (web1): web1 TAGS: []
    22.   pattern: [u'web1']
    23.   hosts (1):
    24.     192.168.1.20
    25. play #2 (web2): web2 TAGS: []
    26.   pattern: [u'web2']
    27.   hosts (1):
    28.     192.168.1.30
    29. [root@ansible ~]# ansible-playbook --list-tasks /etc/ansible/a.yml //列出任务列表
    30. playbook: /etc/ansible/a.yml
    31. play #1 (web1): web1 TAGS: []
    32.   tasks:
    33.     adduser TAGS: [aaa]
    34.     addgroup TAGS: [bbb]
    35. play #2 (web2): web2 TAGS: []
    36.   tasks:
    37.     copy file to web TAGS: [ccc]
    38. [root@ansible ~]# ansible-playbook --list-tags /etc/ansible/a.yml //列出标签
    39. playbook: /etc/ansible/a.yml
    40. play #1 (web1): web1 TAGS: []
    41.     TASK TAGS: [aaa, bbb]
    42. play #2 (web2): web2 TAGS: []
    43.     TASK TAGS: [ccc]
    44. [root@ansible ~]# ansible-playbook /etc/ansible/a.yml //执行任务
    45. PLAY [web1] ***************************************************************************
    46. TASK [Gathering Facts] ****************************************************************
    47. ok: [192.168.1.20]
    48. TASK [adduser] ************************************************************************
    49. changed: [192.168.1.20]
    50. TASK [addgroup] ***********************************************************************
    51. ok: [192.168.1.20]
    52. PLAY [web2] ***************************************************************************
    53. TASK [Gathering Facts] ****************************************************************
    54. ok: [192.168.1.30]
    55. TASK [copy file to web] ***************************************************************
    56. changed: [192.168.1.30]
    57. PLAY RECAP ****************************************************************************
    58. 192.168.1.20               : ok=3   changed=1   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  
    59. 192.168.1.30               : ok=2   changed=1   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  
    60. [root@ansible ~]# ssh 192.168.1.20 tail -1 /etc/passwd //确认结果
    61. user2:x:1001:1001::/home/user2:/bin/bash
    62. [root@ansible ~]# ssh 192.168.1.30 ls -l /home/passwd
    63. -rw-r--r--. 1 root root 2226 811 20:15 /home/passwd

    触发器

            需要触发器才能执行的任务,当之前定义在tasks中的任务执行成功后,若希望在此基础上触发其他的任务,这时就需要定义handlers。

    handlers触发器具有以下特点。

    1. handlers是Ansible提供的条件机制之一。handlers和task很类似,但是它只在被task通知的时候才会触发执行。

    2. handlers只会在所有任务执行完后执行。而且即使被通知了多次,它也只会执行一次。handlers按照定义的顺序依次执行。

    🍤示例如下:

    1. [root@ansible ~]# ssh 192.168.1.20 netstat -anpt | grep 80
    2. tcp6       0     0 :::80                   :::*                   LISTEN     6987/httpd          
    3. [root@ansible ~]# vim /etc/ansible/httpd.yml
    4. ---
    5. - hosts: web1
    6. remote_user: root
    7. tasks:
    8.       - name: aaa
    9.         command: sed -i 's/Listen\ 80/Listen\ 8080/g' /etc/httpd/conf/httpd.conf
    10.         notify: //配置触发条件
    11.               - yy //触发器任务名称
    12. handlers: //配置触发器
    13.       - name: yy //执行触发器名称
    14.         service: name=httpd state=restarted //触发任务重启httpd服务
    15. ...
    16. [root@ansible ~]# ansible-playbook /etc/ansible/httpd.yml
    17. PLAY [web1] ***************************************************************************
    18. TASK [Gathering Facts] ****************************************************************
    19. ok: [192.168.1.20]
    20. ......//省略部分内容
    21. [root@ansible ~]# ssh 192.168.1.20 netstat -anpt | grep 8080 //远端主机已经运行8080端口
    22. tcp6       0     0 :::8080                 :::*                   LISTEN     48440/httpd        

    角色

            多种不同的tasks的文件集中存储在某个目录下,则该目录就是角色。/etc/ansible/roles目录存放着角色,目录下有多个子目录,每个子目录对应一个角色,每个角色也有自己的目录角色。

     /etc/ansible/roles/为角色集合,该目录下有自定义的各个子目录:

    mariadb:mysql角色。

    Apache:httpd角色。

    nginx:Nginx角色。

    每个角色的定义,以特定的层级目录结构进行组织。以Mariadb为例:

    files:存放由copy或script等模块调用的文件。

    templates:存放template模块查找所需要的模板文件的目录,如mysql配置文件等模板。

    tasks:任务存放的目录。

    handlers:存放相关触发路径的目录。

    vars:变量存放的目录。

    meta:用于存放此角色元数据。

    default:默认变量存放的目录,文件中定义了此角色使用的默认变量。

            下面通过一个实例配置数据库角色,要求被管理主机上自动安装Mariadb,安装完成后上传提前准备好的配置文件至远端主机,重启服务,然后新建testdb数据库,并允许test用户对其拥有所有权限。

    • 被管理端配置yum

    之前已经配置过了网络源。

    • 配置数据库角色。

    1. [root@ansible ~]# mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
    2. mkdir: 已创建目录 "/etc/ansible/roles/mariadb"
    3. mkdir: 已创建目录 "/etc/ansible/roles/mariadb/files"
    4. mkdir: 已创建目录 "/etc/ansible/roles/mariadb/tasks"
    5. mkdir: 已创建目录 "/etc/ansible/roles/mariadb/handlers"
    6. [root@ansible ~]# cd /etc/ansible/roles/mariadb/tasks/
    7. [root@ansible tasks]# vim main.yml
    8. ---
    9. - name: install mariadb
    10. yum: name=mariadb-server state=present
    11. - name: move config file
    12. shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
    13. - name: provide a new config file
    14. copy: src=my.cnf dest=/etc/my.cnf
    15. - name: reload mariadb
    16. shell: systemctl restart mariadb
    17. - name: create database testdb
    18. shell: mysql -u root -e "create database testdb;grant all on testdb.* to 'test'@''192.168.1.%' identified by 'test123';flush privileges;"
    19. notify:
    20. - restart mariadb
    21. ...
    22. [root@ansible tasks]# cd ../handlers/
    23. [root@ansible handlers]# vim main.yml
    24. ---
    25. - name: restart mariadb
    26. service: name=mariadb state=restarted
    27. ...
    28. [root@ansible handlers]# cd ../files/
    29. [root@ansible files]# cp /etc/my.cnf .
    30. [root@ansible files]# cd /etc/ansible
    31. [root@ansible ansible]# vim mariadb.yml
    32. ---
    33. - hosts: web1
    34. remote_user: root
    35. roles:
    36. - mariadb
    37. ...
    38. [root@ansible ansible]# ansible-playbook mariadb.yml
    • 查看1.20主机

            在1.20主机上查看是否已经创建了testdb数据库,并测试以test用户登录。

  • 相关阅读:
    [EFI]ASUS EX-B365M-V5 Gold G5400 CPU电脑 Hackintosh 黑苹果引导文件
    【Codeforces】 CF1830D Mex Tree
    鞋业的数字化转型:3D建模与3D打印
    Python3,爬虫有多简单,一个库,一行代码,就OK, 你确定不来试试?
    Android-Firebase快速解决合规问题,延迟Firebase初始化
    packetbeat配置分析
    超低延时直播技术演进之路-进化篇
    项目快讯|深汕特别合作区气膜羽毛球馆正式开工
    stm32 中字与字节的关系
    【SwiftUI模块】0012、SwiftUI-搭建一个类似微博、网易云、抖音个人页面的头部下拉放大图片效果
  • 原文地址:https://blog.csdn.net/qq_61116007/article/details/126318900