首页 > 技术文章 > ansible初识三

heshun 2019-02-24 14:58 原文

一、setup模块

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

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

  示例一:查看所有信息

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

示例二:搜索某个信息

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
}

二、ansible剧本

1、条件判断

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

[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 的任务,结果自行验证

3、循环with_items

通常你想在一个任务中干很多事,比如创建一群用户、安装很多包、或者重复一个轮询步骤直到收到某个特定结果,这时就可以使用循环。

循环里面只能是  item  

示例一:单个循环

[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 

示例二:多个循环

[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

4、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目录里面

 

 5、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服务

 

三、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中任务

四、nginx基于uwsgi部署django

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

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

 

推荐阅读