ansible中playbook使用及变量表示

1.playbook的功能

  • playbook是由一个或多个play组成的列表
  • playbook文件使用YAML来写的
  • 模块组成的

2.YAML(playbook使用语言)

简介

  • 是一种表达资料序列的格式,类似XML
    Yet Another Markup Language
    2001年首次发表
    www.yaml.org
  • 特点:(接近shell和python,易于上手)
    可读性好
    和脚本语言交互性好
    易于实现
    适用程序执行流梳理方式
    可扩展性强
  • 语法简介
    在文件中用[—]开始
    在文件中用[…]结尾(可省略)
    次行一般书写文件内容
    缩进严格
    大小写敏感
    key/value 可以多行书写也可一行书写,一行书写用,隔开
    value 可以是字符串,也可以是list
    一个play需要包括name和tasks
    name 是描述
    tasks是动作
    一个name只能包含一个task
    扩展名称yml或者yaml
  • yaml列表两种格式
[Linux,C++,java,python]
 - Linux
 - C++
 - java
 - python
  • YAML的字典
    字典作用存放键值
    name: westos
    age:12
    jobs:linux
    {name:“westos”, age: “12”, jobs: “linux”}
  • playbook执行命令
    ansible-playbook xxx.yml …
    –check|-C ##检测语法,预执行
    –syntax-check ##check language,只检测语法,
    –list-hosts ##列出hosts
    –list-tags ##列出tags
    –list-tasks ##列出task
    –limit ##指定执行主机
    -v -vv ##现实过程
vim test.yml
---
 - name: test yml   ##名字
  hosts: 192.168.1.212  ##主机
  tasks:    ##任务
    - name: action
      shell:
         hostname
 ansible-playbook
  • -C test.yml ##检测语法,预执行

ansible-playbook --list-hosts test.yml ##检测运行主机
ansible-playbook --list-tags test.yml ##列出tags部分
ansible-playbook --list-tasks test.yml ##列出动作,task部分
ansible-playbook --limit 192.168.1.212 test.yml -C ##指定执行主机
ansible-playbook test.yml -v ##yml详细x’h’n’j
ansible-playbook test.yml -vv

ansible中playbook使用及变量表示

vim test.yml 
---
 - name: test yml
  hosts: 192.168.1.212
  tasks:
    - name: action
      shell:
         hostname
    - name: check user ##列表中的每一个元素前必须加-,字典不加
      shell: 
         id luqq
  • ansible-playbook test.yml
  • ansible-playbook --list-task test.yml
  • playbook的核心组件
    name ##可选,建议使用多用于说明
    hosts ##受控主机列表
    tasks ##任务
    用于选择执行部分代码
  • vim 设定技巧
autocmd FileType yaml setlocal ai ts=2 sw=2 et
  • setlocal ##设定当前文件
    ai ##自动退格对齐 auto indent
    ts ##tab键长度为2空格 tabstop=2
    sw ##缩进长度为2 shiftwidth=2
    et ##把tab键变成空格 expandtab
    ansible中playbook使用及变量表示

  • 部署aphache服务:
    可以直接查找范例:ansible-doc firewalld | less

vim Apache.yml
---
 - name: Apache server
  hosts: 192.168.1.212
  tasks: 
    - name: install apache      ##安装服务
      dnf:
        name: httpd
        state: latest
        disable_gpg_check: yes

     - name: start apache      ##开启服务
       service:
         name: httpd
         state: started
         enabled: yes

     - name: firewalld setup    ##火墙设定
       firewalld:
         service: http
         permanent: yes
         state: enabled
         immediate: yes
         zone: public

      - name: create index    ###默认发布文件
        lineinfile:
          path: /var/www/html/index.html
          line:“hello,westos”
          create:yes

ansible中playbook使用及变量表示
ansible中playbook使用及变量表示

ansible中playbook使用及变量表示
ansible中playbook使用及变量表示

  • ansible-playbook test.yml

  • 部署vsftpd服务

---
- name: vsftp server
  hosts: 192.168.1.212
  tasks:
    - name: install vsftpd
      dnf:
        name: vsftpd
        state: latest

    - name: install lftp
      dnf:
        name: lftp
        state: latest

    - name: anon yes
      lineinfile:
        path: /etc/vsftpd/vsftpd.conf
        state: present
        regexp: "anonymous_enable"
        line: "anonymous_enable=YES"

    - name: start vsftpd
      service:
        name: vsftpd
        state: started
        enabled: yes

    - name: firewalld setup
      firewalld:
        service: ftp
        permanent: yes
        state: enabled

    - name: firewalld setup
      firewalld:
        service: ftp
        permanent: yes
        state: enabled
        immediate: yes
        zone: public
    - name: touch westosfile
      file:
        path: /var/ftp/westosfile
        state: touch

ansible中playbook使用及变量表示
ansible中playbook使用及变量表示
ansible中playbook使用及变量表示
ansible中playbook使用及变量表示

ansible中playbook使用及变量表示

开启dns服务
ansible中playbook使用及变量表示

ansible中playbook使用及变量表示
ansible中playbook使用及变量表示

同一模块不可进行两个相同操作
主机:由清单,事实收集或注册的任务
变量优先级设定:
狭窄范围有限与广域范围

3.变量设定和使用方法

1.在play中设定变量

- name: test 
  hosts: 192.168.1.212
  vars:
    NAME: westoslee
  tasks:
    - name: create user
      user:
        name: "{{NAME}}"
        state: present

ansible中playbook使用及变量表示
ansible中playbook使用及变量表示

2.在文件中指定变量

vim user.yml
---
NAME: westoslinux
test.yml 
---
 - name: test 
  hosts: 192.168.1.212
  vars_files: user.yml
  tasks:
    - name: create user
      user:
        name: "{{NAME}}"
        state: present
  • ansible-playbook test.yml
    ansible中playbook使用及变量表示
    ansible中playbook使用及变量表示

3.使用变量

  tasks:
    - name: create user
      user:
        name: "{{NAME}}"

ansible中playbook使用及变量表示

4.设定主机变量和清单变量

  • 在定义主机变量和清单变量时使用
    无需指定
    [westos:vars]
    NAME=westoslinux2
  • test.yml
---
- name: test 
  hosts: westos
  tasks:
    - name: create user
      user:
        name: "{{NAME}}"
        state: present

ansible中playbook使用及变量表示
ansible中playbook使用及变量表示

5.目录设定变量

group_vars ##清单变量,目录中的文件名称与主机清单名称一致
host_vars ##主机变量,目录中的文件名称与主机名称一致

 cat group_vars/westos 
---
NAME: linux
cat inventory 
[westos]
192.168.1.212
cat test.yml 
---
- name: test 
  hosts: westos
  tasks:
    - name: create user
      debug:
        msg: "{{NAME}}"

ansible中playbook使用及变量表示
ansible中playbook使用及变量表示

---
- name: test 
  hosts: 192.168.1.212
  tasks:
    - name: create user
      debug:
        msg: "{{NAME}}"

ansible中playbook使用及变量表示
ansible中playbook使用及变量表示

cat host_vars/192.168.1.100 
---
NAME: linux

ansible中playbook使用及变量表示

6.对变量进行覆盖

  • ansible-playbook test.yml -e “NAME=luqq”
    ansible中playbook使用及变量表示

7.使用数组定义变量

user1.yml 
---
USER:
  lee:
    age: 18
    obj: linux

  westos:
    age: 20
    obj: java

vim test.yml

---
- name: test 
  hosts: 192.168.1.212
  vars_files: ./user1.yml
  tasks:
    - name: create user
      debug:
        var: USER['lee']['age']

ansible中playbook使用及变量表示

---
- name: test 
  hosts: 192.168.1.212
  vars_files: ./user1.yml
  tasks:
    - name: create user
      debug:
        var: USER['lee']['age']

     - debug:
        msg: "{{USER}}"

ansible中playbook使用及变量表示

8.注册变量

register把模块输出注册到指定字符串中

vim test1.yml

---
- name: test register
  hosts: 172.25.254.109
  tasks: 
    - name: hostname command
      shell:
        hostname
      register: info
    - name: show messages
      shell: 
        echo "{{info['stdout']}}"

ansible中playbook使用及变量表示

ansible中playbook使用及变量表示ansible中playbook使用及变量表示

9.事实变量

事实变量是ansible在受控主机中自动检测出的变量
事实变量中还有与主机相关的信息

当需要使用主机相关信息时不需要采集赋值,直接调用即可
因为变量信息为系统信息所以不能随意设定仅为采集信息,古被称为事实变量

去掉ansible以外部分为ansible字典变量

---
 - name: test register
  hosts: 172.25.254.109
  gather_facts: yes   
  tasks:
    - lineinfile:
        path: /mnt/hostname
        line: "{{ansible_facts['fqdn']}}"
        create: yes

ansible中playbook使用及变量表示

ansible中playbook使用及变量表示

  • gather_facts: yes ##在playbook开启事实变量收集

10.魔法变量

hostvars ##ansible软件内部信息
group_names ##当前受管主机所在组
groups ##列出清单中所有的组和主机
inventory_hostname ##包含清单中配置的当前受控主机

ansible localhost -m debug -a "var=group_vars"
ansible localhost -m debug -a "var=inventory_hostname"

ansible中playbook使用及变量表示

ansible localhost -m debug -a "var=hostvars"

ansible中playbook使用及变量表示

ansible localhost -m debug -a "var=group_names"

ansible中playbook使用及变量表示

ansible localhost -m debug -a "var=groups"

ansible中playbook使用及变量表示

11.JINJA2模板

介绍
jinja2是python下一个被广泛应用的模板引擎
他的设计思想来源于Django的模板引擎
并扩展了其语法和一系列强大的功能
其中最显著的一个是增加了沙箱

j2模板书写规则
{# xxxxxx #} ##注释说明文件用途
127.0.0.1 localhost ##文件内容
{{ansible_facts[‘all_ipv4_adresses’]}} ##使用事实变量

for循环

{% for NAME in users %}   ##循环列表中变量
name: {{NAME['name']}}     ##输出
{% endfor %}    ##循环中止

if判定

{% if NAME['age'] is not defined %}  ##if循环判定
age: x     ##输出
{% endif %}  ##终止循环

loop.index ##循环迭代计数从1开始
loop.index0 ##循环迭代计数从0开始

cat userlist.yml

---
- name: test j2
  hosts: westos
  vars:
    users: 
      - name: westos
        age: 18
      - name: linux
      - name: lee
        age: 20
  tasks:
  - name: test j2
    template:
      src: ./test.j2
      dest: /mnt/hosts

cat test.j2

{% for NAME in users %}
name: {{NAME['name']}}
{% if NAME['age'] is defined %}
age: {{NAME['age']}}
{%endif%}
{% if NAME['age'] is not defined %}
age: x
{% endif %}
{% endfor %}

ansible中playbook使用及变量表示

ansible中playbook使用及变量表示

ansible中playbook使用及变量表示ansible中playbook使用及变量表示ansible中playbook使用及变量表示

12. Ansible的加密控制

1. ansible-vault create westos.yml  ##创建加密文件

ansible中playbook使用及变量表示

2.ansible-vault create--vault-password-file=password westos2.yml  ##不输入密码创建加密文件

ansible中playbook使用及变量表示

3.ansible-vault encrypt westos.yml  ##加密已有文件

ansible中playbook使用及变量表示

4.ansible-vault encrypt ipdns..yml --vault-password-file=password ##不输入密码加密已有文件

ansible中playbook使用及变量表示

5.ansible-vault decrypt westos.yml --vault-password-file=password   ##不输入密码解密文件

ansible中playbook使用及变量表示

6.ansible-vault view westos.yml ##查看加秘文件

ansible中playbook使用及变量表示

7.ansible-vault rekey westos1.yml  ##对加密文件重新设定密码

ansible中playbook使用及变量表示

8.ansible-vault decrypt westos1.yml --output=westos4.yml  ##将文件解密至其他文件

ansible中playbook使用及变量表示

上一篇:实战--Playbook批量更改服务器主机名


下一篇:5.0 Ansible 组织Playbook角色