首页 > 其他 > 详细

ansible 专题(2)

时间:2020-11-12 10:35:39      阅读:20      评论:0      收藏:0      [点我收藏+]
学习目标:
  1. 能够使用script模块在远程机器上执行本地脚本

  2. 能够使用command与shell模块远程执行命令

  3. 能够编写playbook实现httpd

  4. 能够使用roles实现lamp

script模块

在group1的远程机器里都执行master上的/tmp/1.sh脚本(此脚本不用给执行权限)

master# ansible group1 -m script -a ‘/tmp/1.sh‘

在master上准备一个脚本

master# vim /tmp/1.sh #!/bin/bash

mkdir /tmp/haha

touch /tmp/haha/{1..10}

command与shell模块

两个模块都是用于执行linux命令的,这对于命令熟悉的工程师来说,用起来非常high。

shell模块与command模块差不多(command模块不能执行一些类似\$HOME,\>,\<,|等符号,但shell可以)
<https://docs.ansible.com/ansible/latest/modules/command_module.html>;

<https://docs.ansible.com/ansible/latest/modules/shell_module.html>;

--成功

group1 -a "cd \$HOME;pwd"

master\# ansible -m shell

master\# ansible -m command group1 -a "cd \$HOME;pwd" --报错

>   \--报错

\--成功

master\# ansible -m command group1 -a "cat /etc/passwd \|wc -l"

master\# ansible -m shell group1 -a "cat /etc/passwd \|wc -l"

master\# ansible -m command group1 -a "useradd user2"

master\# ansible -m command group1 -a "id user2"

注意:
shell模块并不是百分之百任何命令都可以,比如vim或ll别名就不可以。不建议大家去记忆哪些命令不可以,大家只要养成任何在生产环境里的命令都要先在测试环境里测试一下的习惯就好。

setup模块(拓展)

setup模块用于收集远程主机的基本信息(如操作系统类型,主机名,ip,cpu信息,内存信息等)

只查看操作系统类型

master\# ansible group1 -m setup -a ‘filter=ansible_distribution‘

只查看内核版本

master\# ansible group1 -m setup -a ‘filter=ansible_kernel‘

只查看主机头

master\# ansible group1 -m setup -a ‘filter=ansible_hostname‘

查看ens开头的所有网卡信息

master\# ansible -m setup group1 -a ‘filter=ansible_ens\*‘

查询group1组里的所有信息

master\# ansible group1 -m setup
  1. 1.  其它常见的过滤条件
    
    2.  ansible_all_ipv4_addresses:显示ipv4的信息。
    
    3.  ansible_devices:显示磁盘设备信息。
    
    4.  ansible_distribution_major_version:显示是系统主版本。
    
    5.  ansible_distribution_version:仅显示系统版本。
    
    6.  ansible_machine:显示系统类型,例:32位,还是64位。
    
    7.  ansible_lvm:显示lvm相关信息。
    
    8.  ansible_memtotal_mb:显示系统总内存。
    
    9.  ansible_memfree_mb:显示可用系统内存。
    
    10.  ansible_memory_mb:详细显示内存情况。
    
    11.  ansible_swaptotal_mb:显示总的swap内存。
    
    12.  ansible_swapfree_mb:显示swap内存的可用内存。
    
    13.  ansible_mounts:显示系统磁盘挂载情况。
    
    14.  ansible_processor:显示cpu个数(具体显示每个cpu的型号)。
    
    15.  ansible_processor_vcpus:显示cpu个数(只显示总的个数)。

playbook

playbook(剧本): 是ansible用于配置,部署,和管理被控节点的剧本。

参 考
:<https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html>;
使用的格式为yaml格式(saltstack,elk,docker等也都会用到yaml格式)

YMAL格式

文件的第一行以 "---"开始,表明YMAL文件的开始.

以#号开头为注释

列表中的所有成员都开始于相同的缩进级别, 并且使用一个

作为开头(一个横杠和一个空格)

"- "

键 : 值

注意: 写这种文件不要使用tab键,都使用空格

参考:
<https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html#yaml-syntax>;

下面看一个官方的示例感受一下

1 ---

  1. # 一位职工记录

  2. name: Example Developer

  3. job: Developer

  4. skill: Elite

  5. employed: True

  6. foods:

  7. - Apple

  8. - Orange

  9. - Strawberry

  10. - Mango

  11. languages:

  12. ruby: Elite

  13. python: Elite

  14. dotnet: Lame

playbook实例

先直接来看一个实例

第1步: 创建一个存放playbook的目录(路径自定义)

1 master# mkdir /etc/ansible/playbook

第2步: 准备httpd配置文件,并修改成你想要的配置

1 master# yum install httpd -y 2

  1. 按需要修改你想要的配置(为了测试可以随意改动标记一下)

  2. master# vim /etc/httpd/conf/httpd.conf

第3步: 写一个playbook文件(后缀为.yml或.yaml)

# vim /etc/ansible/playbook/example.yaml

---

- hosts: group1 remote_user: root tasks:

- name: ensure apache is at the latest version

yum: name=httpd state=latest name=httpd-devel state=latest

- name: write the apache config file

copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf

notify:

- restart apache

- name: ensure apache is running (and enable it at boot) service:
name=httpd state=started enabled=yes

handlers:

- name: restart apache

service: name=httpd state=restarted

第4步: 执行写好的palybook

会显示出执行的过程,并且执行的每一步都有ok,changed,failed等标识

执行如果有错误(failed)会回滚,解决问题后,直接再执行这条命令即可,并会把failed改为changed(幂等性)

1 # ansible-playbook /etc/ansible/playbook/example.yaml

Playbook常见语法

  • hosts: group1
  1. remote_user: root

tasks: 任务列表, 按顺序执行任务.

如果一个host执行task失败, 整个tasks都会回滚, 修正playbook 中的错误,
然后重新执行即可.

- name: write the apache config file

copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf

tasks:

- name: ensure apache is at the latest version

yum: name=httpd state=latest name=httpd-devel state=latest

handlers: 类似task,但需要使用notify通知调用。

不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次.
handlers最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了.

- name: ensure apache is running (and enable it at boot) service:
name=httpd state=started enabled=yes

handlers:

- name: restart apache

service: name=httpd state=restarted

notify:

- restart apache

练习:修改httpd的端口为8080,再执行playbook测试

variables: 变量

定义变量可以被多次方便调用

1 master# vim /etc/ansible/playbook/example2.yaml 2 ---

  1. - hosts: group1

  2. remote_user: root

  3. vars:

  4. - user: test1

  5. tasks:

  6. - name: create user

  7. user: name={{user}} state=present

    1 master# ansible-playbook /etc/ansible/playbook/example2.yaml

with_items: 迭代列表

1 master# vim /etc/ansible/playbook/example3.yaml 2 ---

  1. - hosts: group1

  2. remote_user: root

  3. tasks:

  4. - name: install httpd

  5. yum: name={{item}} state=latest

  6. with_items:

  7. - httpd

  8. - httpd-devel

    1 master# ansible-playbook /etc/ansible/playbook/example3.yaml

执行后有如下警告

技术分享图片

解决方法:

master# echo 123456 | openssl passwd -1 -stdin

  1. \$1\$yO9V8CcI\$EwhJvQWxnXXlmQhXR5Kc./

1 master# vim /etc/ansible/playbook/example4.yaml 2 ---

  1. - hosts: group1

  2. remote_user: root

  3. tasks:

    • user: name="{{item.name}}" group="{{item.group}}"
      password="\$1\$yO9V8CcI\$EwhJvQWxnXXlmQhXR5Kc./"
  4. with_items:

  5. - {name: "user1", group: "root"}

  6. - {name: "user2", group: "daemon"}

  7. - {name: "user3", group: "lp"}

    1 master# ansible-playbook /etc/ansible/playbook/example4.yaml

练习:写一个playbook实现

  1. 配置yum

  2. 安装vsftpd包

  3. 修改配置文件(要求拒绝匿名用户登录)

  4. 启动服务并实现vsftpd服务开机自动启动

1 ---

  1. - hosts: group1

  2. remote_user: root

  3. tasks:

  4. - name: rm yum repository

  5. file: path=/etc/yum.repos.d/ state=absent 7

- name: 同步master上的yum源到group1

copy: src=/etc/yum.repos.d dest=/etc/

  • name: ensure vsftpd is at the latest version yum: name=vsftpd state=latest

  • name: write the apache config file

    copy: src=/etc/vsftpd/vsftpd.conf dest=/etc/vsftpd/vsftpd.conf

notify:

  • restart vsftpd

  • name: ensure vsftpd is running (and enable it at boot) service: name=vsftpd
    state=started enabled=yes

handlers:

  • name: restart vsftpd

    service: name=vsftpd state=restarted

roles

roles介绍

roles(角色): 就是通过分别将variables,
tasks及handlers等放置于单独的目录中,并可以便捷地调用它们的一种机制。

假设我们要写一个playbook来安装管理lamp环境,那么这个playbook就会写很长。所以我们希望把这个很大的文件
分成多个功能拆分,
分成apache管理,php管理,mysql管理,然后在需要使用的时候直接调用就可以了,以免重复写。就类似编程里的模块化的概念,以达到代码复用的效果。

创建roles的目录结构

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

  1. tasks:至少有一个main.yml文件,定义各tasks。

  2. handlers:有一个main.yml文件,定义各handlers。

  3. templates:用来存放jinjia2模板。

  4. vars:有一个main.yml文件,定义变量。

  5. meta:有一个main.yml文件,定义此角色的特殊设定及其依赖关系。

注意: 在每个角色的目录中分别创建?les,
tasks,handlers,templates,vars和meta目录,用不到的目录可以创建为空目录.

└── main.yml

└── php

├── files

├── handlers

├── templates

└── vars

└── main.yml

└── main.yml

├── tasks

└── main.yml

├── meta

└── main.yml

├── files

├── handlers

├── mysql

├── templates

└── vars

└── main.yml

└── main.yml

├── tasks

└── main.yml

├── meta

└── main.yml

├── files

├── handlers

需定制三个角色: httpd,mysql,php

master# yum install tree -y master# tree /etc/ansible/roles/

/etc/ansible/roles/

├── httpd

master# cd /etc/ansible/roles/

master# mkdir -p {httpd,mysql,php}/{files,tasks,handlers,templates,vars,meta}
master# touch {httpd,mysql,php}/{tasks,handlers,vars,meta}/main.yml

├── templates

└── vars

└── main.yml

└── main.yml

├── tasks

└── main.yml

├── meta

master# yum install httpd -y

按需求修改配置文件后,拷贝到httpd角色目录里的files子目录

master# vim /etc/httpd/conf/httpd.conf

master# cp /etc/httpd/conf/httpd.conf /etc/ansible/roles/httpd/files/

master# echo "test main page" \> /etc/ansible/roles/httpd/files/index.html

master# echo -e "\<?php\n\tphpinfo();\n?\>" \>
/etc/ansible/roles/httpd/files/test.php

第3步: 编写httpd角色的main.yml文件

name: copy index file

copy: src=/etc/ansible/roles/httpd/files/index.html
dest=/var/www/html/index.html

  • name: copy test_php file

    copy: src=/etc/ansible/roles/httpd/files/test.php
    dest=/var/www/html/test.php

  • name: copy conf file

    copy: src=/etc/ansible/roles/httpd/files/httpd.conf
    dest=/etc/httpd/conf/httpd.conf

notify:

- restart httpd

  • name: start httpd

    service: name=httpd enabled=true state=started

master# vim /etc/ansible/roles/httpd/tasks/main.yml

---

  • name: install httpd

    yum: name={{item}} state=latest with_items:

    • httpd

    • httpd-devel

第4步: 编写httpd角色里的handler

1 master# vim /etc/ansible/roles/httpd/handlers/main.yml 2 ---

  1. - name: restart httpd

  2. service: name=httpd state=restarted

第5步: 编写mysql角色的main.yml文件

- name: start service

service: name=mariadb enabled=true state=started

master# vim /etc/ansible/roles/mysql/tasks/main.yml

---

  • name: install mariadb

    yum: name={{item}} state=latest with_items:

    • mariadb

    • mariadb-server

    • mariadb-libs

    • mariadb-devel

第6步: 编写php角色的main.yml文件

#必须添加,要不然httpd无法使用php模块

master# vim /etc/ansible/roles/php/handlers/main.yaml

- name: restart httpd

service: name=httpd state=restarted

master# vim /etc/ansible/roles/php/tasks/main.yml

---

  • name: install php

    yum: name={{item}} state=latest with_items:

    • php

    • php-mysql

    • php-gd

    • php-ldap

    • php-odbc

    • php-pear

    • php-xml

    • php-xmlrpc

    • php-mbstring

    • php-snmp

    • php-soap

    • curl

    • curl-devel

    • php-bcmath notify:

      - restart httpd

第7步:编写lamp的playbook文件调用前面定义好的三个角色

1 master# vim /etc/ansible/playbook/lamp.yaml 2 ---

  1. - hosts: group1

  2. remote_user: root

  3. roles:

  4. - httpd

  5. - mysql

  6. - php

第8步: 执行lamp的playbook文件

1 master# ansible-playbook /etc/ansible/playbook/lamp.yaml

练习

请使用role来实现lnmp

ansible 专题(2)

原文:https://blog.51cto.com/14625831/2549330

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!