ansible 플레이 북 사용 설명 및 테스트 demo

ansible 작업 수행 모드:
Ansible 시스템 은 호스트 가 관 리 된 노드 에 대한 조작 방식 을 제어 하 는 두 가지 로 나 눌 수 있 습 니 다. 즉, adhoc 와 playbook 입 니 다.
(1) ad - hoc 모드 (점 대 점 모드)
단일 모듈 을 사용 하여 단일 명령 을 대량으로 실행 할 수 있 습 니 다.ad - hoc 명령 은 빠르게 입력 할 수 있 는 명령 이 며 저장 할 필요 가 없 는 명령 입 니 다.bash 의 한 마디 셸 에 해당 합 니 다.
(2) 플레이 북 모드
Ansible 의 주요 관리 방식 이자 Ansible 기능 이 강 한 관건 이다.플레이 북 은 웹 서비스의 설치 배치, 데이터베이스 서버 의 대량 백업 등 여러 task 집합 을 통 해 하나의 기능 을 완성 합 니 다.플레이 북 을 여러 개의 ad - hoc 작업 을 조합 한 프로필 로 간단하게 이해 할 수 있 습 니 다.
YAML 소개
YAML(/ˈjæməl/, 끝소리 가 camel 낙타 와 유사) 는 가 독성 이 높 아 데이터 의 서열 화 를 표현 하 는 형식 이다.
YAML 은 'YAML Ain' t a Markup Language '(YAML 은 표기 언어 가 아 님) 의 재 귀적 약자 다.이런 언어 를 개발 할 때 YAML 은 'Yet Another Markup Language' (여전히 표기 언어) 라 는 뜻 이지 만 이 언어 는 표기 언어 가 아 닌 데이터 중심 이라는 것 을 강조 하기 위해 역방향 줄 임 말로 이름 을 바 꾸 었 다.
YAML 의 문법 은 다른 고급 언어 와 유사 하 며 목록, 산 목록, 스칼라 등 데이터 형 태 를 간단하게 표현 할 수 있다.이 는 공백 기호 들 여 쓰기 와 외관 에 의존 하 는 특색 을 사용 합 니 다. 특히 데이터 구조, 각종 프로필, 디 버 깅 내용, 파일 대강 (예 를 들 어 많은 이메일 제목 형식 과 YAML 이 매우 비슷 합 니 다) 을 표현 하거나 편집 하 는 데 적합 합 니 다.YAML 의 설정 파일 접 두 사 는. yml 입 니 다. 예 를 들 어 test. yml 입 니 다.
1.1 YAML 기본 문법
  • 대소 문자 가 민감 하 다
  • 들 여 쓰기 로 등급 관 계 를 나타 낸다
  • 들 여 쓰기 tab 사용 불가, 빈 칸 만 허용
  • 들 여 쓰 는 빈 칸 수 는 중요 하지 않 습 니 다. 같은 등급 의 요소 가 왼쪽 으로 정렬 하면 됩 니 다
  • '\#' 는 주석 을 나타 낸다
  • 1.2 YAML 데이터 형식
  • 대상: 키 쌍 의 집합, 맵 (mapping)/= 해시 (hashes)/사전 (dictionary)
  • 배열: 한 조 가 순서대로 배열 한 값 을 서열 (sequence)/목록 (list)
  • 이 라 고도 부른다.
  • 순 량 (scalars): 단일, 재 분 할 수 없 는 값
  • 1.2.1 대상
    #(1)格式为key: value,冒号后面加一个空格
    url: http://192.168.20.1
    #(2)表示server: {host: node1}
    server:
        host: node1
    #(3)使用缩进表示层级关系
    key: 
        key1: value1
        key2: value2
    #上面还支持流式(flow)语法表示对象
    key: {key1: value1, key2: value2}
    

    1.2.2 배열
    짧 은 가로줄 에 빈 칸 을 추가 하면 배열 항목 을 대표 합 니 다.
    #(1)表示server为[node1,node2,node3]
    server:
        - node1
        - node2
        - node3
    #(2)表示[[python,java]]
    -
        - python
        - java
    #(3)表示companies属性是一个数组,每一个数组元素又是由id,name,price三个属性构成
    note:
        -
            id: 1
            name: book1
            price: 20
        -
            id: 2
            name: book2
            price: 50
    #上面数组也可以使用流式(flow)的方式表示:
    note: [{id: 1,name: book1,price: 20},{id: 2,name: book2,price: 50}]
    

    1.2.3 상수
    상수 구조, 정수, 부동 소수점, 문자열, NULL, 날짜, 불, 시간 포함
    boolean: 
        - TRUE  #true,True都可以
        - FALSE  #false,False都可以
    float:
        - 3.14
        - 6.8523015e+5  #可以使用科学计数法
    int:
        - 123
        - 0b1010_0111_0100_1010_1110    #二进制表示
    null:
        Name: 'node'
        parent: ~  #使用~表示null
    string:
        - 测试
        - 'Hello world'  #可以使用双引号或者单引号包裹特殊字符
        - line1
          line2    #字符串可以拆成多行,每一行会被转化成一个空格
    date:
        - 2020-04-02    #日期必须使用ISO 8601格式,即yyyy-MM-dd
    datetime: 
        -  2020-04-02T15:02:31+08:00    #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
    

    1.2.4 특수 기호
    # (1)--- YAML可以在同一个文件中,使用---表示一个文档的开始;也常常使用---来分割不同的内容,比如记录日志
    ---
    Time: 2020-04-02T15:02:31+08:00
    User: ed
    Warning:
         This is an error message for the log file
    ---
    Time: 2020-04-02T15:05:21+08:00
    User: ed
    Warning:
        A slightly different error message.
    
    #(2)... 和---配合使用,在一个配置文件中代表一个文件的结束,下面例子相当于在一个yaml文件中连续写了两个yaml配置项
    ---
    time: 20:03:20
    player: tom
    action: run
    ...
    ---
    time: 20:03:47
    player: Lily
    action: run
    ...
    
    #(3)!! YAML中使用!!做类型强行转换,例如把数字和布尔类型强转为字符串
    string:
        - !!str 54321
        - !!str true
    #将数组解析为set,简单理解,转化的内容就是:[{aaa=58}, {bbb=65}, {ccc=63}],重复的ccc去掉
    --- !!set
    - bbb: 65
    - ccc: 63
    - ccc: 63
    - aaa: 58
    
    #(4)>在字符串中折叠换行,| 保留换行符
    context: > 
     this is
     a book
    stats: |
     today is
     sunday
     #结果是:
    context=this is a book #换行符转化成了空格;每行的文本前一定要有一个空格
     stats= today is
     sunday
     
    #(5)引用
    #重复的内容在YAML中可以使用&来完成锚点定义,使用*来完成锚点引用
    hr:
    - aa
    - &SS bb
    rbi:
    - *SS 
    - cc
    #结果为:
    {rbi=[bb, cc], hr=[aa, bb]}
    
    #(6)合并
    test:
      - &SMALL { x: 1, y: 2 }
      - &BIG { r: 10 }
     
    exp2:
        << : [ *SMALL, *BIG ]
        other: haha
        
    exp3:
        << : [ *SMALL, *BIG ]
        r: 100
    #exp2中,<<: x="1," y="2," r="10}"/>

    2. ansible 플레이 북 관련 소개
    2.1 ansible palybook 의 핵심 요소
  • Hosts 가 실행 하 는 원 격 호스트 목록
  • Tasks 작업, 템 플 릿 이 정의 하 는 작업 목록
  • Variables 내 장 된 변수 나 사용자 정의 변 수 를 playbook 에서 호출 합 니 다
  • Templates 템 플 릿, 즉 템 플 릿 문법 을 사용 하 는 파일, 예 를 들 어 설정 파일 등
  • Handlers 와 notity 를 결합 하여 사용 하고 특정한 조건 에 의 해 촉발 되 는 조작 은 조건 을 만족 시 켜 야 집행 하 며 그렇지 않 으 면 집행 하지 않 는 다
  • tags 태그 입 니 다. 어떤 작업 을 수행 할 지 지정 합 니 다. 플레이 북 의 일부 코드 를 선택 하 는 데 사 용 됩 니 다.
  • 역할: 캐릭터
  • 2.2 플레이 북 의 기본 구성 요소
    - Hosts:运行指定任务的目标主机
    - remote_user:在远程主机上执行任务的用户
        sudo_user
    - tasks:任务列表
        模块,模块参数;
        格式:(1)action:module arguments
              (2)module:arguments
        注意:shell和command模块后面直接跟命令,而非key=value类的参数列表;
    1)某任务的状态在运行后为changed时,可通过"notify"通知给相应的handlers;
    2)任务可以通过"tags"打标签,而后可在ansible-palybook命令上使用-t指定进行调用;
    

    2.3 hosts 와 users 소개
    ---
    - hosts: abc                   #可以是一个主机组、主机、多个主机,中间以冒号分隔,也可以用all参数表示所有主机
        remote_user: root          #表示执行的用户账号
        become: yes                #2.6版本以后的参数,之前是sudo,意思为切换用户运行
        become_user: mysql         #指定sudo用户为mysql
    become 和become_user 作为指定远程主机sudo切换用
    

    2.4 Tasks list 와 action 소개
    1、Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务。
     
    2、在运行playbook时(从上到下执行),如果一个host执行task失败,整个tasks都会回滚,请修正playbook 中的错误,然后重新执行即可。
     
    3、每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。
       如果没有定义name,‘action’的值将会用作输出信息中标记特定的task。
        
    4、定义一个task,常见的格式:”module: options” 例如:yum: name=httpd
     
    5、ansible的自带模块中,command模块和shell模块无需使用key=value格式
    

    2.5 ansible 플레이 북 상용 명령
    # ansible-playbook first.yml --syntax-check    #检查yaml文件的语法是否正确
    # ansible-playbook first.yml --list-task       #检查tasks任务
    # ansible-playbook first.yml --list-hosts      #检查生效的主机
    # ansible-playbook first.yml --start-at-task='Copy Nginx.conf'     #指定从某个task开始运行
    # ansible-playbook first.yml -k      #用来交互输入ssh密码
    # ansible-playbook first.yml -K      #用来交互输入sudo密码
    # ansible-playbook first.yml -u      #指定用户
    

    ansible 플레이 북 실행 매개 변수 설명
    실행 방식: ansible - playbook playbook. yml [options]
    -u REMOTE_USER, --user=REMOTE_USER 
    # ssh连接的用户名
     
     -k, --ask-pass   
    #ssh登录认证密码
     
     -s, --sudo          
    #sudo 到root用户相当于Linux系统下的sudo命令
     
     -U SUDO_USER, --sudo-user=SUDO_USER   
    #sudo到对应的用户
     
     -K, --ask-sudo-pass    
    #用户的密码(—sudo时使用)
     
     -T TIMEOUT, --timeout=TIMEOUT
    # ssh连接超时,默认10秒
     
     -C, --check     
    # 指定该参数后,执行playbook文件不会真正去执行,而是模拟执行一遍,然后输出本次执行会对远程主机造成的修改
     
     -e EXTRA_VARS, --extra-vars=EXTRA_VARS   
    # 设置额外的变量如:key=value形式或者 YAML or JSON,以空格分隔变量,或用多个-e
     
     -f FORKS, --forks=FORKS   
    # 进程并发处理,默认5
     
     -i INVENTORY, --inventory-file=INVENTORY  
    # 指定 hosts 文件路径,默认 default=/etc/ansible/hosts
     
     -l SUBSET, --limit=SUBSET   
    # 指定一个pattern,对-hosts:匹配到的主机再过滤一次
     
     --list-hosts 
    # 只打印有哪些主机会执行这个playbook文件,不是实际执行该playbook
     
     --list-tasks  
    # 列出该playbook中会被执行的task
     
     --private-key=PRIVATE_KEY_FILE  
    # 私钥路径
     
     --step   
    # 同一时间只执行一个task,每个task 执行前都会提示确认一遍
     
     --syntax-check 
    # 只检测playbook文件语法是否有问题,不会执行该playbook
     
     -t TAGS, --tags=TAGS  
    #当play和task的tag为该参数指定的值时才执行,多个tag以逗号分隔
     
     --skip-tags=SKIP_TAGS  
    # 当play和task的tag不匹配该参数指定的值时,才执行
     
     -v, --verbose  
    #输出更详细的执行过程信息,-vvv可得到所有执行过程信息。
    

    2.6 플레이 북 을 실행 하 는 방식
    2.6.1 테스트
    #只检测可能会发生的改变,但不真正执行操作
    ansible-playbook --check
    #列出运行任务的主机
    ansible-playbook --list-hosts
    

    2.6.2 플레이 북 실행
    [root@localhost playbooks]# cat first.yaml 
    - hosts: all
      remote_user: root
      tasks:
      - name: install redis
        yum: name=redis state=latest
      - name: start redis
        service: name=redis state=started enabled=true
    
    #语法检测
    [root@localhost playbooks]# ansible-playbook --syntax-check first.yaml 
    
    playbook: first.yaml
    
    #列出运行任务的主机
    [root@localhost playbooks]# ansible-playbook --list-hosts first.yaml 
    
    playbook: first.yaml
    
      play #1 (all): all	TAGS: []
        pattern: [u'all']
        hosts (1):
          192.168.75.128
    
    #列出任务和主机
    [root@localhost playbooks]# ansible-playbook --list-hosts --list-tasks first.yaml 
    
    playbook: first.yaml
    
      play #1 (all): all	TAGS: []
        pattern: [u'all']
        hosts (1):
          192.168.75.128
        tasks:
          install redis	TAGS: []
          start redis	TAGS: []
    
    #执行playbook文件不会真正去执行,而是模拟执行一遍,然后输出本次执行会对远程主机造成的修改
    [root@localhost playbooks]# ansible-playbook -C first.yaml  
    #开始运行YAML文件,按任务逐个执行
    [root@localhost playbooks]# ansible-playbook  first.yaml 
    
    PLAY [all] **************************************************************************
    
    TASK [Gathering Facts] **************************************************************
    ok: [192.168.75.128]
    
    TASK [install redis] ****************************************************************
    changed: [192.168.75.128]
    
    TASK [start redis] ******************************************************************
    changed: [192.168.75.128]
    
    PLAY RECAP **************************************************************************
    192.168.75.128             : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
    
    #查看备机已启动
    [root@localhost ~]# ps -ef | grep redis
    redis     73031      1  0 03:17 ?        00:00:08 /usr/bin/redis-server 127.0.0.1:6379
    root      74017  73983  0 04:36 pts/0    00:00:00 grep --color=autoredis
    
    

    원 격 서버 의 redis 설정 처리
    #将远程主机的配置文件复制到本地
    [root@localhost playbooks]# ansible 192.168.75.128 -m fetch -a "src=/etc/redis.conf dest=./"
    #修改配置文件redis.conf内容
    [root@localhost playbooks]# ls
    192.168.75.128  file1.yml  first.yaml
    [root@localhost playbooks]# mv 192.168.75.128/etc/redis.conf ./
    [root@localhost playbooks]# rm -rf 192.168.75.128
    #更改redis.conf
    bind 0.0.0.0
    requirepass changecan
    
    #更改yaml,将已修改配置文件传到远程主机
    [root@localhost playbooks]# cat first.yaml 
    - hosts: all
      remote_user: root
      tasks:
      - name: install redis
        yum: name=redis state=latest
      - name: copy config file
        copy: src=/root/playbooks/redis.conf dest=/etc/redis.conf owner=redis
      - name: start redis
        service: name=redis state=started enabled=true
    [root@localhost playbooks]# ansible-playbook --syntax-check first.yaml
    [root@localhost playbooks]# ansible-playbook -C first.yaml
    [root@localhost playbooks]# ansible-playbook first.yaml #结果显示:只执行了传配置文件这一项
    

    2.7 playbooks 구성 요소: handlers 가 특정 조건 에 대해 작업 을 수행 합 니 다.
    #当redis.conf内容复制发生改变,则执行重启
    [root@localhost playbooks]# cat second.yaml 
    - hosts: all
      remote_user: root
      tasks:
      - name: install redis
        yum: name=redis state=latest
      - name: copy config file
        copy: src=/root/playbooks/redis.conf dest=/etc/redis.conf owner=redis
        notify: restart redis
        tags: configfile
      - name: start redis
        service: name=redis state=started enabled=true
      handlers:
      - name: restart redis
        service: name=redis state=restarted
    #更改redis.conf再测试执行,会触发restart重启redis操作。若redis.conf内容不变,则不会触发重启
    [root@localhost playbooks]# ansible-playbook second.yaml
    
    PLAY [all] *********************************************************************
    
    TASK [Gathering Facts] *********************************************************
    ok: [192.168.75.128]
    
    TASK [install redis] ***********************************************************
    ok: [192.168.75.128]
    
    TASK [copy config file] ********************************************************
    changed: [192.168.75.128]
    
    TASK [start redis] *************************************************************
    ok: [192.168.75.128]
    
    RUNNING HANDLER [restart redis] ************************************************
    changed: [192.168.75.128]
    
    PLAY RECAP *********************************************************************
    192.168.75.128             : ok=5    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    
    #只执行指定标签tags:名为configfile标记的任务
    [root@localhost playbooks]# ansible-playbook -t configfile second.yaml 
    
    PLAY [all] *********************************************************************
    
    TASK [Gathering Facts] *********************************************************
    ok: [192.168.75.128]
    
    TASK [copy config file] ********************************************************
    ok: [192.168.75.128]
    
    PLAY RECAP *********************************************************************
    192.168.75.128             : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    
    

    2.8 playbook 구성 요소: Variables 내장 변수 또는 사용자 정의 변수
    (1)facts:可直接调用
        注意:可使用setup模块直接获取目标主机的facters;
         ansible-playbook -m setup
    (2)用户自定义变量:
        (a)ansible-playbook命令的命令行中的自定义变量;
            -e VARS, --extra-vars=VARS
        
        (b)在playbook中定义变量的方法:
            vars:
            - var1: value1
            - var2: value2
        变量引用:{{ variable }}
        
    (3)通过roles传递变量;
    (4)Host Inventory主机清单
        (a)用户自定义变量
        (i)向不同的主机传递不同的变量;
            IP/HOSTNAME variable=value var2=value2
        (ii)向组中的主机传递相同的变量;
            [groupname:vars]
            variable=value
        (b)invertory参数
        用于定义ansible远程连接目标主机时使用的参数,而非传递给playbook的变量;
            ansible_ssh_host
            ansible_ssh_port
            ansible_ssh_user
            ansible_ssh_pass
            ansible_sudo_pass
    

    2.8.1 (1) facts: 직접 호출 가능
    메모: setup 모듈 을 사용 하여 대상 호스트 의 facters 를 직접 가 져 올 수 있 습 니 다.
    ansible-playbook -m setup
    
    #例如:调用ansible_env变量获取远程主机信息
    [root@localhost playbooks]# cat third.yaml 
    - hosts: 192.168.75.128
      remote_user: root
      tasks:
      - name: copy file
        copy: content={{ ansible_env }} dest=/tmp/ansible.env
    [root@localhost playbooks]# ansible-playbook --syntax-check third.yaml
    [root@localhost playbooks]# ansible-playbook third.yaml
    [root@128 ~]# cat /tmp/ansible.env 
    {"LANG": "en_US.UTF-8", "TERM": "xterm", "SHELL": "/bin/bash", "XDG_RUNTIME_DIR": "/run/user/0", "MAIL": "/var/mail/root", "SHLVL": "2", "SSH_TTY": "/dev/pts/1", "SSH_CLIENT": "192.168.75.129 40590 22", "LESSOPEN": "||/usr/bin/lesspipe.sh %s", "PWD": "/root", "SELINUX_USE_CURRENT_RANGE": "", "LOGNAME": "root", "USER": "root", "PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin", "HOME": "/root", "SELINUX_LEVEL_REQUESTED": "", "XDG_SESSION_ID": "177", "SELINUX_ROLE_REQUESTED": "", "_": "/usr/bin/python", "SSH_CONNECTION": "192.168.75.129 40590 192.168.75.128 22"}
    

    2.8.2 (2) ansible - playbook 사용자 정의 변수;
        (a)ansible-playbook命令的命令行中的自定义变量;
            -e VARS, --extra-vars=VARS
        
        (b)在playbook中定义变量的方法:
            vars:
            - var1: value1
            - var2: value2
        变量引用:{{ variable }}
    
    #安装包使用变量表示
    [root@localhost playbooks]# cat forth.yaml 
    - hosts: all
      remote_user: root
      tasks:
      - name: install {{ pkgname }}
        yum: name={{ pkgname }} state=latest
    #安装nginx
    [root@localhost playbooks]# ansible-playbook -e pkgname=nginx forth.yaml 
    
    PLAY [all] *********************************************************************
    
    TASK [Gathering Facts] *********************************************************
    ok: [192.168.75.128]
    
    TASK [install nginx] ***********************************************************
    changed: [192.168.75.128]
    
    PLAY RECAP *********************************************************************
    192.168.75.128             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
    

    2.8.3 (4) 호스트 인 벤 토리 호스트 목록
        (a)用户自定义变量
        (i)向不同的主机传递不同的变量;
            IP/HOSTNAME variable=value var2=value2
        (ii)向组中的主机传递相同的变量;
            [groupname:vars]
            variable=value
        (b)invertory参数
        用于定义ansible远程连接目标主机时使用的参数,而非传递给playbook的变量;
            ansible_ssh_host
            ansible_ssh_port
            ansible_ssh_user
            ansible_ssh_pass
            ansible_sudo_pass
    

    (i) 서로 다른 호스트 에 서로 다른 변 수 를 전달 합 니 다.
    #测试:添加用户changecan
    [root@localhost playbooks]# cat users.yaml 
    - hosts: all
      remote_user: root
      tasks:
      - name: add user
        user: name=changecan system=no state=present
      - name: set password
        shell: echo changecan | passwd --stdin changecan
    [root@localhost playbooks]# ansible-playbook users.yaml
    #测试用户添加成功
    [root@localhost playbooks]# ssh -l changecan 192.168.75.128
    [email protected]'s password: 
    [changecan@128 ~]$
    
    #更改主机清单的配置
    [root@localhost playbooks]# cat /etc/ansible/hosts 
    [websrvs]
    192.168.75.128 ansible_ssh_user=changecan ansible_ssh_pass=changecan
    
    #测试主机清单普通用户使用权限
    [root@localhost playbooks]# ansible websrvs --list-hosts
      hosts (1):
        192.168.75.128
    [root@localhost playbooks]# ansible websrvs -m ping
    [root@localhost playbooks]# ansible websrvs -m command -a "whoami"
    192.168.75.128 | CHANGED | rc=0 >>
    changecan
    

    (ii) 그룹의 호스트 에 같은 변 수 를 전달 합 니 다.
    [root@localhost playbooks]# cat /etc/ansible/hosts
    [websrvs]
    192.168.75.128 
    
    [websrvs:vars]
    http_port=8080
    [root@localhost playbooks]# cat vars.yaml 
    - hosts: websrvs
      remote_user: root
      vars:
      - pbvar: playbook variable testing
      tasks:
      - name: command line variable
        copy: content={{ cmdvar }} dest=/tmp/cmd.var
      - name: playbook variables
        copy: content={{ pbvar }} dest=/tmp/pb.var
      - name: host iventory variables
        copy: content={{ http_port }} dest=/tmp/hi.var
    [root@localhost playbooks]# ansible-playbook -e cmdvar="command" vars.yaml
    
    PLAY [websrvs] *****************************************************************
    
    TASK [Gathering Facts] *********************************************************
    ok: [192.168.75.128]
    
    TASK [command line variable] ***************************************************
    changed: [192.168.75.128]
    
    TASK [playbook variables] ******************************************************
    changed: [192.168.75.128]
    
    TASK [host iventory variables] *************************************************
    changed: [192.168.75.128]
    
    PLAY RECAP *********************************************************************
    192.168.75.128             : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    
    [root@128 ~]# cat /tmp/cmd.var 
    command[root@128 ~]# cat /tmp/pb.var 
    playbook variable testing[root@128 ~]# cat /tmp/hi.var 
    8080
    

    2.9 Templates 템 플 릿, 즉 템 플 릿 문법 을 사용 하 는 파일, 예 를 들 어 설정 파일 등
    템 플 릿 기반 파일 을 원 격 호스트 로 복사 합 니 다.
    *src=
    *dest=
    owner=
    group=
    mode=
    

    2.9.1 Jinja2
    字面量:
        字符串:使用单引号或双引号;
        数字:整数,浮点数;
        列表:[item1, item2, ...]
        元组:(item1 item2, ...)
        字典:{key1:value1, key2:value2, ...}
        布尔型:true/false
    算数运算:
        +, -, *, /, //, %, **
    比较操作:
        ==, !=, >, >=,

    2.9.2 예시 1 redis 본 서버 IP 감청
    수 정 된 프로필 bind {{ansible eno 167777736. ipv4. address}} 을 통 해 원 격 호스트 ip 주 소 를 가 져 와 매개 변 수 를 전달 합 니 다.
    [root@localhost playbooks]# cat /root/playbooks/redis.conf.j2 | grep -v "^$" | grep -v "^#"
    bind {{ ansible_eno16777736.ipv4.address }}
    protected-mode yes
    port 6379
    tcp-backlog 511
    timeout 0
    tcp-keepalive 300
    daemonize no
    supervised no
    pidfile /var/run/redis_6379.pid
    loglevel notice
    logfile /var/log/redis/redis.log
    databases 16
    save 900 1
    save 300 10
    save 60 10000
    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes
    dbfilename dump.rdb
    dir /var/lib/redis
    slave-serve-stale-data yes
    slave-read-only yes
    repl-diskless-sync no
    repl-diskless-sync-delay 5
    repl-disable-tcp-nodelay no
    slave-priority 100
    requirepass changecan
    appendonly no
    appendfilename "appendonly.aof"
    appendfsync everysec
    no-appendfsync-on-rewrite no
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    aof-load-truncated yes
    lua-time-limit 5000
    slowlog-log-slower-than 10000
    slowlog-max-len 128
    latency-monitor-threshold 0
    notify-keyspace-events ""
    hash-max-ziplist-entries 512
    hash-max-ziplist-value 64
    list-max-ziplist-size -2
    list-compress-depth 0
    set-max-intset-entries 512
    zset-max-ziplist-entries 128
    zset-max-ziplist-value 64
    hll-sparse-max-bytes 3000
    activerehashing yes
    client-output-buffer-limit normal 0 0 0
    client-output-buffer-limit slave 256mb 64mb 60
    client-output-buffer-limit pubsub 32mb 8mb 60
    hz 10
    aof-rewrite-incremental-fsync yes
    
    [root@localhost playbooks]# cat template.yaml
    - hosts: 192.168.75.128
      remote_user: root
      tasks:
      - name: install config file
        template: src=/root/playbooks/redis.conf.j2 dest=/tmp/redis.conf
    
    [root@localhost playbooks]# ansible-playbook template.yaml
    执行yaml后,查看远程主机的IP地址正常传递到配置文件了
    

    2.9.3 예시 2 httpd 추가 감청 포트
    httpd 설정 을 수정 하여 호스트 목록/etc/ansible/hosts 의 변 수 를 설정 파일 에 전달 하여 원 격 호스트 httpd 에 감청 포트 8080 을 추가 합 니 다.
    [root@localhost ~]# cat /etc/ansible/hosts
    [websrvs]
    192.168.75.128
    
    [websrvs:vars]
    http_port=8080
    [root@localhost playbooks]# cat mylisten.conf 
    Listen {{ http_port }}
    [root@localhost playbooks]# cat httpd.yaml 
    - hosts: websrvs
      remote_user: root
      tasks:
      - name: install httpd
        yum: name=httpd state=latest
      - name: install config file
        template: src=/root/playbooks/mylisten.conf dest=/etc/httpd/conf.d/mylisten.conf
      - name: start httpd
        service: name=httpd state=started
    [root@localhost playbooks]# ansible-playbook httpd.yaml
    

    2.9.3 예시 3 nginx 설정 조정
    #从setup模块中取远程主机参数:
    CPU内核数:"ansible_processor_cores": 2, 
    CPU颗数:"ansible_processor_count": 2,
    #模板配置文件:files/nginx.conf.j2
    worker_processes {{ ansible_processor_vcpus }};
    listen {{ http_port }};
    #yaml文件
    - hosts: websrvs
      remote_user: root
      tasks:
      - name: install nginx
        yum: name=nginx state=present
      - name: install conf file
        template: src=files/nginx.conf.j2 dest=/etc/nginx/nginx.conf
        notify: restart nginx
        tags: instconf
        - name: start nginx service
        service: name=nginx state=started
        handlers:
        - name: restart nginx
        service: name=nginx state=restarted
    

    2.10 조건 테스트
    when 구문: task 에서 사용 합 니 다. jinja 2 의 문법 형식 은 다음 과 같 습 니 다. 운영 체제 가 redhat 에 httpd 를 설치 하고 데 비 안 이 되면 apache 2 를 설치 합 니 다.
    - hosts: websrvs
      remote_user: root
      tasks:
      - name: install httpd
        yum: name=httpd state=latest
        when: ansible_os_family == "Redhat"
      - name: install apache2
        apt: name=apache2 state=latest
        when: ansible_os_family == "Debian"
    

    2.11 순환: 교체, 반복 적 으로 수행 해 야 할 임무
    교체 항목 에 대한 인용, 고정 변 수 는 "item"입 니 다. 그 다음 task 에서 with 를 사용 해 야 합 니 다.items 교체 할 요소 목록 지정
    목록 방법: 문자열, 사전
    (다음 예: yum 이 여러 모듈 을 한꺼번에 설치 하 는 문제)
    - hosts: websrvs
      remote_user: root
      tasks:
      - name: install {{ item }} package
        yum: name={{ item }} state=latest
        with_items:
        - nginx
        - tomcat
        - mariadb-server
        - redis
    #新版本的ansible-playbook已经不支持在yum安装多个模块里使用的方式。
    #这么写在老版本还OK,但是在2.8以后,还这么写就会有错误:
    [DEPRECATION WARNING]: Invoking "yum" only once while using a loop via 
    squash_actions is deprecated. Instead of using a loop to supply multiple items 
    and specifying `name: "{{ item }}"`, please use `name: ['nginx', 'tomcat', 
    'mariadb-server', 'redis']` and remove the loop. This feature will be removed 
    in version 2.11. Deprecation warnings can be disabled by setting 
    deprecation_warnings=False in ansible.cfg.
    #[弃用警告]:只在通过squash_actions使用循环时调用“yum”一次是不赞成的。而不是如果使用循环提供多个项目并指定' name: ['nginx', 'tomcat', 'mariadb-server', 'redis']',请使用' name: "{{ item }}"' '并删除循环。这个特性将在2.11版本中删除。弃用的警告可以通过在ansible.cfg中设置deprecation_warnings=False来禁用。
    
    
    #【更改】上面的报错可以通过变量来传递(把item该为packages,并通过变量赋值来传递参数):
    - hosts: websrvs
      remote_user: root
      vars:
        packages:
          - nginx
          - tomcat
          - mariadb-server
          - redis
      tasks:
      - name: install "{{ packages }}" package
        yum: name={{ packages }} state=latest
        with_items: "{{ packages }}"
    

    3. ansible roles 역할
    3.1 역할 관련 설명
    roles 기본 저장 경로:
    #在/etc/ansible/ansible.cfg里面进行配置
    roles_path    = /etc/ansible/roles
    

    캐릭터 집합:
    roles/
        mysql/
        httpd/
        nginx/
        memcached/
    

    각 역할 은 특정한 등급 의 디 렉 터 리 구조 로 조직 된다.
    mysql/
        files/:     存放copy或script模块等调用的文件;
        templates/: template模块查找所需要的模板文件的目录;
        tasks/:     至少应该包含一个名为main.yaml的文件,其他的文件需要在此文件中通过include进行包含;
        handlers/: 至少应该包含一个名为main.yaml的文件,其他的文件需要在此文件中通过include进行包含;
        vars/:      至少应该包含一个名为main.yaml的文件,其他的文件需要在此文件中通过include进行包含;
        meta/:      至少应该包含一个名为main.yaml的文件,定义当前角色的特殊设定及其依赖关系,其他的文件需要在此文件中通过include进行包含;
        default/:   设定默认变量时使用此目录中的main.yaml文件。
    

    3.2 roles 예제 1:
    nginx 를 설치 하고 서 비 스 를 시작 하 며 프로필 을 수정 한 후 서 비 스 를 다시 시작 합 니 다. 기본 index. html 설정
    [root@localhost ~]# mkdir -pv /etc/ansible/roles/nginx/{files,templates,tasks,vars,handlers,meta,default}
    [root@localhost ~]# cat /etc/ansible/roles/nginx/tasks/main.yaml 
    - name: install nginx
      yum: name=nginx state=latest
      when: ansible_os_family == "RedHat"
    - name: install conf
      template: src=vhost1.conf.j2 dest=/etc/nginx/conf.d/vhost1.conf
      tags: conf
      notify: restart nginx
    - name: install site home diretory
      file: path={{ ngxroot }} state=directory
    - name: install index page
      copy: src=index.html dest={{ ngxroot }}/
    - name: start nginx
      service: name=nginx state=started
    
    [root@localhost ~]# cat /etc/ansible/roles/nginx/templates/vhost1.conf.j2 
    server {
    	listen 8080;
    	server_name {{ ansible_fqdn }};
    	location / {
    		root "/ngxdata/vhost1";
    	}
    }
    
    [root@localhost ~]# cat /etc/ansible/roles/nginx/handlers/main.yaml 
    - name: restart nginx
      service: name=nginx state=restarted
    
    [root@localhost ~]# cat /etc/ansible/roles/nginx/vars/main.yaml 
    ngxroot: /ngxdata/vhost1
    
    [root@localhost ~]# cat /etc/ansible/roles/nginx/files/index.html 
    

    Vhost1

    [root@localhost ~]# cat nginx.yaml - hosts: websrvs remote_user: root roles: - nginx [root@localhost ~]# ansible-playbook --syntax-check nginx.yaml [root@localhost ~]# ansible-playbook -C nginx.yaml [root@localhost ~]# ansible-playbook nginx.yaml

    좋은 웹페이지 즐겨찾기