ansible进阶二

ansible:
优点:无需安装agent(客户端),是通过ssh通道进行管理,目前最流行的自动化软件,没有之一

jenkins:可视化运维(主要是可视化部署),持续构建,可以和git,svn(两个是存放开发代码的仓库)结合,可结合sn’wei’sh实现可视化运维,可结合ansible实现可视化运维

Centos7.3 :(yum -y install net-tools vim)
关闭防火墙,(systemctl stop firewalld,systemctl disable firewalld)
关闭selinux (vim /etc/selinux/config)

#Python3与ansible的安装
安装支持包 yum -y install lrzsz vim net-tools gcc gcc-c++ ncurses ncurses-devel unzip zlib-devel zlib openssl-devel openssl

#源码编译
tar xf Python-3.5.2.tgz -C /usr/src
cd /usr/src/Python-3.5.2.tgz
./configure --prefix=/usr/local/python
make && make install
ln -s /usr/local/python/bin/python3 /usr/bin/python3
which python3
#查看并激活版本(Python 3.5.2)(python 2.6.6版本不对,只在centos6.5适用)
python3 -v

#安装ansible最新版本
/usr/local/python/bin/pip3 install ansible
ln -s /usr/loca/python/bin/ansible /usr/local/bin
#查ansible版本号(最新版本号)
ansible --version

#查看ansible帮助
/usr/local/python/bin/ansible-doc -l       #查看总帮助
/usr/local/python/bin/ansible-doc -s shell #查看shell模块帮助
#查看raw模块帮助,仅通过ssh使用,不需要通过python,比如客户端没安装python,那么不能使用shell等其他模块了,用不了,只能先安装python,就需要用到raw模块来安装
/usr/local/python/bin/asnible-doc -s raw   #查看raw模块帮助

简单使用

ansible -i /etc/ansible/hosts  #-i 引用配置文件hosts,有这个参数,hosts可以换地方
#如果加入特殊符号还需要加入转义符\ 这样ansible才能正常运行
ansible all -m shell -a "cat /etc/passwd | awk -F":" '{print \$1}'"

ansible-playbook 使用(剧本)

剧本:可以像拍戏一样把各个模块编成一个故事,把所有模块帮我按我想要的顺序执行
ln -s /usr/local/python/bin/ansible-playbook /usr/local/bin/
剧本要用yaml结尾。如:test_shell.yaml—>playbook的执行模板

[root@ansible-server ~]# vim test_shell.yaml
#playbook使用规范格式,python对格式要求非常严格
#hosts tasks name register 都是内置变量 
--- #必须有三个减号"-" 里面冒号后面的空格是必须的
- hosts: ansible01 #这行开头必须有个减号,然后空格 hosts: 代表分发范围,和后边的内容空格
  tasks:           #表示接下来要执行的具体任务,和hosts平级
  - name: test     #name,是tasks的下级,后面test随便写,表示要执行的具体名字
    shell: echo "welcome to yunjisuan" >> /tmp/username #模块具体命令
    register: print_result  #register对上面命令赋值给本行的变量  后面内容是变量名(随意)
  - debug: var=print_result #单独的任务:debug: var= 是固定格式,debug方式输出变量名。
---
- hosts: ansible01
  tasks:
  - name: test
    shell: echo "welcome to yunjisuan" >> /tmp/username
  - name: test2
    shell: echo "welcome to yunjisuan" >> /tmp/username
    register: print_result
  - debug: var=print_result

image_1d8fpruv5arh50vaq61gcsaqtp.png-49.7kB

自定义变量

[root@ansible-server ~]# vim test_shell.yaml
#vars自定义变量,自定义的变量不要和内置变量名冲突
##特别注意,引用变量一定要在双引号里##
---
- hosts: ansible01
  vars:                 #自己定义变量时需要这个模块了
  - Name: "yunjisuan"  #前面时变量名,后面是值
    age: "3"            #前面时变量名,后面是值
  tasks:
  - name: {{ Name }}   #使用变量名时必须两个大括号并且两边空格
    shell: echo "my name {{ Name }} is {{ age }}" >> /tmp/username
    register: qqq
  - debug: var=qqq

image_1d8fqqg881f701lb8178jcae1blq1m.png-50.9kB

内置变量调用和查看

获取本地内置变量python方式取的:
ansible 127.0.0.1 -m setup |less

[root@ansible-server ~]# vim test_shell.yaml
---
- hosts: ansible01
  gather_facts: True #开启系统变量的模块和参数,前面的都是固定格式
  tasks:
  - name: setup var
    shell: echo "ip {{ ansible_all_ipv4_addresses[0] }} cpu{{ ansible_processor_count }}" #里面的就是具体的变量,[0]:学python就知道了
    register: var_result
  - debug: var=var_result

但是有些是需要取值的

python里中括号[],叫做列表,大括号叫字典
360截图16251112120113141.png-415.6kB

360截图16540604185852.png-598.5kB

ansible的setup模块非常好用,但给出的信息十分全面,有时候我们并不需要全部的信息。
过滤出指定的信息:例->ansible all -m setup -a "filter=ansible_os_family"
ansible_all_ipv4_addresses:仅显示ipv4的信息
ansible_devices:仅显示磁盘设备信息
ansible_distribution:显示是什么系统,例:centos,suse等
ansible_distribution_major_version:显示是系统主版本
ansible_distribution_version:仅显示系统版本
ansible_machine:显示系统类型,例:32位,还是64位
ansible_eth0:仅显示eth0的信息
ansible_hostname:仅显示主机名
ansible_kernel:仅显示内核版本
ansible_lvm:显示lvm相关信息
ansible_memtotal_mb:显示系统总内存
ansible_memfree_mb:显示可用系统内存
ansible_memory_mb:详细显示内存情况
ansible_swaptotal_mb:显示总的swap内存
ansible_swapfree_mb:显示swap内存的可用内存
ansible_mounts:显示系统磁盘挂载情况
ansible_processor:显示cpu个数(具体显示每个cpu的型号)
ansible_processor_vcpus:显示cpu个数(只显示总的个数)
ansible_python_version:显示python版本

Playbook下发可变配置文件

利用template模块下发可变的配置文件:就是一个普通文件里写入变量,然后批量下发这个文件,并让这个文件里的变量触发
360截图174209217787107.png-14.2kB

[root@ansible-server ~]# vim test_shell.yaml
---
- hosts: ansible01
  gather_facts: True
  vars:
  - myname: "yunjisuan"
  tasks:
  - name: templat test
    template: src=/tmp/test dest=/root/
    register: var_result
  - debug: var=var_result

asible-playbook test_shell.yaml
360截图167204028010198.png-19.2kB

下发中加入判断语句

[root@ansible-server ~]# vim /tmp/if.j2
#这是java scripts 的语言,文件名结尾必须.j2 (jinja2)
{% if PORT %}         #假如 PORT 存在
ip=0.0.0.0:{{ PORT }} #则输出。。。
{% else %}            #否则
ip=0.0.0.0:80         #则输出。。。
{% endif %}           #结束语
[root@ansible-server ~]# vim test_shell.yaml
---
- hosts: ansible01
  gather_facts: True
  vars:
  - PORT: 90
  tasks:
  - name: jinja2 if test
    template: src=/tmp/if.j2 dest=/root/
    register: var_result
  - debug: var=var_result
~                          

Playbook的notify通知和下发nginx配置

image_1d8g8o5h718m4155d18sas51161b4r.png-221.2kB

# 实战下发可执行动作的可变的nginx配置文件
[root@ansible-server ~]# cat nginx 
worker_porcesses {{ ansible_processor_count }}

[root@ansible-server ~]# cat test_shell.yaml 
---
- hosts: ansible01
  gather_facts: True
  tasks:
  - name: nginx conf
    template: src=nginx dest=/root/
    notify: #上面的template发生变化触发这个
    - stop nginx
  handlers: #触发了notify,然后触发handlers
  - name: stop nginx
    shell: /usr/local/nginx/sbin/nginx -s stop
    register: var_result
  - debug: var=var_result

猜你喜欢

转载自blog.csdn.net/weixin_44439515/article/details/89328107