一、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": [
"",
"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==""
- name: createfile4
copy: content="小弦切切如私语" dest=/tmp/a.txt
when: a==""
[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?