Шаг – 2 Создание Jinja2 шаблона под названием squid.conf.j2
$ cat squid.conf.j2
Примеры возможных выводов данных:
acl mylan src ` nixcraft_vlan_lan_subnet ` acl SSL_ports port 443 acl CONNECT method CONNECT http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow localhost manager http_access deny manager http_access allow localhost http_access allow mylan http_access deny all http_port ` nixcraft_http_port ` tcp_outgoing_address ` nixcraft_cloud_server_ip ` cache_mem ` nixcraft_memory ` MB cache_dir diskd /var/spool/squid 1024 16 256 Q1=72 Q2=64 access_log daemon:/var/log/squid/access.log squid coredump_dir /var/spool/squid refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880 refresh_pattern . 0 20% 4320 forwarded_for delete via off forwarded_for off follow_x_forwarded_for deny all request_header_access X-Forwarded-For deny all
Examples
- name: Ensure SELinux is set to enforcing mode ansible.builtin.lineinfile: path: /etc/selinux/config regexp: '^SELINUX=' line: SELINUX=enforcing - name: Make sure group wheel is not in the sudoers configuration ansible.builtin.lineinfile: path: /etc/sudoers state: absent regexp: '^%wheel' - name: Replace a localhost entry with our own ansible.builtin.lineinfile: path: /etc/hosts regexp: '^127\.0\.0\.1' line: 127.0.1 localhost owner: root group: root mode: '0644' - name: Replace a localhost entry searching for a literal string to avoid escaping lineinfile: path: /etc/hosts search_string: '127.0.0.1' line: 127.0.1 localhost owner: root group: root mode: '0644' - name: Ensure the default Apache port is 8080 ansible.builtin.lineinfile: path: /etc/httpd/conf/httpd.conf regexp: '^Listen ' insertafter: '^#Listen ' line: Listen 8080 - name: Ensure php extension matches new pattern lineinfile: path: /etc/httpd/conf/httpd.conf search_string: '<FilesMatch ".php?$">' insertafter: '^\t<Location \/>\n' line: ' <FilesMatch ".php?$">' - name: Ensure we have our own comment added to /etc/services ansible.builtin.lineinfile: path: /etc/services regexp: '^# port for http' insertbefore: '^www.*80/tcp' line: '# port for http by default' - name: Add a line to a file if the file does not exist, without passing regexp ansible.builtin.lineinfile: path: /tmp/testfile line: 192.168.1.99 foo.lab.net foo create: yes - name: Ensure the JBoss memory settings are exactly as needed ansible.builtin.lineinfile: path: /opt/jboss-as/bin/standalone.conf regexp: '^(.*)Xms(\d+)m(.*)$' line: '\1Xms${xms}m\3' backrefs: yes - name: Validate the sudoers file before saving ansible.builtin.lineinfile: path: /etc/sudoers state: present regexp: '^%ADMIN ALL=' line: '%ADMIN ALL=(ALL) NOPASSWD: ALL' validate: /usr/sbin/visudo -cf %s - name: Use backrefs with alternative group syntax to avoid conflicts with variable values ansible.builtin.lineinfile: path: /tmp/config regexp: ^(host=).* line: \g<1>{{ hostname }} backrefs: yes
Authors
- Даниэль Хокка Закриссони (@dhozac)
- Ахти Китсик (@ahtik)
- Хосе Анхель Муньос (@imjoseangel)
2012–2018 Майкл ДеХан 2018–2021 Red Hat, Inc.Лицензируется по версии 3 Стандартной общественной лицензии GNU.https://docs.ansible.com/ansible/2.11/collections/ansible/builtin/lineinfile_module.html
Один, with_file
Предположим, что на вашем доступном хосте есть несколько файлов (примечание: это файл на доступном хосте, а не файл на удаленном целевом хосте), и вы хотите получить содержимое этих файлов, вы можете использовать ключевое слово with_file для цикла Получите содержимое этих файлов, примеры следующие:
Как показано в приведенном выше примере, мы определили список. В этом списке есть два пути к файлам, а именно «/testdir/testdir/a.log» и «/ opt / testfile», оба из которых находятся на доступном хосте. File, мы обработали этот список с помощью ключевого слова with_file, затем мы выполняем вышеприведенную книгу воспроизведения, чтобы увидеть, можно ли получить соответствующее содержимое файла.После выполнения приведенного выше примера модуль отладки выводит следующую информацию:
Как показано выше, playbook в приведенном выше примере успешно получил содержимое каждого файла в списке файлов, и мы можем обнаружить, что целевым хостом playbook в приведенном выше примере является testB, а testB не является доступным хостом. Это удаленный целевой хост. В моей тестовой среде server4 является доступным хостом. Таким образом, мы можем обнаружить, что независимо от того, кто является целевым хостом, мы можем получить содержимое файла на доступном хосте с помощью ключевого слова with_file.
Как написать однострочный контент на удаленном сервере и создать файл
Синтаксис является довольно таки простым:
- copy: content: "your config line here" dest: "/path/to/file"
Согласно документации:
При использовании вместо ‘src’, устанавливается содержимое файла непосредственно на указанное значение. Это подходит только для простых значений, для чего-либо сложного или требующего форматирование, пожалуйста, переключитесь на модуль шаблона (template).
Вот образец файла create-file.yml:
# create a file to force apt-get to use IPv4 only - copy: content: "Acquire::ForceIPv4 true;" dest: "/etc/apt/apt.conf.d/1000-force-ipv4-transport"
Где,
- content: «Acquire::ForceIPv4 true;» – устанавливает содержимое файла непосредственно в указанную строку;
- dest: «/etc/apt/apt.conf.d/1000-force-ipv4-transport » – устанавливает удаленный абсолютный путь, где файл должен быть скопирован/создан;
- backup: yes – удаленный абсолютный путь, куда должен быть скопирован файл;
- owner: root – задает пользователя, которому должен принадлежать файл/директория;
- group: root – задает группу, которой должен принадлежать файл/директория;
- mode: 0600 – задает разрешение файла, используя восьмеричные числа.
Итак, вот пример файла инвентаризации:
$ cat ~/hosts 192.168.2.45 ansible_user=root 192.168.2.46 ansible_user=root
Вот пример обновленного файла create-file.yml специально для вас:
--- # same config file - hosts: kvmhost remote_user: root tasks: # create a new file on each host - copy: content: "Acquire::ForceIPv4 true;" dest: "/etc/apt/apt.conf.d/1000-force-ipv4-transport" backup: yes owner: root group: root mode: 0644 # run apt-get too using IPv4 - apt: update_cache: yes cache_valid_time: 3600 upgrade: dist
Вы можете запускать его как обычно:
$ ANSIBLE_HOSTS=~/hosts; ansible-playbook create-file.yml
Примеры возможных выводов данных:
Рисунок 01: Playbook в действии
11 ответов
Лучший ответ
Решенный ответ: чтобы скопировать содержимое каталога в другой каталог, я использую следующее:
Он копирует оба элемента в другой каталог. В этом примере один из элементов является каталогом, а другой — нет. Работает отлично.
30
Jay
2 Янв 2018 в 17:42
Как скопировать каталог и поддиректории и файлы с сервера ansible на удаленный хост
namasivayam.cse
21 Июл 2020 в 09:34
Я тоже занимался целый день! и наконец нашел решение в команде вместо copy: или command: , как показано ниже:
Строго уведомить: 1. src_path и des_path заканчиваются символом 2. в оболочке команда src_path заканчивается , которая показывает все содержимое каталога 3. Я использовал свое имя-удаленного-сервера как в hosts:, так и в командной оболочке. раздел jenkins вместо спецификатора в playbook.
Я думаю, это хороший совет запустить команду ниже в разделе Execute Shell в jenkins:
2
foad322
24 Май 2018 в 08:20
Чтобы рекурсивно скопировать содержимое папки и убедиться, что задача остается идемпотентной, я обычно делаю это следующим образом:
Обратной стороной является то, что команда find по-прежнему отображается как измененная.
4
dvanrensburg
16 Авг 2016 в 14:01
Самым простым решением, которое я нашел для копирования содержимого папки без копирования самой папки, является использование следующего:
Это решает следующий вопрос @ surfer190:
— это глобус оболочки, поскольку он полагается на вашу оболочку для перечисления всех файлов в папке перед запуском , в то время как напрямую инструктирует { {X3}}, чтобы получить содержимое каталога (см. https://askubuntu.com/questions/86822/how-can-i-copy-the-contents-of-a-folder-to-another-folder-in-a -different-directo )
10
fractalic
20 Ноя 2017 в 04:05
Вы можете использовать модуль синхронизировать. Пример из документации:
Это имеет дополнительное преимущество в том, что это будет более эффективно для больших / многих файлов.
48
Aidan Feldman
28 Авг 2017 в 04:55
Это я нашел идеальное решение для копирования файла с сервера Ansible на удаленный.
копирование файла yaml
Dilip
7 Дек 2017 в 09:22
Чтобы скопировать содержимое каталога в другой каталог, вы можете использовать модуль ansibles :
Из :
Если (src!) Path — это каталог, он копируется рекурсивно … … если путь заканчивается на «/», в место назначения копируется только внутреннее содержимое этого каталога . … если он не заканчивается на «/», копируется сам каталог со всем содержимым.
1
andymel
18 Июн 2020 в 09:02
Ниже работал у меня,
1
Sakharam Thorat
25 Сен 2017 в 12:27
Я нашел обходной путь для рекурсивного копирования с удаленного на удаленный:
2
agrimal
23 Фев 2018 в 01:11
Модуль Ansible Copy по умолчанию копирует файлы / каталоги с управляющей машины на удаленную. Если вы хотите скопировать файлы / каталоги на удаленный компьютер и у вас установлен Ansible 2.0 , установите для значение
31
helloV
13 Окт 2020 в 15:46
Два, with_fileglob
Поняв ключевое слово with_file, давайте поговорим о другом ключевом слове, которым является with_fileglob.
«with_file» используется для получения содержимого файла, а «with_fileglob» используется для сопоставления имени файла. Мы можем использовать ключевое слово «with_fileglob» для сопоставления имени файла, которое соответствует шаблону в указанном каталоге, «with_file» и «with_fileglob» «Есть также те же места, все они работают с файлами доступного хоста, а не целевого хоста. Затем давайте посмотрим на небольшой пример« with_fileglob », пример выглядит следующим образом:
Из возвращенной информации мы можем видеть, что «/ testdir /» в playbook в приведенном выше примере соответствует в общей сложности 5 файлам, поэтому есть ли только эти 5 файлов в каталоге «/ testdir», мы Для подтверждения проверьте файлы в каталоге «/ testdir» следующим образом: Как видно из приведенной выше информации, в каталоге «/ testdir» всего шесть элементов. Два элемента — это каталоги, а четыре элемента — файлы
Предыдущая книга воспроизведения соответствует только файлам, не включая Каталог, поэтому нам нужно обратить внимание на то, что «with_fileglob» будет соответствовать только файлам в указанном каталоге, но не будет соответствовать каталогам в указанном каталоге
В playbook в приведенном выше примере мы указали только один путь. Конечно, мы также можем указать несколько путей. Пример playbook выглядит следующим образом:
Видно, что те, которые не соответствуют правилу подстановочных знаков, не будут возвращены.