首页 > 其他分享 >2、Ansible如何写playbook及playbook中使用变量

2、Ansible如何写playbook及playbook中使用变量

时间:2023-06-02 23:03:33浏览次数:64  
标签:name ubunt ansible nginx Ansible playbook root 变量

ansible的 playbook(按照yaml格式)

三种常见的数据格式

XML  JSON   YAML

YAML支持的几种常用数据类型

标量:单个的、不可再分的值
对象:键值对的集合(字典)
数组:一组按次序排列的值(列表)
playbook命令
--syntax,--syntax-check     #语法检查,功能相当于bash -n 
-C --check                  #模拟执行dry run ,只检测可能会发生的改变,但不真正执行操作 
--list-hosts                #列出运行任务的主机 
--list-tags                 #列出tag 
--list-tasks                #列出task 
--limit                     #主机列表 #只针对主机列表中的特定主机执行 
-i INVENTORY, --inventory INVENTORY #指定主机清单文件,通常一个项对应一个主机清单文件
可放在项目的文件夹下

--start-at-task START_AT_TASK #从指定task开始执行,而非从头开始,START_AT_TASK为任务的 name 
-v -vv -vvv #显示过程
playbook核心组件,写一个简单的playbook
hosts组件、tasks组件
应用在哪些主机上
案例:
[root@ubunt]# mkdir /data/ansible
[root@ubunt]# cd /data/ansible 
[root@ubunt ansible]# vim hello.yaml 
---
# 第一个playbook文件

- hosts: webservers     #被控制主机
  
  tasks:                #任务
    - name: test ping   #第一个任务,测试ping
      ping: 
    
    - name: shell cmd   #第二个任务,执行 shell命令
      shell: 'hostname -I'  
语法检查:[root@ubunt ansible]# ansible-playbook -C hello.yaml
执行:[root@ubunt ansible]# ansible-playbook  hello.yaml
把18上的nginx的配置文件拷贝到100上,并更改配置文件worker——processes 4; 

[root@ubunt ansible]# cat install_nginx.yaml 
---
#安装nginx服务

- hosts: 10.0.0.18     #部署主机
  remote_user: root    #连接时用root的身份进行连接

  tasks:               #任务
    - name: 安装包
      yum: 
        name: nginx    
        state: present #present表示安装
    - name: 配置文件
      copy:
        src: files/nginx.conf    #来源于主控端的配置文件,需要创建files文件夹,存放文件,可不写路径
        dest: /etc/nginx/nginx.conf  #复制到被控制主机的路径
    - name: 数据文件
      copy:
        src: index.html          #在files文件夹下写一个index.html文件,可不写路径
        dest: /usr/share/nginx/html/index.html    
    - name: 启动服务
      service: 
        name: nginx
        state: started   #启动
        enabled: yes     #设为开机启动

创建文件夹        
[root@ubunt ansible]# mkdir files
把nginx配置文件移动到 files中
[root@ubunt ansible]# mv nginx.conf files
写一个index.html文件
[root@ubunt ansible]# vim files/index.html
<h1>ansible website</h1>
[root@ubunt ansible]# ls
files/ hello.yaml install_nginx.yaml

[root@ubunt ansible]# ansible-playbook --syntax-check  install_nginx.yaml  语法检测

playbook: install_nginx.yaml
[root@ubunt ansible]# ansible-playbook install_nginx.yaml  执行
如果配置文件做了修改,nginx的ansible的playbook文件service需更改成restarted(重启)
控制端修改nginx配置文件端口为81,playbook文件修改service的启动方式为restarted
[root@ubunt ansible]# vim install_nginx.yaml 
---
...
省略
...
    - name: 启动服务
      service: 
        name: nginx
        state: restarted   #启动方式
        enabled: yes     #设为开机启动
[root@ubunt ansible]# ansible-playbook --syntax-check  install_nginx.yaml  语法检测

playbook: install_nginx.yaml
[root@ubunt ansible]# ansible-playbook install_nginx.yaml  执行

访问页面
10.0.0.8:81
ansible website
如果修改数据文件页面,nginx的ansible的playbook文件service不需要重启,所以playbook中当达一定条件后,选择重启服务,如配置文件改变 ----handlers触发器
handlers: 与tasks:属于同一级别(两个空格)
如:当达到某一条件后,执行handlers
---
#安装nginx服务

- hosts: 10.0.0.18
  remote_user: root
 
  tasks:
    - name: 安装包
      yum:
        name: nginx
        state: present
- name: 配置文件
      copy:
        src: files/nginx.conf
        dest: /etc/nginx/nginx.conf 
      notify: restart nginx   
    - name: 数据文件
      copy:
        src: index.html
        dest: /usr/share/nginx/html/index.html
    - name: 启动服务
      service:
        name: nginx
        state: started
        enabled: yes

  handlers:
    - name: restart nginx
      service: name=nginx state=restarted
      满足配置文件变动时执行handlers,重启nginx
限制主机清单中的单个主机执行playbook
[root@ubunt ansible]# ansible-playbook --limit 10.0.0.8 install_nginx.yaml
-i指定之际清单。把主机清单放在当前项目下,让ansible用当前目录下的主机清单,不再更改全局主机清单
拷贝全局主机清单到项目目录下
[root@ubunt ansible]# cp /etc/ansible/hosts .
[root@ubunt ansible]# ls
files/  hello.yaml  hosts  install_nginx.yaml
[root@ubunt ansible]# mv hosts inventory

指定主机清单运行playbook
[root@ubunt ansible]# ansible-playbook -i inventory
设置默认在当前目录下找主机清单,不在-i指定主机清单
拷贝主配置文件到当前目录,其优先级大于默认配置文件路径
[root@ubunt ansible]# cp /etc/ansible/ansible.cfg ansible.cfg
修改当前目录下的配置文件主机清单路径
[root@ubunt ansible]# vim ansible.cfg
inventory   = ./inventory
忽略错误:ignore_errors
如果一个task出错,默认将不会继续执行后续的其它task 
利用 ignore_errors: yes 可以忽略此task的错误,继续向下执行playbook其它task
[root@ubunt ansible]# cat test_ignore.yml 
--- 
- hosts: webservers
  tasks: 
    - name: error     
      command: /bin/false     
      ignore_errors: yes     #跳过错误,允许出错,继续执行下面任务
    - name: continue     
      command: wall continue
贴标签tags: data 贴两个标签tags: [ data , page ]
- name: 配置文件
      copy:
        src: files/ nginx.conf
        dest: /etc/nginx/nginx.conf
      notify: restart nginx
    - name: 数据文件
      copy:
        src: index.html
        dest: /usr/share/nginx/html/index.html
      tags: [ data , page ]
对页面文件进行修改
[root@ubunt ansible]# vim files/index.html
<h1>ansible website v2.0</h1>
只执行贴标签的任务
[root@ubunt ansible]# ansible-playbook -t data install_nginx_yaml


多个任务可用一个标签及一个动作可用多个标签
- name: 配置文件
      copy:
        src: files/ nginx.conf
        dest: /etc/nginx/nginx.conf
      notify: restart nginx
      tags: data
    - name: 数据文件
      copy:
        src: index.html
        dest: /usr/share/nginx/html/index.html
      tags: data

按照page标签执行
[root@ubunt ansible]# ansible-playbook -t page install_nginx_yaml
playbook中使用变量(变量名:仅能由字母、数字和下划线组成,且只能以字母组成)

变量来源:

1、ansible 的 setup facts 远程主机的所有变量都可直接调用根据变量生成文件
2、通过命令行指定变量,优先级最高
ansible-playbook -e varname=value test.yml
3、在playbook文件中定义
vars:
  var1: value1 
  var2: value2
4、在独立的变量YAML文件中定义
- hosts: all 
  vars_files:
    - vars.yml
5、在主机清单文件中定义
6、在项目中针对主机和主机组定义 (在项目目录中创建 host_vars和group_vars目录)
7、在role中定义

变量的优先级从高到低如下

-e选项定义变量-->playbook中vars_files-->playbook中vars变量定义-->host_vars/主机名文件-->主机清单中主机变量-->group_/主机名文件-->主机清单中主机变量-->组/主机组名文件-->组_vars/all文件-->主机清单组变量

变量调用方式:

通过{{ variable_name }}调用变量,且变量名前后建议加空格,有时用"{{variable_name}}"才生效
1、用set up模块取内置变量并把变量引用

范例:本地连接(可以复用,节省主机)

[root@ubunt ansible]# vim inventory
127.0.0.1 ansible_connection=local
[root@ubunt ansible]# ansible localhost -m setup  执行查看,其中可以用set up模块把变量引用
[root@ubunt ansible]# vim var1.yaml
- hosts: webservers
  
  tasks:
  - name: create file
    file:
      name: /tmp/{{ ansible_fqdn }}.log
      state: touch
[root@ubunt ansible]# ansible-playbook var1.yaml  
去webservers下的主机/tmp/下去查看,是否有主机名+log的文件

修改主机名(不能设置gather_facts:no,设置之后set up模块收集不了主机信息)

- hosts: webservers
  
  tasks:
  - name: create file
    file:
      name: /tmp/{{ ansible_hostname }}.log
      state: touch
  - name: change hostname
    hostname:
      name: "ubuntu-{{ ansible_eth0.ipv4.address.split('.')[-1] }}" 
[root@ubuntu2004 ~]#hostname -I
ubuntu-101
性能优化
每次执行playbook,默认会收集每个主机的所有facts变量,将会导致速度很慢,可以采用下面方法加速
当使用 gather_facts: no 关闭 facts,确实能加速 Ansible 执行,但是有时候又需要使用 facts 中的内 容,还希望执行的速度快,这时候可以设置facts 的缓存,将facts变量信息存在redis服务器中

[root@ansible ~]# cat /etc/ansible/ansible.cfg 
[defaults] 
# smart 表示默认收集 facts,但 facts 已有的情况下不会收集,即使用缓存facts 
# implicit 表示默认收集 facts,要禁止收集,必须使用 gather_facts: False 
# explicit 则表示默认不收集,要显式收集,必须使用gather_facts: True 

gathering = smart                           #在使用 facts 缓存时设置为smart 
fact_caching_timeout = 86400                #缓存时长 fact_caching = redis #缓存存在redis中 fact_caching_connection = 10.0.0.100:6379:0 #0表示redis的0号数据库 #若redis设置了密码 fact_caching_connection = 10.0.0.100:6379:0:password

范例

[root@ubunt ansible]# apt -y install redis
[root@ubunt ansible]# vim ansible.cfg
inventory      = ./inventory      
gathering = smart
fact_caching_timeout = 86400
fact_caching_connection = 127.0.0.1:6379:0

先执行进行收集到redis中
[root@ubunt ansible]# ansible-playbook var1.yaml  
然后加上gather_facts: no不收集
- hosts: webservers
  gather_facts: no
  tasks:
  - name: create file
    file:
      name: /tmp/{{ ansible_hostname }}.log
      state: touch
  - name: change hostname
    hostname:
      name: "ubuntu-{{ ansible_eth0.ipv4.address.split('.')[-1] }}"
2、register注册变量
在playbook中可以使用register将捕获命令的输出保存在临时变量中,方便后续调用此变量,比如可以使用debug模块进行显示输出

范例:利用debug 模块输出变量
[root@ubunt ansible]# vim register.yaml
- hosts: dbservers 
  tasks:    
    - name: get variable     
      shell: hostname     
      register: name    
    - name: "print variable"     
      debug:       
        msg: "{{ name }}"
执行playbook
[root@ubunt ansible]# ansible-playbook register.yaml

只取出stdout的键值信息
[root@ubunt ansible]# vim register.yaml
- hosts: dbservers 
  tasks:    
    - name: get variable     
      shell: hostname     
      register: name    
    - name: "print variable"     
      debug:       
        #msg: "{{ name }}"
        msg: "{{ name.stdout }}" 
执行playbook
[root@ubunt ansible]# ansible-playbook register.yaml

分行打印
[root@ubunt ansible]# vim register.yaml
- hosts: dbservers 
  tasks:    
    - name: get variable     
      shell: ss -ntl     
      register: name    
    - name: "print variable"     
      debug:       
        #msg: "{{ name }}"
        msg: "{{ name.stdout_lines }}" 
执行playbook
[root@ubunt ansible]# ansible-playbook register.yaml
3、在playbook命令行中定义变量
范例:
[root@ubunt ansible]# vim var2.yaml
- hosts: webservers 
  remote_user: root 
  tasks: 
    - name: install package
      yum: name={{ pkname }} state=present 
给变量赋值      
[root@ubunt ansible]# ansible-playbook -e pkname=httpd var2.yml
4、在playbook文件中定义变量
范例:
[root@ubunt ansible]# vim var2.yaml
- hosts: webservers 
  remote_user: root 
  vars:
    pkname: apache2
  tasks: 
    - name: install package
      yum: name={{ pkname }} state=present 
给变量赋值      
[root@ubunt ansible]# ansible-playbook var2.yml
5、使用专用的公共的变量文件
可以在一个独立的playbook文件中定义公共变量,在其它的playbook文件中可以引用变量文件中的变量 
此方式比playbook中定义的变量优化级高

范例:
[root@ubunt ansible]# vim vars.yml
pkname: redis

引用变量
[root@ubunt ansible]# vim var3.yaml
- hosts: webservers 
  remote_user: root 
  vars_files:
    -vars.yaml   
  tasks: 
    - name: "install package {{ pkname }}"
      yum: name={{ pkname }} state=present
6、在主机清单中定义主机和主机组的变量
[root@ubunt ansible]# vim inventory
[webservers]
10.0.0.101     #主机变量,只针对101有效  host=web01
10.0.0.102     #主机变量,只针对102有效  host=web02

[webservers:vars] #分组变量,只针对webservers组下的主机有效
domain=meng

[appservers]
10.0.0.[7:8]
127.0.0.1 ansible_connection=local

[all:vars]       #针对所有分组都有效的变量
suffix=edu

引用变量
[root@ubunt ansible]# vim var3.yaml
- hosts: webservers
  tasks: set hostname
  hostnama: 
    name: "{{ host }}. {{ domain }}. {{ suffix }}"
执行并去查看是否更改
[root@ubunt ansible]# ansible-playbook var3.yaml

标签:name,ubunt,ansible,nginx,Ansible,playbook,root,变量
From: https://blog.51cto.com/mfc001/6405601

相关文章

  • 3、Ansible高级功能--loop、until循环,with_lines逐行处理,条件判断when等
    ansible的高级功能1、loop循环迭代:当有需要重复性执行的任务时,可以使用迭代机制范例:初始化安装软件包----hosts:webserversremote_user:roottasks-name:installsomepackagesyum:name={{item}}state=presentwith_items:......
  • 4、Ansible模板--用于根据每个主机的不同环境而为生成不同的文件
    ansible模板模板是一个文本文件,可以用于根据每个主机的不同环境而为生成不同的文件模板文件中支持嵌套jinja2语言的指令,来实现变量,条件判断,循环等功能需要使用template模块实现文件的复制到远程主机,但和copy模块不同,复制过去的文件每个主机可以会有所不同jinja2语言http:......
  • 可执行文件的内存模型,变量的值是放在栈上还是放在堆上
    作者:@古明地盆喜欢这篇文章的话,就点个关注吧,或者关注一下我的公众号也可以,会持续分享高质量Python文章,以及其它相关内容。:点击查看公众号楔子作为开发者,我们一辈子会经历很多工具、框架和语言,但是这些东西无论怎么变,底层逻辑都是不变的。所以今天我们就回头重新思考编程中那些耳......
  • Vue3 reactive 定义一个变量时,如何具有响应式?
    错误示范:constarr=reactive([]);constload=()=>{constres=[2,3,4,5];//假设请求接口返回的数据//方法1失败,直接赋值丢失了响应性//arr=res;//方法2这样也是失败//arr.concat(res);//方法3可以,但是很麻烦res.forEach(e=>{......
  • 伪元素显示变量值的方法
    1.使用attr引用父元素属性<lidata-name="小明">li::after{content:attr(data-name);}2.非content属性可以直接引用css变量<listyle="--width:40px"></li>li::after{content:attr(data-name);width:var(--width)}3.co......
  • php thinkphp 使用系统环境变量
    1.问题,打印$_ENV为空,thinkphpenv()函数和ENV::get()都获取不到系统的环境变量  在docker运行环境的时候,指定了环境变量, 可以使用getenv()函数获取,也可以在php.ini中修改配置  variables_order="EGPCS" Thisdirectivedetermineswhichsuperglobalarrays......
  • 四、python变量
    四、变量1.变量的特点可以反复存储数据可以反复取出数据可以反复更改数据2.变量的命名规则变量名只能是字母、数字或下划线的任意组合变量名的第一个字符不能是数字变量名要有见名知义的效果,如UserName,user_name变量名区分大小写以下关键字不能声明为变量名(关键字......
  • R语言Lasso回归模型变量选择和糖尿病发展预测模型|附代码数据
    全文链接:http://tecdat.cn/?p=22721最近我们被客户要求撰写关于Lasso回归的研究报告,包括一些图形和统计输出。LeaseAbsoluteShrinkageandSelectionOperator(LASSO)在给定的模型上执行正则化和变量选择 ( 点击文末“阅读原文”获取完整代码数据******** )。根据惩罚项的大小......
  • Grafana Query类型模板变量的使用
    一、背景假设我有2种类型的服务器,一种是本地电脑(每个指标名称都存在{nodename=‘mac-local’}),一种是阿里云服务器(每个指标名称都存在{nodename=‘aliyun’}),同时每个指标下都存在一个{instance=‘具体的服务器的ip地址’}标签。即我们采集的时间序列大致上都有如下标签:eg:no......
  • 【Haxe】(二)字符串与变量的输入输出
    前言每次学习一门新语言,各种手册和教程一上来就是讲变量如何定义,数据结构怎么用,很少有讲输入输出应该怎么写的。我比较喜欢先搞懂这部分,这让我感觉像是掌握了学习主动权,很能调动我的学习积极性。于是我的第一篇笔记就打算记录Haxe语言的输入输出语句怎么使用,算是用自己的笔记弥......