====== Ansible ====== * http://www.ansible.com/ * https://docs.ansible.com/ * [[https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html|Ansible All modules]] * [[https://github.com/ansible/ansible-examples|ansible/ansible-examples: A few starter examples of ansible playbooks, to show features and how they work together. See http://galaxy.ansible.com for example roles from the Ansible community for deploying many popular applications.]] * [[https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html|Best Practices — Ansible Documentation]] * 자동화 툴 ===== Ubuntu PPA ===== * https://launchpad.net/~ansible/+archive/ubuntu/ansible sudo add-apt-repository ppa:ansible/ansible ===== AWS ===== * https://github.com/ansible/awx : Web UI ===== become ===== * ''become: yes'' 일 경우 ''sudo'' 로 명령을 실행한다. * 이때, 비밀번호를 받는 다양한 방법이 존재할 수 있는데, 일단 ''ansible-playbook''에 ''%%--ask-become-pass%%'' 옵션을 주면 최초 시작시 비밀번호를 물어본다. * 혹은 다음과 같이 ''ansible_become_pass'' 변수로 명령행에 지정할 수도 있다. (''user'' 생략가능) [[https://stackoverflow.com/questions/21870083/specify-sudo-password-for-ansible|Specify sudo password for Ansible]] ansible-playbook playbook.yml ... --user=username \ --extra-vars "ansible_become_pass=yourPassword" * 그런데,이 경우 비밀번호가 외부로 노출되므로 비밀번호를 ''read -s SUDO_PASSWORD'' 등으로 읽거나 환경변수에 지정하고서 다음과 같이 하면 명령 history 노출등에 방어가 된다. ansible-playbook playbook.yml ... \ --extra-vars="ansible_become_pass='{{ lookup('env', 'SUDO_PASSWORD') }}'" * [[linux:sudo|sudo]] ===== become_user ===== * 특정 사용자로 명령 실행하기. ''ansible-playbook'' 자체를 ''root'' 로 실행한다면 ''become'' 대신 ''become_user''를 사용해야 할듯. ===== Local 실행 ===== * [[https://gist.github.com/alces/caa3e7e5f46f9595f715f0f55eef65c1|How to run an Ansible playbook locally]] * 해당 playbook yml 이 Local 전용일 경우에는 다음 yml 설정으로 충분함. - name: playbook name hosts: localhost # 혹은 127.0.0.1 로도 작동했음. connection: local tasks: - name: blah.. blah.. # 실행 ansible-playbook playbook.yml ===== File 생성 ===== * [[https://www.mydailytutorials.com/ansible-create-files/|How to create files in Ansible - My Daily Tutorials]] * [[https://docs.ansible.com/ansible/latest/modules/copy_module.html|copy module]] * [[https://docs.ansible.com/ansible/latest/modules/file_module.html|file module]] tasks: - name: Ansible create file with content example copy: dest: "/Users/mdtutorials2/Documents/Ansible/remote_server.txt" content: "contents" mode: 0777 owner: mdtutorials2 ===== 환경변수 읽기 ===== * [[https://docs.ansible.com/ansible/latest/plugins/lookup/env.html|env – read the value of environment variables — Ansible Documentation]] - debug: msg="{{ lookup('env', 'HOME') }} is an environment variable" ===== 변수(var) 외부에 두고 include ===== * [[https://www.toptechskills.com/ansible-tutorials-courses/ansible-include-import-variables-tutorial-examples/|How to Include Variables in Ansible + Examples | TopTechSkills.com]] * ''vars_files'' : 외부 yml 파일의 key/value 쌍을 변수로 읽어들인다. 기본 경로는 현재 플레이북 경로이다. - name: blah blah.. hosts: ... vars_files: - "vars.yml" # file in the same directory tasks: ... * ''vars.yml'' # key/value 쌍. ubuntu_release: "{{ lookup('pipe', 'lsb_release -cs') }}" current_user: "{{ lookup('env', 'USER') }}" vagrant_version: 2.2.10 packer_version: 1.6.1 ... ===== playbook 을 윈해 환경변수 ===== * playbook 실행시 적용될 환경변수 지정 * https://stackoverflow.com/questions/27733511/how-to-set-linux-environment-variables-with-ansible - hosts: all roles: - php - nginx environment: MY_ENV_VARIABLE: whatever_value ===== 특정 Task 용 환경변수 ===== * 다른 태스크에는 적용안됨. tasks: - name: Echo my_env_var shell: "echo $MY_ENV_VARIABLE" environment: MY_ENV_VARIABLE: whatever_value ===== shell & command ===== * [[https://www.mydailytutorials.com/introduction-shell-command-module-ansible/|Introduction to Shell and Command Modules in Ansible - My Daily Tutorials]] * [[https://docs.ansible.com/ansible/latest/collections/ansible/builtin/command_module.html|ansible.builtin.command]] * ''command''는 명령만 실행할 뿐 셸을 띄우지 않기 때문에 환경변수 등이 주입이 안된다. * [[https://docs.ansible.com/ansible/latest/collections/ansible/builtin/shell_module.html|ansible.builtin.shell]] * 기본 ''/bin/sh'' 를 띄워 명령을 실행한다. [[linux:bash|Bash]] 등으로 강제로 바꿔야 올바로 작동하는 명령들도 있을 수 있으므로 그 때는 ''args.executable: /bin/bash''로 셸을 변경해줘야 한다. ===== apt repository ===== * [[https://linuxhint.com/manage_ubuntu_package_repositories_ppas_ansible/|Manage Ubuntu Package Repositories and PPAs Using Ansible – Linux Hint]] ===== 특정 태스크 지정 ===== * ''%%--start-at-task="태스크이름"%%'' : 해당 태스크 부터 실행 * ''%%--step%%'' : 실행여부 질문 ===== retries ===== * ''register'', ''until'', ''delay'' 와 함께 사용. * 현재의 ''retries'' 는 ''until''이 없으면 작동하지 않는다. ''until''에서 명백하게 성공 조건을 명시해야한다. * [[https://github.com/ansible/ansible/issues/20802|"retries" without "until": retry until success · Issue #20802]] : 성공시 자동으로 ''retries'' 종료 해달라는 이슈. PR 이 있으며, 머지될 가능성이 있음. ===== ansible-pull ===== * [[:git|git]] 리포지토리등에서 파일을 받아서 ansible-playbook 실행. * [[https://docs.ansible.com/ansible/latest/cli/ansible-pull.html|ansible-pull]] * [[https://medium.com/splunkuserdeveloperadministrator/using-ansible-pull-in-ansible-projects-ac04466643e8|Using Ansible Pull In Ansible Projects | by Vince Sesto | Splunk User Developer Administrator | Medium]] * 실행할 플레이북 파일명을 명시하지 않으면 기본적으로 저장소 최상위 디렉토리의 ''local.yml'' 파일을 실행한다. ansible-pull -U https://github.com/.../xxx.git ===== include / import ===== * [[https://docs.ansible.com/ansible/2.8/user_guide/playbooks_reuse.html|Creating Reusable Playbooks — Ansible Documentation]] * [[https://docs.ansible.com/ansible/2.8/user_guide/playbooks_reuse_includes.html#playbooks-reuse-includes|Including and Importing — Ansible Documentation]] * [[https://docs.ansible.com/ansible/2.8/modules/list_of_utilities_modules.html#utilities-modules|Utilities modules — Ansible Documentation]] * ''include*'' 는 동적(dynamic)이다. 일부 기능이 작동하지 않는다(''--start-at-task''같은). 실행시점 해석. * ''import*'' 는 정적(static)이다. 설정파일 읽을 때 해석. * [[https://stackoverflow.com/questions/58772082/can-i-include-multiple-tasks-in-include-tasks-from-tasks-main-yml|ansible - Can I include multiple tasks in include_tasks from tasks/main.yml? - Stack Overflow]] ===== Linux System Roles ===== * [[https://github.com/linux-system-roles|linux-system-roles]] * https://github.com/linux-system-roles ===== shell completion ===== * https://docs.ansible.com/ansible/devel/installation_guide/intro_installation.html#shell-completion sudo apt install python3-argcomplete * 아래 항목을 ''.bashrc'' 에 넣는다 배포판에 따라 ''register-python-argcomplete''(''3'' 제외)일 수도 있음. (전역 설정도 가능함) # 필히 "" 로 감싸야한다. eval "$(register-python-argcomplete3 ansible)" eval "$(register-python-argcomplete3 ansible-config)" eval "$(register-python-argcomplete3 ansible-console)" eval "$(register-python-argcomplete3 ansible-doc)" eval "$(register-python-argcomplete3 ansible-galaxy)" eval "$(register-python-argcomplete3 ansible-inventory)" eval "$(register-python-argcomplete3 ansible-playbook)" eval "$(register-python-argcomplete3 ansible-pull)" eval "$(register-python-argcomplete3 ansible-vault)" ===== lineinfile module ===== * [[https://docs.ansible.com/ansible/latest/collections/ansible/builtin/lineinfile_module.html|lineinfile module]] * 파일 내의 줄들을 관리한다. 내용을 추가하거나, 변경하거나. * [[linux:sed|Linux sed]] 대체. ===== ===== * [[https://docs.ansible.com/ansible/latest/collections/ansible/builtin/blockinfile_module.html|blockinfile module]] * 파일 내의 특정 블록을 추가,사제,변경한다. ===== replace module ===== * [[https://docs.ansible.com/ansible/latest/collections/ansible/builtin/replace_module.html|replace module]] * [[:regex|RegEx]]로 파일 내용 교체 ===== 참조 ===== * [[https://www.youtube.com/playlist?list=PLT98CRl2KxKEUHie1m24-wkyHpEsa4Y70|Getting started with Ansible - YouTube]] : 매우 쉽게 Ansible 설명. * [[http://knight76.tistory.com/1977|ansible tomcat]] * [[http://brownbears.tistory.com/358|Ansible이란?]] * [[https://skyoo2003.github.io/post/2017/11/14/ansible-module-develop|Ansible Module 개발하기 - 📚 Devlog in the SKY 📚]] * [[http://theeye.pe.kr/archives/2597|Ansible Playbook 정리 | 아이군의 블로그]] * [[https://www.ansible.com/blog/ansible-tips-and-tricks-dealing-with-unreliable-connections-and-services|Ansible Tips and Tricks: Dealing with Unreliable Connections and Services]] * [[https://www.lesstif.com/ansible/windows-ansible-95879887.html|Windows 에 Ansible 설치하기]]