ansible初识三

1、setup模块

ansible的 setup模块主要用来收集信息, 查看参数:html

[root@localhost ~]# ansible-doc -s setup        # 查看参数,部分参数以下:
filter         # 过滤,筛选

  示例一:查看全部信息python

ansible  cache  -m  setup     #  查看cache组的被管控机的信息,  可查到部分信息以下
ansible_all_ipv4_addresses # ipv4的全部地址
ansible_all_ipv6_addresses # ipv6的全部地址
ansible_date_time # 获取到控制节点时间
ansible_default_ipv4 # 默认的ipv4地址
ansible_distribution # 系统
ansible_distribution_major_version # 系统的大版本
ansible_distribution_version # 系统的版本号
ansible_domain # 系统所在的域
ansible_env # 系统的环境变量
ansible_hostname # 系统的主机名
ansible_fqdn # 系统的全名(主机名+域名)
ansible_machine # 系统的架构
ansible_memory_mb # 系统的内存信息
ansible_os_family # 系统的家族
ansible_pkg_mgr # 系统的包管理工具
ansible_processor_cores # 系统的cpu的核数(每颗)
ansible_processor_count # 系统cpu的颗数
ansible_processor_vcpus # 系统cpu的总个数=cpu的颗数*CPU的核数
ansible_python # 系统上的python

示例二:搜索某个信息nginx

ansible  cache -m setup  -a  'filter=*processor*'    #用来搜索,  *表明匹配任意个任意字符,可自行回顾正则表达式相关知识,可得以下信息
192.168.133.132 | SUCCESS => {
"ansible_facts": {
"ansible_processor": [
"0",
"GenuineIntel",
"Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz"
],
"ansible_processor_cores": 1,
"ansible_processor_count": 1,
"ansible_processor_threads_per_core": 1,
"ansible_processor_vcpus": 1
},
"changed": false
}

2、ansible剧本

一、条件判断

  ansible的playbook 支持条件判断, 当针对不一样系统, 不一样版本, 不一样环境, 不一样用户有不一样操做时,可使用 when  作条件判断, 示例以下:web

[root@localhost yaml]# vi p5.yml               # 写一个yml文件,内容以下:
- hosts: db
  remote_user: root
  tasks: 
  - name: createfile3
    copy: content="大弦嘈嘈如急雨" dest=/tmp/a.txt
    when: a=="3"
  - name: createfile4
    copy: content="小弦切切如私语" dest=/tmp/a.txt
    when: a=="4"
[root@localhost yaml]# ansible-playbook --syntax-check p5.yml         # 验证语法合法性

playbook: p5.yml
[root@localhost yaml]# ansible-playbook -e 'a="3"' p5.yml           # 只执行name为 createfile3 的任务,结果自行验证

三、循环with_items

一般你想在一个任务中干不少事,好比建立一群用户、安装不少包、或者重复一个轮询步骤直到收到某个特定结果,这时就可使用循环。正则表达式

循环里面只能是  item  redis

示例一:单个循环apache

[root@localhost yaml]# vi p7.yml 
- hosts: web
  tasks:
  - name: createuser
    user: name={{ item }}
    with_items: - zhangsan
    - lisi
    - wangwu
[root@localhost yaml]# ansible-playbook --syntax-check p7.yml

playbook: p7.yml
[root@localhost yaml]# ansible-playbook p7.yml 

示例二:多个循环django

[root@localhost yaml]# vi p8.yml               # 写入以下内容
- hosts: web
  tasks:
  - name: createuser
    user: name={{ item }}
    with_items: - zs
    - lss
    - ww
  - name: creategroup
    group: name={{ item }}
    with_items: - yunwei
    - kaifa
    - ceshi
[root@localhost yaml]# vi p8.yml
[root@localhost yaml]# ansible-playbook --syntax-check p8.yml 

playbook: p8.yml
[root@localhost yaml]# ansible-playbook p8.yml      # 执行命令,结果自行验证

  示例三:循环嵌套安全

[root@localhost yaml]# vi p9.yml          # 写入以下内容
- hosts: web
  tasks:
  - name: creategroup
    group: name={{ item }}
    with_items: - yunwei
    - kaifa
    - ceshi
  - name: createuser
    user: name={{ item.name }} group={{ item.group }}
    with_items: - {'name':zs,'group':yunwei} - {'name':lss,'group':kaifa} - {'name':ww,'group':ceshi}
[root@localhost yaml]# ansible-playbook p9.yml         # 结果自行验证

playbook: p9.yml
[root@localhost yaml]# ansible-playbook p9.yml

四、template模块

  先来回忆一下redis的安装,为了安全起见,咱们一般在redis安装完成后要更改redis的配置文件redis.conf,其中有一项是更改bind参数,让redis能够远程访问,实际开发中bind 参数为本机对外ip地址,而不能使用0.0.0.0开启,这时,问题来了,使用ansible批量传输配置文件时,如何将bind参数设置为被管控机的ip地址?架构

首先,咱们使用setup模块查询一下被管控机的ip地址,以下:

 

 

 

 

 

 

 

 

 

在管控机上安装redis后,编辑配置文件redis.conf,更改bind参数以下:

vi  /etc/redis.conf    # 编辑redis配置文件,更改bind参数为以下内容

 

 

 

 示例:

[root@localhost yaml]# vi p10.yml 
- hosts: web
  tasks:
  - name: install
    yum: name=redis
  - name: copyfile
    template: src=/etc/redis.conf dest=/etc/redis.conf
  - name: start
    service: name=redis state=started
[root@localhost yaml]# ansible-playbook --syntax-check p10.yml 

playbook: p10.yml
[root@localhost yaml]# ansible-playbook p10.yml

  验证:查看web组的被管控机的redis配置文件中bind参数

 

 

 

 

 

 

copy 模块与template 模块的区别:  copy 模块不替换参数, 而template模块替换参数.使用相对路径:  在上面p10.yml 中, template模块的src参数使用的是绝对路径, 除此以外,咱们还可使用相对路径,以下 :

[root@localhost yaml]# vi p10.yml 
- hosts: web
  tasks:
  - name: install
    yum: name=redis
  - name: copyfile
    template: src=redis.conf dest=/etc/redis.conf
  - name: start
    service: name=redis state=started
[root@localhost yaml]# ansible-playbook --syntax-check p10.yml 

playbook: p10.yml
[root@localhost yaml]# ansible-playbook p10.yml

注意:  使用相对路径的前提是在当前目录  (p10.yml 文件所在目录)  下 新建一个templates  (必须叫这个)  目录, 而后把文件redis.conf放在templates目录里面

 

 五、handlers

上面咱们曾提到过, modul 具备 "幂等" 性,  因此当远端系统被人修改时, 能够重放 playbooks 达到恢复的目的, playbooks 自己能够识别这种改动, 而且有一个基本的event sysem(事件系统), 能够响应这种改动, (当发生改动时)  'notify'  actions 会在playbook的每个task结束时触发, 并且即便有多个不一样的task 通知改动的发生 , notify   actions 只会被触发一次.

  举例来讲,好比多个 resources 指出由于一个配置文件被改动,因此 apache 须要从新启动,可是从新启动的操做只会被执行一次。

  'notify' 下列出的便是 handlers。Handlers 也是一些 task 的列表,经过名字来引用,它们和通常的 task 并无什么区别。Handlers 是由通知者进行 notify,若是没有被 notify,handlers 不会执行,无论有多少个通知者进行了 notify,等到 play 中的全部 task 执行完成以后,handlers 也只会被执行一次。

示例:

[root@localhost yaml]# vi p11.yml 
- hosts: web
  tasks:
  - name: install
    yum: name=redis
  - name: copyfile
    template: src=redis.conf dest=/etc/redis.conf
    tags: copyfile
    notify: restart    
  - name: start
    service: name=redis state=started
 handlers: - name: restart
    service: name=redis state=restarted
[root@localhost yaml]# 
[root@localhost yaml]# ansible-playbook --syntax-check p11.yml 

playbook: p11.yml
[root@localhost yaml]# 
[root@localhost yaml]# ansible-playbook p11.yml                       
[root@localhost yaml]# ansible-playbook -t copyfile p11.yml           # 执行copyfile任务 和 restart任务,即修改完配置文件后重启redis服务

 

3、roles

如今咱们已经学过 tasks 和 handlers,那怎样组织 playbook 才是最好的方式呢?简单的回答就是:使用 roles ! roles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。基于 roles 对内容进行分组,使得咱们能够容易地与其余用户分享 roles 。

  roles的优势:

  - 目录清晰

  - 能够互相调用

  roles目录结构:

  - 文件夹里面是要建立的每个角色,每个角色一个文件夹;

  - 每个角色里面都有tasks(必须的),templates,files,handlers,vars目录;

  - 每一个目录都要有main.yml文件,经过import_tasks来调用;

  - 其中templates文件夹中的文件能够经过相对路径来调用;

  其中files文件夹中的文件是否能够经过相对路径来调用?

  示例:

root
 ├── roles
 │   ├── cache
 │   ├── db
 │   └── web
 │       ├── files
 │       ├── handlers
 │       │   └── main.yml
 │       ├── tasks
 │       │   ├── copy_redis_conf.yml
 │       │   ├── install_redis.yml
 │       │   ├── main.yml
 │       │   └── start_redis.yml
 │       ├── templates
 │       │   └── redis.conf.j2
 │       └── vars
 └── web.yml
- name: install_redis
  yum: name=redis
root/roles/web/tasks/install_redis.yml
- name: copy_redis_conf
  template: src=redis.conf.j2  dest=/etc/redis.conf
  tags:  copy_redis_conf
  notify:  restart_redis
root/roles/web/tasks/copy_redis_conf.yml
- name:  start_redis
  service:  name=redis  state=started
root/roles/web/tasks/start_redis.yml
- import_tasks: install_redis.yml
- import_tasks:  copy_redis_conf.yml
- import_tasks:  start_redis.yml
root/roles/web/tasks/main.yml
- name:  restate_redis
  service:  name=redis   state=restarted
root/roles/web/handlers/main.yml
- hosts: web
  remote_user:  root
  roles:
  - web
root/web.yml
ansible-playbook  web.yml
ansible-playbook -t copy_redis_conf  web.yml   # 修改配置文件后加参数-t,触发handler中任务

4、nginx基于uwsgi部署django

参考博客:https://blog.51cto.com/wangfeng7399/2341281

思考:如何用roles 来安装nginx+uwsgi+mariadb + redis?

相关文章
相关标签/搜索