RHCE8.0实训:管理事实

来自CloudWiki
跳转至: 导航搜索

实训目的

  • 从主机收集事实。
  • 创建使用所收集事实的任务。

实训步骤

查看事实

Ansible setup模块从系统检索事实。运行一个临时命令,检索slave组中所有服务器的事实。

输出中将以JSON格式显示为servera.lab.ex&mple.coni收集的所有事实。检 查显小的部分变量。

[root@servera ansible]# cd data-facts

[root@servera data-facts]# ansible slave -m setup

localhost | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "10.0.0.30"
        ],
        "ansible_all_ipv6_addresses": [
            "fe80::dffd:fae2:f3d3:9000"
        ],
        "ansible_apparmor": {
            "status": "disabled"
        },

创建事实

创建名为custom.fact 的事实文件。

该事实文件定义要在servera上安装的软件包和启动的服务。该文件应当如下所示:

[general]
package = httpd
service = httpd
state = started
enabled = true

创建 setup_facts. yml playbook,以生成 /etc/ansible/facts.d 远程目录并将 custom.fact文件保存到该目录。

---
  - name: Install remote facts
    hosts: slave
    vars:
      remote_dir: /etc/ansible/facts.d
      facts_file: custom.fact
    tasks:
      - name: create the remote directory
        file:
          state: directory
          recurse: yes
          path: "{{ remote_dir }}"
      - name: Install the new facts
        copy:
          src: "{{ facts_file }}"
          dest: "{{ remote_dir }}"

使用setup模块运行一个临时命令。搜索输出中的ansible_local部分。这时应当没有任何自定义事实。

[student@workstation data-facts]$ ansible slave -m setup

输出:

 "ansible_local": {},

运行该playbook前,通过运行ansible-playbook --syntax-check来验证其语法是否正确。如果报告任何错误,请更正后再继续下一步。您应看到类似于下文的输岀:

[student@workstation data-facts]$ ansible-playbook --syntax-check setup_facts.yml

运彳亍 setup_facts. yml playbook

[root@servera data-facts]# ansible-playbook setup_facts.yml

PLAY [Install remote facts] *****************************************************************

TASK [Gathering Facts] **********************************************************************
ok: [localhost]
ok: [10.0.0.30]

TASK [create the remote directory] **********************************************************
changed: [localhost]
ok: [10.0.0.30]

TASK [Install the new facts] ****************************************************************
changed: [localhost]
ok: [10.0.0.30]

PLAY RECAP **********************************************************************************
10.0.0.30                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
localhost                  : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

现在执行刚才的命令,ansible slave -m setup

发现ansible_local有输出了:

        "ansible_local": {
            "custom": {
                "general": {
                    "enabled": "true",
                    "package": "httpd",
                    "service": "httpd",
                    "state": "started"
                }
            }
        },

编写主playbook

现在可以创建主playbook,以同时使用默认事实和用户事实来配置servera。在接下中,您要向playbook文件添加内容。创建playbook. yml playbook,使其包含以下内 容


---
 - name: Install Apache and starts the service
   hosts: web
   tasks:
     - name: Install the required package
       yum:
         name: "{{ ansible_facts['ansible_local']['custom']['general']['package'] }}"
         state: latest
     - name: Start the service
       service:
         name: "{{ ansible_facts['ansible_local']['custom']['general']['service'] }}"
         state: "{{ ansible_facts['ansible_local']['custom']['general']['state'] }}"
         enabled: "{{ ansible_facts['ansible_local']['custom']['general']['enabled'] }}"

在运行playbook前,先使用临时命令验证httpd服务目前尚未在servera±运行。

通过运行ansible-playbook - -syntax-check,验证playbook的语法。如果报告任何 错误,请更正后再继续下一步。您应看到类似于下文的输出:

[student@workstation data-facts]$ ansible-playbook --syntax-check playbook.yml


playbook: playbook.yml

使用ansible-playbook命令运行该playbook。观察输出结果,Ansible将先安装软件 包,然后启用服务。

[student@workstation data-facts]$ ansible-playbook playbook.yml

PLAY [Install Apache and starts the service] ************************************************

TASK [Gathering Facts] **********************************************************************
ok: [localhost]
ok: [10.0.0.30]

TASK [Install the required package] *********************************************************
ok: [localhost]
ok: [10.0.0.30]

TASK [Start the service] ********************************************************************
changed: [localhost]
ok: [10.0.0.30]

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

使用一个临时命令来执行systemctl,以确定servera现在是否在运行httpd服务


[root@servera data-facts]# ansible 10.0.0.30 -m command -a 'systemctl status httpd'

10.0.0.30 | CHANGED | rc=0 >>
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2021-02-14 22:42:57 CST; 1min 25s ago
     Docs: man:httpd(8)
           man:apachectl(8)
  Process: 86139 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)
 Main PID: 86648 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─86648 /usr/sbin/httpd -DFOREGROUND
           ├─86651 /usr/sbin/httpd -DFOREGROUND
           ├─86654 /usr/sbin/httpd -DFOREGROUND
           ├─86655 /usr/sbin/httpd -DFOREGROUND
           ├─86656 /usr/sbin/httpd -DFOREGROUND
           ├─86657 /usr/sbin/httpd -DFOREGROUND
           └─86658 /usr/sbin/httpd -DFOREGROUND

Feb 14 22:42:57 servera.lab.example.com systemd[1]: Starting The Apache HTTP Server...
Feb 14 22:42:57 servera.lab.example.com systemd[1]: Started The Apache HTTP Server.