ansible 剧本角色

实验:
vim /etc/ansible/hosts
[test01]
192.168.200.112
192.168.200.113
保存退出
vim /etc/ansible/test.yml    //创建test.yml文件
---                                      //开头格式(可忽略)
- host: tes01                     //表示对test01(192.168.200.112)的操作
  remote_user: root       //远端执行用户身份root
  tasks:                          //任务列表
    - name: adduser        //任务名称
      user: name=user2 state=present   //执行user模块创建用户
      reglster: print_result #将之前命令的输出结果保存在变量print_result里
      tags:                        //创建tag标签
      - testaaa                  //tag标签为testaaa
    - debug: var=print_result   //将变量的值作为debug输出出来
    - name: addgroup      //任务名称
      group: name=root system=yes      //执行group模块创建组
      tags:                //创建tag标签
      - testbbb                //tag标签为testbbb
- hosts: test02
  remote_user: root
  tasks:
    - name: copy file                //任务名称
      copy: src=/etc/passwd dest=/home    //执行copy模块复制文件
      tags:
      - testccc
...
保存与退出
语法检查:
ansible-playbook --syntax-check /etc/ansible/test.yml
预执行测试:
ansible-playbook -C /etc/ansible/test.yml
ansible-playbook --list-hosts  /etc/ansible/test.yml
执行:
ansible-playbook  /etc/ansible/test.yml
---------------------------------------------------------------------------
触发器:
ansible test01 -m shell -a 'netstat -aupt |grep 80'
vim /etc/ansible/httpd.yml
---
- hosts: laowang
  remote_user: root
  tasks:
    - name: chang port
      command: sed -i 's/Listen 80/Listen 8080/g' /etc/httpd/conf/httpd.conf
      notify:       (完成任务后调用restart httpd触发器)
        - restart httpd      (调用触发器名字)
  handlers:       (配置触发器)
    - name: restart httpd     (指定触发器名字)
      service: name=httpd state=restarted (指定触发器条件为重启httpd)
...
保存退出
ansible-playbook -C /etc/ansible/httpd.yml   //检测
ansible-playbook  /etc/ansible/httpd.yml     //执行
---------------------------------------------------------------------------------------------------------
实验案例: 被管理主机安装mariadb 安装后上传提前准备好的配置文件,到远程主机,重启服务,并创建testdb 数据库 允许test用户对其拥有所有权限
【1】被管理端配置yum源
cd /etc/yum.repos.d/
ls
backup Centos-Media.repo
yum clean all
【2】配置数据库角色
mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
vim /etc/ansible/mariadb.yml (建立剧本)
---
- hosts: laowang
  remote_user: root
  roles:    (角色)
    - mariadb
...
cd /etc/ansible/roles/mariadb/
vim tasks/main.yml      (创建任务)
- name: install mariadb      (安装mariadb)
  yum: name=mariadb-server state=present
- name: move config file     (备份主配置文件)
  shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
- name: provide a new config file   (拷贝files的主配置文件到客户机/etc/my.cnf下)
  copy: src=my.cnf dest=/etc/my.cnf
- name: reload mariadb     (重启mariadb)
  shell: systemctl restart mariadb
- name: create database testdb    (建立库,并且授权账号)
  shell: mysql -uroot -e "create database testdb;grant all privileges on testdb.* to 'test'@'192.168.200.%' identified by 'test123';flush privileges;"
  notify:         (配置触发器)
  - restart mariadb
保存退出
vim handlers/main.yml (创建触发器)
- name: restart mariadb
  service: name=mariadb state=restarted
保存退出
cp /etc/my.cnf /etc/ansible/roles/mariadb/files/ (准备配置文件)
vim files/my.cnf 
(编辑配置文件,在末尾标记下,在客户机上查看配置文件是否变化)
保存退出
ansible-playbook -C /etc/ansible/mariadb.yml (预执行)
ansible-playbook  /etc/ansible/mariadb.yml (部署)

--------------------------------------------------------------------------------------------------------
1、执行配置文件
Playbook配置文件使用YAML语法。Playbook配置文件类似于shell脚本,是一个YAML格式的文件。YAML文件的扩展名通常为.yaml或 .yml
YAML语法和其他高级语言类似,其结构通过缩进来展示,通过“-”来代表选项,通过冒号“:”来分隔建和值。整个文件以“---”开始并以“...”结束,-和:后面必须有空格,而且要注意缩进和对齐
执行结果输出
在用playbook进行ansible模块操作的时候,并没有命令的执行结果输出,默认被隐藏了。可以通过register模块追加输出命令的执行结果8、执行输出
在用playbook进行ansible模块操作的时候,并没有命令的执行结果输出,默认被隐藏了。可以通过register模块追加输出命令的执行结果
---         (开头,可忽略)
- hosts:test01       (操作的主机,分组)
  remote_user: root     (在被操控的主机上以什么身份运行)
  tasks:        (任务)
    - name: adduser     (任务名)
      user: name=user2 state=present  (调用user模块,建立用户)
      register: print_result    (将之前命令的输出结果保存在变量print_result里)
      tags:        (任务标签)
        - testaaa       (任务标签名)
    - debug: var=print_result    (将变量的值作为debug输出出来) 
    - name: addgroup     (任务名)
      group: name=root system=yes  (调用group模块,建立系统组)
      tags:        (任务标签)
        - testbbb       (任务标签名)
- hosts: test02      (操作的主机,分组)
  remote_user: root     (在被操控的主机上以root身份运行)
  tasks:        (任务)
    - name: copy file     (任务名)
      copy: src=/etc/passwd dest=/home (调用copy模块)
      tags:        (标签)
        - testccc       (标签名)
...         (结尾,可忽略)
Playbook的核心元素:
1、hosts:任务的目标主机,多个主机用冒号分隔,一般调用/etc/ansible/hosts中的分组信息
2、remote_user:远程主机上,运行此任务的什么默认为root
3、tasks:任务,即定义的具体任务,有模块定义的操作列表
4、handlers:触发器,类似tasks,只是在特定的条件下才会触发任务。某任务的状态在运行后为changed时,可以通过“notify”通知给相应的handlers进行触发执行。
5、roles:角色,将hosts剥离出去,有tasks,handlers等组成的一种特定的结构集合
用法:
Playbook文件定义的任务需要通过ansible-playbook命令进行调用并执行
格式:ansible-playbook [option] /PTAH/TO/PLAYBOOK.yaml
其中[option]部分的功能包括:
【1】--syntax-check:检测yaml文件的语法
【2】-C (--check) :测试,不会改变主机的任何配置
【3】 --list-hosts:列出yaml 文件影响的主机列表
【4】--list-tasks: 列出yaml文件的任务列表
【5】--list-tags:列出yaml文件的标签
【6】-t TAGS(--tags=TAGS): 表示只执行指定标签的任务
【7】--skip-tags=SKIP_TAGSS:表示除了指定标签任务,执行其他任务
【8】--start-art-task=START_AT:从指定任务开始往下运行
2、触发器
需要触发才能执行的任务,当之前定义在tasks的任务执行完成后,若希望在基础上触发其他的任务,这是需要定义handlers。例如,当通过ansible的模块对目标主机的配置文件进行修改之后,如果任务执行成功,可以触发一个触发器,在触发器中定义目标主机的服务重启操作,一边配置文件生效,handlers触发器具有以下优点
1、handlers是Ansible提供的条件机制之一,handlers和task很类似,但是他在被task通知的时候才会触发执行
2、handlers只会在所有任务执行完成后执行,而且即使被通知了多次,它也只会执行一次,handlers按照定义的顺序依次执行
httpd端口更改与触发器启动服务
---
- hosts: laowang
  remote_user: root
  tasks:
    - name: chang port
      command: sed -i 's/Listen 80/Listen 8080/g' /etc/httpd/conf/httpd.conf
      notify:       (完成任务后调用restart httpd触发器)
        - restart httpd      (调用触发器名字)
  handlers:       (配置触发器)
    - name: restart httpd     (指定触发器名字)
      service: name=httpd state=restarted (指定触发器条件为重启httpd)
...
3.角色
将多种不同的tasks的文件集中存放在某个目录下,则该目录就是角色,角色一般存放在/etc/ansible/roles/目录中,可通过ansible的配置文件来调整默认的角色目录。/etc/ansible/roles目录下有很多子目录,其中每一个子目录对应一个角色。每个角色也有自己的目录结构。
每个角色的定义,以特定的层级目录结构进行组织
1、files:存放copy或script等模块调用的文件
2、templates:存放template模块快查找所需要的模板文件的目录,如mysql配置文件等模板
3、tasks:任务存放目录
4、handlers:存放相关触发执行器的目录
5、vars:变量存放的目录
6、meta:用于存放此角色元数据
7、default:默认变量存放目录,文件中定义了此角色使用的默认变量
目录中tasks,handlers,vars,meta,default至少应该包含一个main.yml,该目录下也可以有其他的yum文件,但需要在main.yml文件中用include指定将其他的.yml文件包含进来。
有了角色之后,可以直接在yaml文件中(playbook配置文件)
可以只调用一个角色,也可以调用多个角色,当定义了角色后,用ansible-playbook PLAYBOOK文件执行即可,此时ansible会到角色集合的目录(/etc/ansible/roles)去找mysql和httpd目录,然后依次运行mysql目录和httpd目录下的所有代码
被管理主机自动安装Mriadb,安装完成后上传提前准备好的配置文件到远端主机。重启服务,然后新建testdb数据库,并允许test用户对其拥有所有权限
1。被管理主机要有yum仓库
2、配置数据库角色
mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
vim /etc/ansible/mariadb.yml (建立剧本)
---
- hosts: laowang
  remote_user: root
  roles:    (角色)
    - mariadb
...
cd /etc/ansible/roles/mariadb/
vim tasks/main.yml      (创建任务)
- name: install mariadb      (安装mariadb)
  yum: name=mariadb-server state=present
- name: move config file     (备份主配置文件)
  shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
- name: provide a new config file   (拷贝files的主配置文件到客户机/etc/my.cnf下)
  copy: src=my.cnf dest=/etc/my.cnf
- name: reload mariadb     (重启mariadb)
  shell: systemctl restart mariadb
- name: create database testdb    (建立库,并且授权账号)
  shell: mysql -uroot -e "create database testdb;grant all privileges on testdb.* to 'test'@'192.168.200.%' identified by 'test123';flush privileges;"
  notify:         (配置触发器)
  - restart mariadb
vim handlers/main.yml (创建触发器)
- name: restart mariadb
  service: name=mariadb state=restarted
cp /etc/my.cnf /etc/ansible/roles/mariadb/files/ (准备配置文件)
vim files/my.cnf (编辑配置文件,在末尾标记下,在客户机上查看配置文件是否变化)
ansible-playbook -C /etc/ansible/mariadb.yml (预执行)
ansible-playbook  /etc/ansible/mariadb.yml (部署)
4、变量
4.1在playbook中使用自定义变量
vim /etc/ansible/test_vars.yml
- hosts: laowang  
  vars:         (定义变量)
  - nm: "cloud"       (第一个nm变量)
    age: "3"        (第二个age变量)
  tasks:
  - name: "{{ nm }}"      ({{}}两对大括号引用变量,变量名两头空格)
    shell: echo "myname {{ nm }},myage{{ age }}"
    register: var_result
  - debug: var=var_result
4.2在playbook中使用ansible的内置变量
使用ansible 组名或者all全部 -m setup | more 查看 ansible 内置变量
vim /etc/ansible/test_setupvars.yml (建立内置变量测试)
- hosts: laowang
  gather_facts: True  (使用ansible内置变量)
  tasks:
  - name: setup var
    shell: echo "ip {{ ansible_ens33['ipv4']['address'] }} cpu {{ ansible_processor_count }}"
    register: var_result
  - debug: var=var_result
ansible-playbook  /etc/ansible/test_setupvars.yml
5、Template模板
配置文件如果使用copy模块去下发的话,那配置都是一样的;如果下发的配置文件里有可变的配置,需要用到template模块
模板后缀一般为xxx.j2(因为它使用jinjia2)
5.1、利用template模块下发可变的配置文件
vim /tmp/test      (建立模板)
my name is {{ myname }}
my ip is  {{ ansible_ens33['ipv4']['address'] }} ({{ ansible_all_ipv4_addresses[1] }}这个方法不对,会匹配到virbr0的IP)
vim /etc/ansible/filevars.yml  (编写模板下发脚本)
- hosts: all
  gather_facts: True   //启用内置变量
  vars:
  - myname: "cloud"
  tasks:
  - name: template test
    template: src=/tmp/test dest=/root/test
ansible-playbook  /etc/ansible/filevars.yml (测试)
【但是IP会显示virbr0网卡的IP,不知道怎么回事】
5.2、下发配置文件里面使用判断语法
vim /tmp/if.j2   (建立判断测试文件)
{% if PORT %}  (如果PORT端口存在)
ip=0.0.0.0:{{ PORT }} (则为0.0.0.0端口)
{% else %}   (否则)
ip=0.0.0.0:80   (为0.0.0.0:80)
{% endif %}   (结尾)
vim /etc/ansible/test_ifvars.yml  (建立测试剧本)
- hosts: laowang  
  vars:
  - PORT: 90   (PORT变量为90)
  tasks:
  - name: jinja2 if test
    template: src=/tmp/if.j2 dest=/root/test
ansible-playbook  /etc/ansible/test_ifvars.yml  (运行剧本)
在客户机上测试 
cat /root/test
ip=0.0.0.0:90   (查看客户机测试结果)
修改test_ifvars.yml端口
vim /etc/ansible/test_ifvars.yml
- hosts: laowang
  vars:
  - PORT:
  tasks:
  - name: jinja2 if test
    template: src=/tmp/if.j2 dest=/root/test
ansible-playbook  /etc/ansible/test_ifvars.yml
在客户机上测试
cat /root/test
ip=0.0.0.0:80
如果端口存在,则为0.0.0.0:变量端口号
如果端口不存在,则为0.0.0.0:80
posted @ 2019-12-05 14:08  elin菻  阅读(368)  评论(0编辑  收藏  举报